diff --git a/cranelift/codegen/isle_generated_code/clif_opt.isle b/cranelift/codegen/isle_generated_code/clif_opt.isle deleted file mode 100644 index 97a87d0b930f..000000000000 --- a/cranelift/codegen/isle_generated_code/clif_opt.isle +++ /dev/null @@ -1,1917 +0,0 @@ -;; GENERATED BY `gen_isle`. DO NOT EDIT!!! -;; -;; This ISLE file defines all the external type declarations for Cranelift's -;; data structures that ISLE will process, such as `InstructionData` and -;; `Opcode`. - -;;;; Extern type declarations for immediates ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -(type Block (primitive Block)) -(type Constant (primitive Constant)) -(type DynamicStackSlot (primitive DynamicStackSlot)) -(type FuncRef (primitive FuncRef)) -(type GlobalValue (primitive GlobalValue)) -(type Ieee32 (primitive Ieee32)) -(type Ieee64 (primitive Ieee64)) -(type Imm64 (primitive Imm64)) -(type Immediate (primitive Immediate)) -(type JumpTable (primitive JumpTable)) -(type MemFlags (primitive MemFlags)) -(type Offset32 (primitive Offset32)) -(type SigRef (primitive SigRef)) -(type StackSlot (primitive StackSlot)) -(type Table (primitive Table)) -(type Uimm8 (primitive Uimm8)) - -;;;; Enumerated Immediate: AtomicRmwOp ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -(type AtomicRmwOp extern - (enum - Add - And - Nand - Or - Smax - Smin - Sub - Umax - Umin - Xchg - Xor - ) -) - -;;;; Enumerated Immediate: FloatCC ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -(type FloatCC extern - (enum - Equal - GreaterThan - GreaterThanOrEqual - LessThan - LessThanOrEqual - NotEqual - Ordered - OrderedNotEqual - Unordered - UnorderedOrEqual - UnorderedOrGreaterThan - UnorderedOrGreaterThanOrEqual - UnorderedOrLessThan - UnorderedOrLessThanOrEqual - ) -) - -;;;; Enumerated Immediate: IntCC ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -(type IntCC extern - (enum - Equal - NotEqual - SignedGreaterThan - SignedGreaterThanOrEqual - SignedLessThan - SignedLessThanOrEqual - UnsignedGreaterThan - UnsignedGreaterThanOrEqual - UnsignedLessThan - UnsignedLessThanOrEqual - ) -) - -;;;; Enumerated Immediate: TrapCode ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -(type TrapCode extern - (enum - HeapOutOfBounds - IntegerDivisionByZero - IntegerOverflow - StackOverflow - ) -) - -;;;; Value Arrays ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -;; ISLE representation of `[Value; 2]`. -(type ValueArray2 extern (enum)) - -(decl value_array_2 (Value Value) ValueArray2) -(extern constructor value_array_2 pack_value_array_2) -(extern extractor infallible value_array_2 unpack_value_array_2) - -;; ISLE representation of `[Value; 3]`. -(type ValueArray3 extern (enum)) - -(decl value_array_3 (Value Value Value) ValueArray3) -(extern constructor value_array_3 pack_value_array_3) -(extern extractor infallible value_array_3 unpack_value_array_3) - -;;;; `Opcode` ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -(type Opcode extern - (enum - Jump - Brz - Brnz - BrTable - Debugtrap - Trap - Trapz - ResumableTrap - Trapnz - ResumableTrapnz - Return - Call - CallIndirect - FuncAddr - Splat - Swizzle - Insertlane - Extractlane - Smin - Umin - Smax - Umax - AvgRound - UaddSat - SaddSat - UsubSat - SsubSat - Load - Store - Uload8 - Sload8 - Istore8 - Uload16 - Sload16 - Istore16 - Uload32 - Sload32 - Istore32 - Uload8x8 - Sload8x8 - Uload16x4 - Sload16x4 - Uload32x2 - Sload32x2 - StackLoad - StackStore - StackAddr - DynamicStackLoad - DynamicStackStore - DynamicStackAddr - GlobalValue - SymbolValue - TlsValue - GetPinnedReg - SetPinnedReg - GetFramePointer - GetStackPointer - GetReturnAddress - TableAddr - Iconst - F32const - F64const - Vconst - Shuffle - Null - Nop - Select - SelectSpectreGuard - Bitselect - Vselect - VanyTrue - VallTrue - VhighBits - Icmp - IcmpImm - Iadd - Isub - Ineg - Iabs - Imul - Umulhi - Smulhi - SqmulRoundSat - Udiv - Sdiv - Urem - Srem - IaddImm - ImulImm - UdivImm - SdivImm - UremImm - SremImm - IrsubImm - IaddCin - IaddCout - IaddCarry - UaddOverflowTrap - IsubBin - IsubBout - IsubBorrow - Band - Bor - Bxor - Bnot - BandNot - BorNot - BxorNot - BandImm - BorImm - BxorImm - Rotl - Rotr - RotlImm - RotrImm - Ishl - Ushr - Sshr - IshlImm - UshrImm - SshrImm - Bitrev - Clz - Cls - Ctz - Bswap - Popcnt - Fcmp - Fadd - Fsub - Fmul - Fdiv - Sqrt - Fma - Fneg - Fabs - Fcopysign - Fmin - FminPseudo - Fmax - FmaxPseudo - Ceil - Floor - Trunc - Nearest - IsNull - IsInvalid - Bitcast - ScalarToVector - Bmask - Ireduce - Snarrow - Unarrow - Uunarrow - SwidenLow - SwidenHigh - UwidenLow - UwidenHigh - IaddPairwise - WideningPairwiseDotProductS - Uextend - Sextend - Fpromote - Fdemote - Fvdemote - FvpromoteLow - FcvtToUint - FcvtToSint - FcvtToUintSat - FcvtToSintSat - FcvtFromUint - FcvtFromSint - FcvtLowFromSint - Isplit - Iconcat - AtomicRmw - AtomicCas - AtomicLoad - AtomicStore - Fence - ExtractVector - ) -) - -;;;; `InstructionData` ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -(type InstructionData extern - (enum - (AtomicCas (opcode Opcode) (args ValueArray3) (flags MemFlags)) - (AtomicRmw (opcode Opcode) (args ValueArray2) (flags MemFlags) (op AtomicRmwOp)) - (Binary (opcode Opcode) (args ValueArray2)) - (BinaryImm64 (opcode Opcode) (arg Value) (imm Imm64)) - (BinaryImm8 (opcode Opcode) (arg Value) (imm Uimm8)) - (Branch (opcode Opcode) (args ValueList) (destination Block)) - (BranchTable (opcode Opcode) (arg Value) (destination Block) (table JumpTable)) - (Call (opcode Opcode) (args ValueList) (func_ref FuncRef)) - (CallIndirect (opcode Opcode) (args ValueList) (sig_ref SigRef)) - (CondTrap (opcode Opcode) (arg Value) (code TrapCode)) - (DynamicStackLoad (opcode Opcode) (dynamic_stack_slot DynamicStackSlot)) - (DynamicStackStore (opcode Opcode) (arg Value) (dynamic_stack_slot DynamicStackSlot)) - (FloatCompare (opcode Opcode) (args ValueArray2) (cond FloatCC)) - (FuncAddr (opcode Opcode) (func_ref FuncRef)) - (IntAddTrap (opcode Opcode) (args ValueArray2) (code TrapCode)) - (IntCompare (opcode Opcode) (args ValueArray2) (cond IntCC)) - (IntCompareImm (opcode Opcode) (arg Value) (cond IntCC) (imm Imm64)) - (Jump (opcode Opcode) (args ValueList) (destination Block)) - (Load (opcode Opcode) (arg Value) (flags MemFlags) (offset Offset32)) - (LoadNoOffset (opcode Opcode) (arg Value) (flags MemFlags)) - (MultiAry (opcode Opcode) (args ValueList)) - (NullAry (opcode Opcode)) - (Shuffle (opcode Opcode) (args ValueArray2) (imm Immediate)) - (StackLoad (opcode Opcode) (stack_slot StackSlot) (offset Offset32)) - (StackStore (opcode Opcode) (arg Value) (stack_slot StackSlot) (offset Offset32)) - (Store (opcode Opcode) (args ValueArray2) (flags MemFlags) (offset Offset32)) - (StoreNoOffset (opcode Opcode) (args ValueArray2) (flags MemFlags)) - (TableAddr (opcode Opcode) (arg Value) (table Table) (offset Offset32)) - (Ternary (opcode Opcode) (args ValueArray3)) - (TernaryImm8 (opcode Opcode) (args ValueArray2) (imm Uimm8)) - (Trap (opcode Opcode) (code TrapCode)) - (Unary (opcode Opcode) (arg Value)) - (UnaryConst (opcode Opcode) (constant_handle Constant)) - (UnaryGlobalValue (opcode Opcode) (global_value GlobalValue)) - (UnaryIeee32 (opcode Opcode) (imm Ieee32)) - (UnaryIeee64 (opcode Opcode) (imm Ieee64)) - (UnaryImm (opcode Opcode) (imm Imm64)) - ) -) - -;;;; Extracting Opcode, Operands, and Immediates from `InstructionData` ;;;;;;;; - -(decl br_table (Type Value Block JumpTable) Value) -(extractor - (br_table ty x block JT) - (inst_data ty (InstructionData.BranchTable (Opcode.BrTable) x block JT)) -) -(rule (br_table ty x block JT) - (make_inst ty (InstructionData.BranchTable (Opcode.BrTable) x block JT)) -) - -(decl debugtrap (Type ) Value) -(extractor - (debugtrap ty ) - (inst_data ty (InstructionData.NullAry (Opcode.Debugtrap))) -) -(rule (debugtrap ty ) - (make_inst ty (InstructionData.NullAry (Opcode.Debugtrap))) -) - -(decl trap (Type TrapCode) Value) -(extractor - (trap ty code) - (inst_data ty (InstructionData.Trap (Opcode.Trap) code)) -) -(rule (trap ty code) - (make_inst ty (InstructionData.Trap (Opcode.Trap) code)) -) - -(decl trapz (Type Value TrapCode) Value) -(extractor - (trapz ty c code) - (inst_data ty (InstructionData.CondTrap (Opcode.Trapz) c code)) -) -(rule (trapz ty c code) - (make_inst ty (InstructionData.CondTrap (Opcode.Trapz) c code)) -) - -(decl resumable_trap (Type TrapCode) Value) -(extractor - (resumable_trap ty code) - (inst_data ty (InstructionData.Trap (Opcode.ResumableTrap) code)) -) -(rule (resumable_trap ty code) - (make_inst ty (InstructionData.Trap (Opcode.ResumableTrap) code)) -) - -(decl trapnz (Type Value TrapCode) Value) -(extractor - (trapnz ty c code) - (inst_data ty (InstructionData.CondTrap (Opcode.Trapnz) c code)) -) -(rule (trapnz ty c code) - (make_inst ty (InstructionData.CondTrap (Opcode.Trapnz) c code)) -) - -(decl resumable_trapnz (Type Value TrapCode) Value) -(extractor - (resumable_trapnz ty c code) - (inst_data ty (InstructionData.CondTrap (Opcode.ResumableTrapnz) c code)) -) -(rule (resumable_trapnz ty c code) - (make_inst ty (InstructionData.CondTrap (Opcode.ResumableTrapnz) c code)) -) - -(decl func_addr (Type FuncRef) Value) -(extractor - (func_addr ty FN) - (inst_data ty (InstructionData.FuncAddr (Opcode.FuncAddr) FN)) -) -(rule (func_addr ty FN) - (make_inst ty (InstructionData.FuncAddr (Opcode.FuncAddr) FN)) -) - -(decl splat (Type Value) Value) -(extractor - (splat ty x) - (inst_data ty (InstructionData.Unary (Opcode.Splat) x)) -) -(rule (splat ty x) - (make_inst ty (InstructionData.Unary (Opcode.Splat) x)) -) - -(decl swizzle (Type Value Value) Value) -(extractor - (swizzle ty x y) - (inst_data ty (InstructionData.Binary (Opcode.Swizzle) (value_array_2 x y))) -) -(rule (swizzle ty x y) - (make_inst ty (InstructionData.Binary (Opcode.Swizzle) (value_array_2_ctor x y))) -) - -(decl insertlane (Type Value Value Uimm8) Value) -(extractor - (insertlane ty x y Idx) - (inst_data ty (InstructionData.TernaryImm8 (Opcode.Insertlane) (value_array_2 x y) Idx)) -) -(rule (insertlane ty x y Idx) - (make_inst ty (InstructionData.TernaryImm8 (Opcode.Insertlane) (value_array_2_ctor x y) Idx)) -) - -(decl extractlane (Type Value Uimm8) Value) -(extractor - (extractlane ty x Idx) - (inst_data ty (InstructionData.BinaryImm8 (Opcode.Extractlane) x Idx)) -) -(rule (extractlane ty x Idx) - (make_inst ty (InstructionData.BinaryImm8 (Opcode.Extractlane) x Idx)) -) - -(decl smin (Type Value Value) Value) -(extractor - (smin ty x y) - (inst_data ty (InstructionData.Binary (Opcode.Smin) (value_array_2 x y))) -) -(rule (smin ty x y) - (make_inst ty (InstructionData.Binary (Opcode.Smin) (value_array_2_ctor x y))) -) - -(decl umin (Type Value Value) Value) -(extractor - (umin ty x y) - (inst_data ty (InstructionData.Binary (Opcode.Umin) (value_array_2 x y))) -) -(rule (umin ty x y) - (make_inst ty (InstructionData.Binary (Opcode.Umin) (value_array_2_ctor x y))) -) - -(decl smax (Type Value Value) Value) -(extractor - (smax ty x y) - (inst_data ty (InstructionData.Binary (Opcode.Smax) (value_array_2 x y))) -) -(rule (smax ty x y) - (make_inst ty (InstructionData.Binary (Opcode.Smax) (value_array_2_ctor x y))) -) - -(decl umax (Type Value Value) Value) -(extractor - (umax ty x y) - (inst_data ty (InstructionData.Binary (Opcode.Umax) (value_array_2 x y))) -) -(rule (umax ty x y) - (make_inst ty (InstructionData.Binary (Opcode.Umax) (value_array_2_ctor x y))) -) - -(decl avg_round (Type Value Value) Value) -(extractor - (avg_round ty x y) - (inst_data ty (InstructionData.Binary (Opcode.AvgRound) (value_array_2 x y))) -) -(rule (avg_round ty x y) - (make_inst ty (InstructionData.Binary (Opcode.AvgRound) (value_array_2_ctor x y))) -) - -(decl uadd_sat (Type Value Value) Value) -(extractor - (uadd_sat ty x y) - (inst_data ty (InstructionData.Binary (Opcode.UaddSat) (value_array_2 x y))) -) -(rule (uadd_sat ty x y) - (make_inst ty (InstructionData.Binary (Opcode.UaddSat) (value_array_2_ctor x y))) -) - -(decl sadd_sat (Type Value Value) Value) -(extractor - (sadd_sat ty x y) - (inst_data ty (InstructionData.Binary (Opcode.SaddSat) (value_array_2 x y))) -) -(rule (sadd_sat ty x y) - (make_inst ty (InstructionData.Binary (Opcode.SaddSat) (value_array_2_ctor x y))) -) - -(decl usub_sat (Type Value Value) Value) -(extractor - (usub_sat ty x y) - (inst_data ty (InstructionData.Binary (Opcode.UsubSat) (value_array_2 x y))) -) -(rule (usub_sat ty x y) - (make_inst ty (InstructionData.Binary (Opcode.UsubSat) (value_array_2_ctor x y))) -) - -(decl ssub_sat (Type Value Value) Value) -(extractor - (ssub_sat ty x y) - (inst_data ty (InstructionData.Binary (Opcode.SsubSat) (value_array_2 x y))) -) -(rule (ssub_sat ty x y) - (make_inst ty (InstructionData.Binary (Opcode.SsubSat) (value_array_2_ctor x y))) -) - -(decl load (Type MemFlags Value Offset32) Value) -(extractor - (load ty MemFlags p Offset) - (inst_data ty (InstructionData.Load (Opcode.Load) p MemFlags Offset)) -) -(rule (load ty MemFlags p Offset) - (make_inst ty (InstructionData.Load (Opcode.Load) p MemFlags Offset)) -) - -(decl store (Type MemFlags Value Value Offset32) Value) -(extractor - (store ty MemFlags x p Offset) - (inst_data ty (InstructionData.Store (Opcode.Store) (value_array_2 x p) MemFlags Offset)) -) -(rule (store ty MemFlags x p Offset) - (make_inst ty (InstructionData.Store (Opcode.Store) (value_array_2_ctor x p) MemFlags Offset)) -) - -(decl uload8 (Type MemFlags Value Offset32) Value) -(extractor - (uload8 ty MemFlags p Offset) - (inst_data ty (InstructionData.Load (Opcode.Uload8) p MemFlags Offset)) -) -(rule (uload8 ty MemFlags p Offset) - (make_inst ty (InstructionData.Load (Opcode.Uload8) p MemFlags Offset)) -) - -(decl sload8 (Type MemFlags Value Offset32) Value) -(extractor - (sload8 ty MemFlags p Offset) - (inst_data ty (InstructionData.Load (Opcode.Sload8) p MemFlags Offset)) -) -(rule (sload8 ty MemFlags p Offset) - (make_inst ty (InstructionData.Load (Opcode.Sload8) p MemFlags Offset)) -) - -(decl istore8 (Type MemFlags Value Value Offset32) Value) -(extractor - (istore8 ty MemFlags x p Offset) - (inst_data ty (InstructionData.Store (Opcode.Istore8) (value_array_2 x p) MemFlags Offset)) -) -(rule (istore8 ty MemFlags x p Offset) - (make_inst ty (InstructionData.Store (Opcode.Istore8) (value_array_2_ctor x p) MemFlags Offset)) -) - -(decl uload16 (Type MemFlags Value Offset32) Value) -(extractor - (uload16 ty MemFlags p Offset) - (inst_data ty (InstructionData.Load (Opcode.Uload16) p MemFlags Offset)) -) -(rule (uload16 ty MemFlags p Offset) - (make_inst ty (InstructionData.Load (Opcode.Uload16) p MemFlags Offset)) -) - -(decl sload16 (Type MemFlags Value Offset32) Value) -(extractor - (sload16 ty MemFlags p Offset) - (inst_data ty (InstructionData.Load (Opcode.Sload16) p MemFlags Offset)) -) -(rule (sload16 ty MemFlags p Offset) - (make_inst ty (InstructionData.Load (Opcode.Sload16) p MemFlags Offset)) -) - -(decl istore16 (Type MemFlags Value Value Offset32) Value) -(extractor - (istore16 ty MemFlags x p Offset) - (inst_data ty (InstructionData.Store (Opcode.Istore16) (value_array_2 x p) MemFlags Offset)) -) -(rule (istore16 ty MemFlags x p Offset) - (make_inst ty (InstructionData.Store (Opcode.Istore16) (value_array_2_ctor x p) MemFlags Offset)) -) - -(decl uload32 (Type MemFlags Value Offset32) Value) -(extractor - (uload32 ty MemFlags p Offset) - (inst_data ty (InstructionData.Load (Opcode.Uload32) p MemFlags Offset)) -) -(rule (uload32 ty MemFlags p Offset) - (make_inst ty (InstructionData.Load (Opcode.Uload32) p MemFlags Offset)) -) - -(decl sload32 (Type MemFlags Value Offset32) Value) -(extractor - (sload32 ty MemFlags p Offset) - (inst_data ty (InstructionData.Load (Opcode.Sload32) p MemFlags Offset)) -) -(rule (sload32 ty MemFlags p Offset) - (make_inst ty (InstructionData.Load (Opcode.Sload32) p MemFlags Offset)) -) - -(decl istore32 (Type MemFlags Value Value Offset32) Value) -(extractor - (istore32 ty MemFlags x p Offset) - (inst_data ty (InstructionData.Store (Opcode.Istore32) (value_array_2 x p) MemFlags Offset)) -) -(rule (istore32 ty MemFlags x p Offset) - (make_inst ty (InstructionData.Store (Opcode.Istore32) (value_array_2_ctor x p) MemFlags Offset)) -) - -(decl uload8x8 (Type MemFlags Value Offset32) Value) -(extractor - (uload8x8 ty MemFlags p Offset) - (inst_data ty (InstructionData.Load (Opcode.Uload8x8) p MemFlags Offset)) -) -(rule (uload8x8 ty MemFlags p Offset) - (make_inst ty (InstructionData.Load (Opcode.Uload8x8) p MemFlags Offset)) -) - -(decl sload8x8 (Type MemFlags Value Offset32) Value) -(extractor - (sload8x8 ty MemFlags p Offset) - (inst_data ty (InstructionData.Load (Opcode.Sload8x8) p MemFlags Offset)) -) -(rule (sload8x8 ty MemFlags p Offset) - (make_inst ty (InstructionData.Load (Opcode.Sload8x8) p MemFlags Offset)) -) - -(decl uload16x4 (Type MemFlags Value Offset32) Value) -(extractor - (uload16x4 ty MemFlags p Offset) - (inst_data ty (InstructionData.Load (Opcode.Uload16x4) p MemFlags Offset)) -) -(rule (uload16x4 ty MemFlags p Offset) - (make_inst ty (InstructionData.Load (Opcode.Uload16x4) p MemFlags Offset)) -) - -(decl sload16x4 (Type MemFlags Value Offset32) Value) -(extractor - (sload16x4 ty MemFlags p Offset) - (inst_data ty (InstructionData.Load (Opcode.Sload16x4) p MemFlags Offset)) -) -(rule (sload16x4 ty MemFlags p Offset) - (make_inst ty (InstructionData.Load (Opcode.Sload16x4) p MemFlags Offset)) -) - -(decl uload32x2 (Type MemFlags Value Offset32) Value) -(extractor - (uload32x2 ty MemFlags p Offset) - (inst_data ty (InstructionData.Load (Opcode.Uload32x2) p MemFlags Offset)) -) -(rule (uload32x2 ty MemFlags p Offset) - (make_inst ty (InstructionData.Load (Opcode.Uload32x2) p MemFlags Offset)) -) - -(decl sload32x2 (Type MemFlags Value Offset32) Value) -(extractor - (sload32x2 ty MemFlags p Offset) - (inst_data ty (InstructionData.Load (Opcode.Sload32x2) p MemFlags Offset)) -) -(rule (sload32x2 ty MemFlags p Offset) - (make_inst ty (InstructionData.Load (Opcode.Sload32x2) p MemFlags Offset)) -) - -(decl stack_load (Type StackSlot Offset32) Value) -(extractor - (stack_load ty SS Offset) - (inst_data ty (InstructionData.StackLoad (Opcode.StackLoad) SS Offset)) -) -(rule (stack_load ty SS Offset) - (make_inst ty (InstructionData.StackLoad (Opcode.StackLoad) SS Offset)) -) - -(decl stack_store (Type Value StackSlot Offset32) Value) -(extractor - (stack_store ty x SS Offset) - (inst_data ty (InstructionData.StackStore (Opcode.StackStore) x SS Offset)) -) -(rule (stack_store ty x SS Offset) - (make_inst ty (InstructionData.StackStore (Opcode.StackStore) x SS Offset)) -) - -(decl stack_addr (Type StackSlot Offset32) Value) -(extractor - (stack_addr ty SS Offset) - (inst_data ty (InstructionData.StackLoad (Opcode.StackAddr) SS Offset)) -) -(rule (stack_addr ty SS Offset) - (make_inst ty (InstructionData.StackLoad (Opcode.StackAddr) SS Offset)) -) - -(decl dynamic_stack_load (Type DynamicStackSlot) Value) -(extractor - (dynamic_stack_load ty DSS) - (inst_data ty (InstructionData.DynamicStackLoad (Opcode.DynamicStackLoad) DSS)) -) -(rule (dynamic_stack_load ty DSS) - (make_inst ty (InstructionData.DynamicStackLoad (Opcode.DynamicStackLoad) DSS)) -) - -(decl dynamic_stack_store (Type Value DynamicStackSlot) Value) -(extractor - (dynamic_stack_store ty x DSS) - (inst_data ty (InstructionData.DynamicStackStore (Opcode.DynamicStackStore) x DSS)) -) -(rule (dynamic_stack_store ty x DSS) - (make_inst ty (InstructionData.DynamicStackStore (Opcode.DynamicStackStore) x DSS)) -) - -(decl dynamic_stack_addr (Type DynamicStackSlot) Value) -(extractor - (dynamic_stack_addr ty DSS) - (inst_data ty (InstructionData.DynamicStackLoad (Opcode.DynamicStackAddr) DSS)) -) -(rule (dynamic_stack_addr ty DSS) - (make_inst ty (InstructionData.DynamicStackLoad (Opcode.DynamicStackAddr) DSS)) -) - -(decl global_value (Type GlobalValue) Value) -(extractor - (global_value ty GV) - (inst_data ty (InstructionData.UnaryGlobalValue (Opcode.GlobalValue) GV)) -) -(rule (global_value ty GV) - (make_inst ty (InstructionData.UnaryGlobalValue (Opcode.GlobalValue) GV)) -) - -(decl symbol_value (Type GlobalValue) Value) -(extractor - (symbol_value ty GV) - (inst_data ty (InstructionData.UnaryGlobalValue (Opcode.SymbolValue) GV)) -) -(rule (symbol_value ty GV) - (make_inst ty (InstructionData.UnaryGlobalValue (Opcode.SymbolValue) GV)) -) - -(decl tls_value (Type GlobalValue) Value) -(extractor - (tls_value ty GV) - (inst_data ty (InstructionData.UnaryGlobalValue (Opcode.TlsValue) GV)) -) -(rule (tls_value ty GV) - (make_inst ty (InstructionData.UnaryGlobalValue (Opcode.TlsValue) GV)) -) - -(decl get_pinned_reg (Type ) Value) -(extractor - (get_pinned_reg ty ) - (inst_data ty (InstructionData.NullAry (Opcode.GetPinnedReg))) -) -(rule (get_pinned_reg ty ) - (make_inst ty (InstructionData.NullAry (Opcode.GetPinnedReg))) -) - -(decl set_pinned_reg (Type Value) Value) -(extractor - (set_pinned_reg ty addr) - (inst_data ty (InstructionData.Unary (Opcode.SetPinnedReg) addr)) -) -(rule (set_pinned_reg ty addr) - (make_inst ty (InstructionData.Unary (Opcode.SetPinnedReg) addr)) -) - -(decl get_frame_pointer (Type ) Value) -(extractor - (get_frame_pointer ty ) - (inst_data ty (InstructionData.NullAry (Opcode.GetFramePointer))) -) -(rule (get_frame_pointer ty ) - (make_inst ty (InstructionData.NullAry (Opcode.GetFramePointer))) -) - -(decl get_stack_pointer (Type ) Value) -(extractor - (get_stack_pointer ty ) - (inst_data ty (InstructionData.NullAry (Opcode.GetStackPointer))) -) -(rule (get_stack_pointer ty ) - (make_inst ty (InstructionData.NullAry (Opcode.GetStackPointer))) -) - -(decl get_return_address (Type ) Value) -(extractor - (get_return_address ty ) - (inst_data ty (InstructionData.NullAry (Opcode.GetReturnAddress))) -) -(rule (get_return_address ty ) - (make_inst ty (InstructionData.NullAry (Opcode.GetReturnAddress))) -) - -(decl table_addr (Type Table Value Offset32) Value) -(extractor - (table_addr ty T p Offset) - (inst_data ty (InstructionData.TableAddr (Opcode.TableAddr) p T Offset)) -) -(rule (table_addr ty T p Offset) - (make_inst ty (InstructionData.TableAddr (Opcode.TableAddr) p T Offset)) -) - -(decl iconst (Type Imm64) Value) -(extractor - (iconst ty N) - (inst_data ty (InstructionData.UnaryImm (Opcode.Iconst) N)) -) -(rule (iconst ty N) - (make_inst ty (InstructionData.UnaryImm (Opcode.Iconst) N)) -) - -(decl f32const (Type Ieee32) Value) -(extractor - (f32const ty N) - (inst_data ty (InstructionData.UnaryIeee32 (Opcode.F32const) N)) -) -(rule (f32const ty N) - (make_inst ty (InstructionData.UnaryIeee32 (Opcode.F32const) N)) -) - -(decl f64const (Type Ieee64) Value) -(extractor - (f64const ty N) - (inst_data ty (InstructionData.UnaryIeee64 (Opcode.F64const) N)) -) -(rule (f64const ty N) - (make_inst ty (InstructionData.UnaryIeee64 (Opcode.F64const) N)) -) - -(decl vconst (Type Constant) Value) -(extractor - (vconst ty N) - (inst_data ty (InstructionData.UnaryConst (Opcode.Vconst) N)) -) -(rule (vconst ty N) - (make_inst ty (InstructionData.UnaryConst (Opcode.Vconst) N)) -) - -(decl shuffle (Type Value Value Immediate) Value) -(extractor - (shuffle ty a b mask) - (inst_data ty (InstructionData.Shuffle (Opcode.Shuffle) (value_array_2 a b) mask)) -) -(rule (shuffle ty a b mask) - (make_inst ty (InstructionData.Shuffle (Opcode.Shuffle) (value_array_2_ctor a b) mask)) -) - -(decl null (Type ) Value) -(extractor - (null ty ) - (inst_data ty (InstructionData.NullAry (Opcode.Null))) -) -(rule (null ty ) - (make_inst ty (InstructionData.NullAry (Opcode.Null))) -) - -(decl nop (Type ) Value) -(extractor - (nop ty ) - (inst_data ty (InstructionData.NullAry (Opcode.Nop))) -) -(rule (nop ty ) - (make_inst ty (InstructionData.NullAry (Opcode.Nop))) -) - -(decl select (Type Value Value Value) Value) -(extractor - (select ty c x y) - (inst_data ty (InstructionData.Ternary (Opcode.Select) (value_array_3 c x y))) -) -(rule (select ty c x y) - (make_inst ty (InstructionData.Ternary (Opcode.Select) (value_array_3_ctor c x y))) -) - -(decl select_spectre_guard (Type Value Value Value) Value) -(extractor - (select_spectre_guard ty c x y) - (inst_data ty (InstructionData.Ternary (Opcode.SelectSpectreGuard) (value_array_3 c x y))) -) -(rule (select_spectre_guard ty c x y) - (make_inst ty (InstructionData.Ternary (Opcode.SelectSpectreGuard) (value_array_3_ctor c x y))) -) - -(decl bitselect (Type Value Value Value) Value) -(extractor - (bitselect ty c x y) - (inst_data ty (InstructionData.Ternary (Opcode.Bitselect) (value_array_3 c x y))) -) -(rule (bitselect ty c x y) - (make_inst ty (InstructionData.Ternary (Opcode.Bitselect) (value_array_3_ctor c x y))) -) - -(decl vselect (Type Value Value Value) Value) -(extractor - (vselect ty c x y) - (inst_data ty (InstructionData.Ternary (Opcode.Vselect) (value_array_3 c x y))) -) -(rule (vselect ty c x y) - (make_inst ty (InstructionData.Ternary (Opcode.Vselect) (value_array_3_ctor c x y))) -) - -(decl vany_true (Type Value) Value) -(extractor - (vany_true ty a) - (inst_data ty (InstructionData.Unary (Opcode.VanyTrue) a)) -) -(rule (vany_true ty a) - (make_inst ty (InstructionData.Unary (Opcode.VanyTrue) a)) -) - -(decl vall_true (Type Value) Value) -(extractor - (vall_true ty a) - (inst_data ty (InstructionData.Unary (Opcode.VallTrue) a)) -) -(rule (vall_true ty a) - (make_inst ty (InstructionData.Unary (Opcode.VallTrue) a)) -) - -(decl vhigh_bits (Type Value) Value) -(extractor - (vhigh_bits ty a) - (inst_data ty (InstructionData.Unary (Opcode.VhighBits) a)) -) -(rule (vhigh_bits ty a) - (make_inst ty (InstructionData.Unary (Opcode.VhighBits) a)) -) - -(decl icmp (Type IntCC Value Value) Value) -(extractor - (icmp ty Cond x y) - (inst_data ty (InstructionData.IntCompare (Opcode.Icmp) (value_array_2 x y) Cond)) -) -(rule (icmp ty Cond x y) - (make_inst ty (InstructionData.IntCompare (Opcode.Icmp) (value_array_2_ctor x y) Cond)) -) - -(decl icmp_imm (Type IntCC Value Imm64) Value) -(extractor - (icmp_imm ty Cond x Y) - (inst_data ty (InstructionData.IntCompareImm (Opcode.IcmpImm) x Cond Y)) -) -(rule (icmp_imm ty Cond x Y) - (make_inst ty (InstructionData.IntCompareImm (Opcode.IcmpImm) x Cond Y)) -) - -(decl iadd (Type Value Value) Value) -(extractor - (iadd ty x y) - (inst_data ty (InstructionData.Binary (Opcode.Iadd) (value_array_2 x y))) -) -(rule (iadd ty x y) - (make_inst ty (InstructionData.Binary (Opcode.Iadd) (value_array_2_ctor x y))) -) - -(decl isub (Type Value Value) Value) -(extractor - (isub ty x y) - (inst_data ty (InstructionData.Binary (Opcode.Isub) (value_array_2 x y))) -) -(rule (isub ty x y) - (make_inst ty (InstructionData.Binary (Opcode.Isub) (value_array_2_ctor x y))) -) - -(decl ineg (Type Value) Value) -(extractor - (ineg ty x) - (inst_data ty (InstructionData.Unary (Opcode.Ineg) x)) -) -(rule (ineg ty x) - (make_inst ty (InstructionData.Unary (Opcode.Ineg) x)) -) - -(decl iabs (Type Value) Value) -(extractor - (iabs ty x) - (inst_data ty (InstructionData.Unary (Opcode.Iabs) x)) -) -(rule (iabs ty x) - (make_inst ty (InstructionData.Unary (Opcode.Iabs) x)) -) - -(decl imul (Type Value Value) Value) -(extractor - (imul ty x y) - (inst_data ty (InstructionData.Binary (Opcode.Imul) (value_array_2 x y))) -) -(rule (imul ty x y) - (make_inst ty (InstructionData.Binary (Opcode.Imul) (value_array_2_ctor x y))) -) - -(decl umulhi (Type Value Value) Value) -(extractor - (umulhi ty x y) - (inst_data ty (InstructionData.Binary (Opcode.Umulhi) (value_array_2 x y))) -) -(rule (umulhi ty x y) - (make_inst ty (InstructionData.Binary (Opcode.Umulhi) (value_array_2_ctor x y))) -) - -(decl smulhi (Type Value Value) Value) -(extractor - (smulhi ty x y) - (inst_data ty (InstructionData.Binary (Opcode.Smulhi) (value_array_2 x y))) -) -(rule (smulhi ty x y) - (make_inst ty (InstructionData.Binary (Opcode.Smulhi) (value_array_2_ctor x y))) -) - -(decl sqmul_round_sat (Type Value Value) Value) -(extractor - (sqmul_round_sat ty x y) - (inst_data ty (InstructionData.Binary (Opcode.SqmulRoundSat) (value_array_2 x y))) -) -(rule (sqmul_round_sat ty x y) - (make_inst ty (InstructionData.Binary (Opcode.SqmulRoundSat) (value_array_2_ctor x y))) -) - -(decl udiv (Type Value Value) Value) -(extractor - (udiv ty x y) - (inst_data ty (InstructionData.Binary (Opcode.Udiv) (value_array_2 x y))) -) -(rule (udiv ty x y) - (make_inst ty (InstructionData.Binary (Opcode.Udiv) (value_array_2_ctor x y))) -) - -(decl sdiv (Type Value Value) Value) -(extractor - (sdiv ty x y) - (inst_data ty (InstructionData.Binary (Opcode.Sdiv) (value_array_2 x y))) -) -(rule (sdiv ty x y) - (make_inst ty (InstructionData.Binary (Opcode.Sdiv) (value_array_2_ctor x y))) -) - -(decl urem (Type Value Value) Value) -(extractor - (urem ty x y) - (inst_data ty (InstructionData.Binary (Opcode.Urem) (value_array_2 x y))) -) -(rule (urem ty x y) - (make_inst ty (InstructionData.Binary (Opcode.Urem) (value_array_2_ctor x y))) -) - -(decl srem (Type Value Value) Value) -(extractor - (srem ty x y) - (inst_data ty (InstructionData.Binary (Opcode.Srem) (value_array_2 x y))) -) -(rule (srem ty x y) - (make_inst ty (InstructionData.Binary (Opcode.Srem) (value_array_2_ctor x y))) -) - -(decl iadd_imm (Type Value Imm64) Value) -(extractor - (iadd_imm ty x Y) - (inst_data ty (InstructionData.BinaryImm64 (Opcode.IaddImm) x Y)) -) -(rule (iadd_imm ty x Y) - (make_inst ty (InstructionData.BinaryImm64 (Opcode.IaddImm) x Y)) -) - -(decl imul_imm (Type Value Imm64) Value) -(extractor - (imul_imm ty x Y) - (inst_data ty (InstructionData.BinaryImm64 (Opcode.ImulImm) x Y)) -) -(rule (imul_imm ty x Y) - (make_inst ty (InstructionData.BinaryImm64 (Opcode.ImulImm) x Y)) -) - -(decl udiv_imm (Type Value Imm64) Value) -(extractor - (udiv_imm ty x Y) - (inst_data ty (InstructionData.BinaryImm64 (Opcode.UdivImm) x Y)) -) -(rule (udiv_imm ty x Y) - (make_inst ty (InstructionData.BinaryImm64 (Opcode.UdivImm) x Y)) -) - -(decl sdiv_imm (Type Value Imm64) Value) -(extractor - (sdiv_imm ty x Y) - (inst_data ty (InstructionData.BinaryImm64 (Opcode.SdivImm) x Y)) -) -(rule (sdiv_imm ty x Y) - (make_inst ty (InstructionData.BinaryImm64 (Opcode.SdivImm) x Y)) -) - -(decl urem_imm (Type Value Imm64) Value) -(extractor - (urem_imm ty x Y) - (inst_data ty (InstructionData.BinaryImm64 (Opcode.UremImm) x Y)) -) -(rule (urem_imm ty x Y) - (make_inst ty (InstructionData.BinaryImm64 (Opcode.UremImm) x Y)) -) - -(decl srem_imm (Type Value Imm64) Value) -(extractor - (srem_imm ty x Y) - (inst_data ty (InstructionData.BinaryImm64 (Opcode.SremImm) x Y)) -) -(rule (srem_imm ty x Y) - (make_inst ty (InstructionData.BinaryImm64 (Opcode.SremImm) x Y)) -) - -(decl irsub_imm (Type Value Imm64) Value) -(extractor - (irsub_imm ty x Y) - (inst_data ty (InstructionData.BinaryImm64 (Opcode.IrsubImm) x Y)) -) -(rule (irsub_imm ty x Y) - (make_inst ty (InstructionData.BinaryImm64 (Opcode.IrsubImm) x Y)) -) - -(decl iadd_cin (Type Value Value Value) Value) -(extractor - (iadd_cin ty x y c_in) - (inst_data ty (InstructionData.Ternary (Opcode.IaddCin) (value_array_3 x y c_in))) -) -(rule (iadd_cin ty x y c_in) - (make_inst ty (InstructionData.Ternary (Opcode.IaddCin) (value_array_3_ctor x y c_in))) -) - -(decl iadd_cout (Type Value Value) Value) -(extractor - (iadd_cout ty x y) - (inst_data ty (InstructionData.Binary (Opcode.IaddCout) (value_array_2 x y))) -) -(rule (iadd_cout ty x y) - (make_inst ty (InstructionData.Binary (Opcode.IaddCout) (value_array_2_ctor x y))) -) - -(decl iadd_carry (Type Value Value Value) Value) -(extractor - (iadd_carry ty x y c_in) - (inst_data ty (InstructionData.Ternary (Opcode.IaddCarry) (value_array_3 x y c_in))) -) -(rule (iadd_carry ty x y c_in) - (make_inst ty (InstructionData.Ternary (Opcode.IaddCarry) (value_array_3_ctor x y c_in))) -) - -(decl uadd_overflow_trap (Type Value Value TrapCode) Value) -(extractor - (uadd_overflow_trap ty x y code) - (inst_data ty (InstructionData.IntAddTrap (Opcode.UaddOverflowTrap) (value_array_2 x y) code)) -) -(rule (uadd_overflow_trap ty x y code) - (make_inst ty (InstructionData.IntAddTrap (Opcode.UaddOverflowTrap) (value_array_2_ctor x y) code)) -) - -(decl isub_bin (Type Value Value Value) Value) -(extractor - (isub_bin ty x y b_in) - (inst_data ty (InstructionData.Ternary (Opcode.IsubBin) (value_array_3 x y b_in))) -) -(rule (isub_bin ty x y b_in) - (make_inst ty (InstructionData.Ternary (Opcode.IsubBin) (value_array_3_ctor x y b_in))) -) - -(decl isub_bout (Type Value Value) Value) -(extractor - (isub_bout ty x y) - (inst_data ty (InstructionData.Binary (Opcode.IsubBout) (value_array_2 x y))) -) -(rule (isub_bout ty x y) - (make_inst ty (InstructionData.Binary (Opcode.IsubBout) (value_array_2_ctor x y))) -) - -(decl isub_borrow (Type Value Value Value) Value) -(extractor - (isub_borrow ty x y b_in) - (inst_data ty (InstructionData.Ternary (Opcode.IsubBorrow) (value_array_3 x y b_in))) -) -(rule (isub_borrow ty x y b_in) - (make_inst ty (InstructionData.Ternary (Opcode.IsubBorrow) (value_array_3_ctor x y b_in))) -) - -(decl band (Type Value Value) Value) -(extractor - (band ty x y) - (inst_data ty (InstructionData.Binary (Opcode.Band) (value_array_2 x y))) -) -(rule (band ty x y) - (make_inst ty (InstructionData.Binary (Opcode.Band) (value_array_2_ctor x y))) -) - -(decl bor (Type Value Value) Value) -(extractor - (bor ty x y) - (inst_data ty (InstructionData.Binary (Opcode.Bor) (value_array_2 x y))) -) -(rule (bor ty x y) - (make_inst ty (InstructionData.Binary (Opcode.Bor) (value_array_2_ctor x y))) -) - -(decl bxor (Type Value Value) Value) -(extractor - (bxor ty x y) - (inst_data ty (InstructionData.Binary (Opcode.Bxor) (value_array_2 x y))) -) -(rule (bxor ty x y) - (make_inst ty (InstructionData.Binary (Opcode.Bxor) (value_array_2_ctor x y))) -) - -(decl bnot (Type Value) Value) -(extractor - (bnot ty x) - (inst_data ty (InstructionData.Unary (Opcode.Bnot) x)) -) -(rule (bnot ty x) - (make_inst ty (InstructionData.Unary (Opcode.Bnot) x)) -) - -(decl band_not (Type Value Value) Value) -(extractor - (band_not ty x y) - (inst_data ty (InstructionData.Binary (Opcode.BandNot) (value_array_2 x y))) -) -(rule (band_not ty x y) - (make_inst ty (InstructionData.Binary (Opcode.BandNot) (value_array_2_ctor x y))) -) - -(decl bor_not (Type Value Value) Value) -(extractor - (bor_not ty x y) - (inst_data ty (InstructionData.Binary (Opcode.BorNot) (value_array_2 x y))) -) -(rule (bor_not ty x y) - (make_inst ty (InstructionData.Binary (Opcode.BorNot) (value_array_2_ctor x y))) -) - -(decl bxor_not (Type Value Value) Value) -(extractor - (bxor_not ty x y) - (inst_data ty (InstructionData.Binary (Opcode.BxorNot) (value_array_2 x y))) -) -(rule (bxor_not ty x y) - (make_inst ty (InstructionData.Binary (Opcode.BxorNot) (value_array_2_ctor x y))) -) - -(decl band_imm (Type Value Imm64) Value) -(extractor - (band_imm ty x Y) - (inst_data ty (InstructionData.BinaryImm64 (Opcode.BandImm) x Y)) -) -(rule (band_imm ty x Y) - (make_inst ty (InstructionData.BinaryImm64 (Opcode.BandImm) x Y)) -) - -(decl bor_imm (Type Value Imm64) Value) -(extractor - (bor_imm ty x Y) - (inst_data ty (InstructionData.BinaryImm64 (Opcode.BorImm) x Y)) -) -(rule (bor_imm ty x Y) - (make_inst ty (InstructionData.BinaryImm64 (Opcode.BorImm) x Y)) -) - -(decl bxor_imm (Type Value Imm64) Value) -(extractor - (bxor_imm ty x Y) - (inst_data ty (InstructionData.BinaryImm64 (Opcode.BxorImm) x Y)) -) -(rule (bxor_imm ty x Y) - (make_inst ty (InstructionData.BinaryImm64 (Opcode.BxorImm) x Y)) -) - -(decl rotl (Type Value Value) Value) -(extractor - (rotl ty x y) - (inst_data ty (InstructionData.Binary (Opcode.Rotl) (value_array_2 x y))) -) -(rule (rotl ty x y) - (make_inst ty (InstructionData.Binary (Opcode.Rotl) (value_array_2_ctor x y))) -) - -(decl rotr (Type Value Value) Value) -(extractor - (rotr ty x y) - (inst_data ty (InstructionData.Binary (Opcode.Rotr) (value_array_2 x y))) -) -(rule (rotr ty x y) - (make_inst ty (InstructionData.Binary (Opcode.Rotr) (value_array_2_ctor x y))) -) - -(decl rotl_imm (Type Value Imm64) Value) -(extractor - (rotl_imm ty x Y) - (inst_data ty (InstructionData.BinaryImm64 (Opcode.RotlImm) x Y)) -) -(rule (rotl_imm ty x Y) - (make_inst ty (InstructionData.BinaryImm64 (Opcode.RotlImm) x Y)) -) - -(decl rotr_imm (Type Value Imm64) Value) -(extractor - (rotr_imm ty x Y) - (inst_data ty (InstructionData.BinaryImm64 (Opcode.RotrImm) x Y)) -) -(rule (rotr_imm ty x Y) - (make_inst ty (InstructionData.BinaryImm64 (Opcode.RotrImm) x Y)) -) - -(decl ishl (Type Value Value) Value) -(extractor - (ishl ty x y) - (inst_data ty (InstructionData.Binary (Opcode.Ishl) (value_array_2 x y))) -) -(rule (ishl ty x y) - (make_inst ty (InstructionData.Binary (Opcode.Ishl) (value_array_2_ctor x y))) -) - -(decl ushr (Type Value Value) Value) -(extractor - (ushr ty x y) - (inst_data ty (InstructionData.Binary (Opcode.Ushr) (value_array_2 x y))) -) -(rule (ushr ty x y) - (make_inst ty (InstructionData.Binary (Opcode.Ushr) (value_array_2_ctor x y))) -) - -(decl sshr (Type Value Value) Value) -(extractor - (sshr ty x y) - (inst_data ty (InstructionData.Binary (Opcode.Sshr) (value_array_2 x y))) -) -(rule (sshr ty x y) - (make_inst ty (InstructionData.Binary (Opcode.Sshr) (value_array_2_ctor x y))) -) - -(decl ishl_imm (Type Value Imm64) Value) -(extractor - (ishl_imm ty x Y) - (inst_data ty (InstructionData.BinaryImm64 (Opcode.IshlImm) x Y)) -) -(rule (ishl_imm ty x Y) - (make_inst ty (InstructionData.BinaryImm64 (Opcode.IshlImm) x Y)) -) - -(decl ushr_imm (Type Value Imm64) Value) -(extractor - (ushr_imm ty x Y) - (inst_data ty (InstructionData.BinaryImm64 (Opcode.UshrImm) x Y)) -) -(rule (ushr_imm ty x Y) - (make_inst ty (InstructionData.BinaryImm64 (Opcode.UshrImm) x Y)) -) - -(decl sshr_imm (Type Value Imm64) Value) -(extractor - (sshr_imm ty x Y) - (inst_data ty (InstructionData.BinaryImm64 (Opcode.SshrImm) x Y)) -) -(rule (sshr_imm ty x Y) - (make_inst ty (InstructionData.BinaryImm64 (Opcode.SshrImm) x Y)) -) - -(decl bitrev (Type Value) Value) -(extractor - (bitrev ty x) - (inst_data ty (InstructionData.Unary (Opcode.Bitrev) x)) -) -(rule (bitrev ty x) - (make_inst ty (InstructionData.Unary (Opcode.Bitrev) x)) -) - -(decl clz (Type Value) Value) -(extractor - (clz ty x) - (inst_data ty (InstructionData.Unary (Opcode.Clz) x)) -) -(rule (clz ty x) - (make_inst ty (InstructionData.Unary (Opcode.Clz) x)) -) - -(decl cls (Type Value) Value) -(extractor - (cls ty x) - (inst_data ty (InstructionData.Unary (Opcode.Cls) x)) -) -(rule (cls ty x) - (make_inst ty (InstructionData.Unary (Opcode.Cls) x)) -) - -(decl ctz (Type Value) Value) -(extractor - (ctz ty x) - (inst_data ty (InstructionData.Unary (Opcode.Ctz) x)) -) -(rule (ctz ty x) - (make_inst ty (InstructionData.Unary (Opcode.Ctz) x)) -) - -(decl bswap (Type Value) Value) -(extractor - (bswap ty x) - (inst_data ty (InstructionData.Unary (Opcode.Bswap) x)) -) -(rule (bswap ty x) - (make_inst ty (InstructionData.Unary (Opcode.Bswap) x)) -) - -(decl popcnt (Type Value) Value) -(extractor - (popcnt ty x) - (inst_data ty (InstructionData.Unary (Opcode.Popcnt) x)) -) -(rule (popcnt ty x) - (make_inst ty (InstructionData.Unary (Opcode.Popcnt) x)) -) - -(decl fcmp (Type FloatCC Value Value) Value) -(extractor - (fcmp ty Cond x y) - (inst_data ty (InstructionData.FloatCompare (Opcode.Fcmp) (value_array_2 x y) Cond)) -) -(rule (fcmp ty Cond x y) - (make_inst ty (InstructionData.FloatCompare (Opcode.Fcmp) (value_array_2_ctor x y) Cond)) -) - -(decl fadd (Type Value Value) Value) -(extractor - (fadd ty x y) - (inst_data ty (InstructionData.Binary (Opcode.Fadd) (value_array_2 x y))) -) -(rule (fadd ty x y) - (make_inst ty (InstructionData.Binary (Opcode.Fadd) (value_array_2_ctor x y))) -) - -(decl fsub (Type Value Value) Value) -(extractor - (fsub ty x y) - (inst_data ty (InstructionData.Binary (Opcode.Fsub) (value_array_2 x y))) -) -(rule (fsub ty x y) - (make_inst ty (InstructionData.Binary (Opcode.Fsub) (value_array_2_ctor x y))) -) - -(decl fmul (Type Value Value) Value) -(extractor - (fmul ty x y) - (inst_data ty (InstructionData.Binary (Opcode.Fmul) (value_array_2 x y))) -) -(rule (fmul ty x y) - (make_inst ty (InstructionData.Binary (Opcode.Fmul) (value_array_2_ctor x y))) -) - -(decl fdiv (Type Value Value) Value) -(extractor - (fdiv ty x y) - (inst_data ty (InstructionData.Binary (Opcode.Fdiv) (value_array_2 x y))) -) -(rule (fdiv ty x y) - (make_inst ty (InstructionData.Binary (Opcode.Fdiv) (value_array_2_ctor x y))) -) - -(decl sqrt (Type Value) Value) -(extractor - (sqrt ty x) - (inst_data ty (InstructionData.Unary (Opcode.Sqrt) x)) -) -(rule (sqrt ty x) - (make_inst ty (InstructionData.Unary (Opcode.Sqrt) x)) -) - -(decl fma (Type Value Value Value) Value) -(extractor - (fma ty x y z) - (inst_data ty (InstructionData.Ternary (Opcode.Fma) (value_array_3 x y z))) -) -(rule (fma ty x y z) - (make_inst ty (InstructionData.Ternary (Opcode.Fma) (value_array_3_ctor x y z))) -) - -(decl fneg (Type Value) Value) -(extractor - (fneg ty x) - (inst_data ty (InstructionData.Unary (Opcode.Fneg) x)) -) -(rule (fneg ty x) - (make_inst ty (InstructionData.Unary (Opcode.Fneg) x)) -) - -(decl fabs (Type Value) Value) -(extractor - (fabs ty x) - (inst_data ty (InstructionData.Unary (Opcode.Fabs) x)) -) -(rule (fabs ty x) - (make_inst ty (InstructionData.Unary (Opcode.Fabs) x)) -) - -(decl fcopysign (Type Value Value) Value) -(extractor - (fcopysign ty x y) - (inst_data ty (InstructionData.Binary (Opcode.Fcopysign) (value_array_2 x y))) -) -(rule (fcopysign ty x y) - (make_inst ty (InstructionData.Binary (Opcode.Fcopysign) (value_array_2_ctor x y))) -) - -(decl fmin (Type Value Value) Value) -(extractor - (fmin ty x y) - (inst_data ty (InstructionData.Binary (Opcode.Fmin) (value_array_2 x y))) -) -(rule (fmin ty x y) - (make_inst ty (InstructionData.Binary (Opcode.Fmin) (value_array_2_ctor x y))) -) - -(decl fmin_pseudo (Type Value Value) Value) -(extractor - (fmin_pseudo ty x y) - (inst_data ty (InstructionData.Binary (Opcode.FminPseudo) (value_array_2 x y))) -) -(rule (fmin_pseudo ty x y) - (make_inst ty (InstructionData.Binary (Opcode.FminPseudo) (value_array_2_ctor x y))) -) - -(decl fmax (Type Value Value) Value) -(extractor - (fmax ty x y) - (inst_data ty (InstructionData.Binary (Opcode.Fmax) (value_array_2 x y))) -) -(rule (fmax ty x y) - (make_inst ty (InstructionData.Binary (Opcode.Fmax) (value_array_2_ctor x y))) -) - -(decl fmax_pseudo (Type Value Value) Value) -(extractor - (fmax_pseudo ty x y) - (inst_data ty (InstructionData.Binary (Opcode.FmaxPseudo) (value_array_2 x y))) -) -(rule (fmax_pseudo ty x y) - (make_inst ty (InstructionData.Binary (Opcode.FmaxPseudo) (value_array_2_ctor x y))) -) - -(decl ceil (Type Value) Value) -(extractor - (ceil ty x) - (inst_data ty (InstructionData.Unary (Opcode.Ceil) x)) -) -(rule (ceil ty x) - (make_inst ty (InstructionData.Unary (Opcode.Ceil) x)) -) - -(decl floor (Type Value) Value) -(extractor - (floor ty x) - (inst_data ty (InstructionData.Unary (Opcode.Floor) x)) -) -(rule (floor ty x) - (make_inst ty (InstructionData.Unary (Opcode.Floor) x)) -) - -(decl trunc (Type Value) Value) -(extractor - (trunc ty x) - (inst_data ty (InstructionData.Unary (Opcode.Trunc) x)) -) -(rule (trunc ty x) - (make_inst ty (InstructionData.Unary (Opcode.Trunc) x)) -) - -(decl nearest (Type Value) Value) -(extractor - (nearest ty x) - (inst_data ty (InstructionData.Unary (Opcode.Nearest) x)) -) -(rule (nearest ty x) - (make_inst ty (InstructionData.Unary (Opcode.Nearest) x)) -) - -(decl is_null (Type Value) Value) -(extractor - (is_null ty x) - (inst_data ty (InstructionData.Unary (Opcode.IsNull) x)) -) -(rule (is_null ty x) - (make_inst ty (InstructionData.Unary (Opcode.IsNull) x)) -) - -(decl is_invalid (Type Value) Value) -(extractor - (is_invalid ty x) - (inst_data ty (InstructionData.Unary (Opcode.IsInvalid) x)) -) -(rule (is_invalid ty x) - (make_inst ty (InstructionData.Unary (Opcode.IsInvalid) x)) -) - -(decl bitcast (Type MemFlags Value) Value) -(extractor - (bitcast ty MemFlags x) - (inst_data ty (InstructionData.LoadNoOffset (Opcode.Bitcast) x MemFlags)) -) -(rule (bitcast ty MemFlags x) - (make_inst ty (InstructionData.LoadNoOffset (Opcode.Bitcast) x MemFlags)) -) - -(decl scalar_to_vector (Type Value) Value) -(extractor - (scalar_to_vector ty s) - (inst_data ty (InstructionData.Unary (Opcode.ScalarToVector) s)) -) -(rule (scalar_to_vector ty s) - (make_inst ty (InstructionData.Unary (Opcode.ScalarToVector) s)) -) - -(decl bmask (Type Value) Value) -(extractor - (bmask ty x) - (inst_data ty (InstructionData.Unary (Opcode.Bmask) x)) -) -(rule (bmask ty x) - (make_inst ty (InstructionData.Unary (Opcode.Bmask) x)) -) - -(decl ireduce (Type Value) Value) -(extractor - (ireduce ty x) - (inst_data ty (InstructionData.Unary (Opcode.Ireduce) x)) -) -(rule (ireduce ty x) - (make_inst ty (InstructionData.Unary (Opcode.Ireduce) x)) -) - -(decl snarrow (Type Value Value) Value) -(extractor - (snarrow ty x y) - (inst_data ty (InstructionData.Binary (Opcode.Snarrow) (value_array_2 x y))) -) -(rule (snarrow ty x y) - (make_inst ty (InstructionData.Binary (Opcode.Snarrow) (value_array_2_ctor x y))) -) - -(decl unarrow (Type Value Value) Value) -(extractor - (unarrow ty x y) - (inst_data ty (InstructionData.Binary (Opcode.Unarrow) (value_array_2 x y))) -) -(rule (unarrow ty x y) - (make_inst ty (InstructionData.Binary (Opcode.Unarrow) (value_array_2_ctor x y))) -) - -(decl uunarrow (Type Value Value) Value) -(extractor - (uunarrow ty x y) - (inst_data ty (InstructionData.Binary (Opcode.Uunarrow) (value_array_2 x y))) -) -(rule (uunarrow ty x y) - (make_inst ty (InstructionData.Binary (Opcode.Uunarrow) (value_array_2_ctor x y))) -) - -(decl swiden_low (Type Value) Value) -(extractor - (swiden_low ty x) - (inst_data ty (InstructionData.Unary (Opcode.SwidenLow) x)) -) -(rule (swiden_low ty x) - (make_inst ty (InstructionData.Unary (Opcode.SwidenLow) x)) -) - -(decl swiden_high (Type Value) Value) -(extractor - (swiden_high ty x) - (inst_data ty (InstructionData.Unary (Opcode.SwidenHigh) x)) -) -(rule (swiden_high ty x) - (make_inst ty (InstructionData.Unary (Opcode.SwidenHigh) x)) -) - -(decl uwiden_low (Type Value) Value) -(extractor - (uwiden_low ty x) - (inst_data ty (InstructionData.Unary (Opcode.UwidenLow) x)) -) -(rule (uwiden_low ty x) - (make_inst ty (InstructionData.Unary (Opcode.UwidenLow) x)) -) - -(decl uwiden_high (Type Value) Value) -(extractor - (uwiden_high ty x) - (inst_data ty (InstructionData.Unary (Opcode.UwidenHigh) x)) -) -(rule (uwiden_high ty x) - (make_inst ty (InstructionData.Unary (Opcode.UwidenHigh) x)) -) - -(decl iadd_pairwise (Type Value Value) Value) -(extractor - (iadd_pairwise ty x y) - (inst_data ty (InstructionData.Binary (Opcode.IaddPairwise) (value_array_2 x y))) -) -(rule (iadd_pairwise ty x y) - (make_inst ty (InstructionData.Binary (Opcode.IaddPairwise) (value_array_2_ctor x y))) -) - -(decl widening_pairwise_dot_product_s (Type Value Value) Value) -(extractor - (widening_pairwise_dot_product_s ty x y) - (inst_data ty (InstructionData.Binary (Opcode.WideningPairwiseDotProductS) (value_array_2 x y))) -) -(rule (widening_pairwise_dot_product_s ty x y) - (make_inst ty (InstructionData.Binary (Opcode.WideningPairwiseDotProductS) (value_array_2_ctor x y))) -) - -(decl uextend (Type Value) Value) -(extractor - (uextend ty x) - (inst_data ty (InstructionData.Unary (Opcode.Uextend) x)) -) -(rule (uextend ty x) - (make_inst ty (InstructionData.Unary (Opcode.Uextend) x)) -) - -(decl sextend (Type Value) Value) -(extractor - (sextend ty x) - (inst_data ty (InstructionData.Unary (Opcode.Sextend) x)) -) -(rule (sextend ty x) - (make_inst ty (InstructionData.Unary (Opcode.Sextend) x)) -) - -(decl fpromote (Type Value) Value) -(extractor - (fpromote ty x) - (inst_data ty (InstructionData.Unary (Opcode.Fpromote) x)) -) -(rule (fpromote ty x) - (make_inst ty (InstructionData.Unary (Opcode.Fpromote) x)) -) - -(decl fdemote (Type Value) Value) -(extractor - (fdemote ty x) - (inst_data ty (InstructionData.Unary (Opcode.Fdemote) x)) -) -(rule (fdemote ty x) - (make_inst ty (InstructionData.Unary (Opcode.Fdemote) x)) -) - -(decl fvdemote (Type Value) Value) -(extractor - (fvdemote ty x) - (inst_data ty (InstructionData.Unary (Opcode.Fvdemote) x)) -) -(rule (fvdemote ty x) - (make_inst ty (InstructionData.Unary (Opcode.Fvdemote) x)) -) - -(decl fvpromote_low (Type Value) Value) -(extractor - (fvpromote_low ty a) - (inst_data ty (InstructionData.Unary (Opcode.FvpromoteLow) a)) -) -(rule (fvpromote_low ty a) - (make_inst ty (InstructionData.Unary (Opcode.FvpromoteLow) a)) -) - -(decl fcvt_to_uint (Type Value) Value) -(extractor - (fcvt_to_uint ty x) - (inst_data ty (InstructionData.Unary (Opcode.FcvtToUint) x)) -) -(rule (fcvt_to_uint ty x) - (make_inst ty (InstructionData.Unary (Opcode.FcvtToUint) x)) -) - -(decl fcvt_to_sint (Type Value) Value) -(extractor - (fcvt_to_sint ty x) - (inst_data ty (InstructionData.Unary (Opcode.FcvtToSint) x)) -) -(rule (fcvt_to_sint ty x) - (make_inst ty (InstructionData.Unary (Opcode.FcvtToSint) x)) -) - -(decl fcvt_to_uint_sat (Type Value) Value) -(extractor - (fcvt_to_uint_sat ty x) - (inst_data ty (InstructionData.Unary (Opcode.FcvtToUintSat) x)) -) -(rule (fcvt_to_uint_sat ty x) - (make_inst ty (InstructionData.Unary (Opcode.FcvtToUintSat) x)) -) - -(decl fcvt_to_sint_sat (Type Value) Value) -(extractor - (fcvt_to_sint_sat ty x) - (inst_data ty (InstructionData.Unary (Opcode.FcvtToSintSat) x)) -) -(rule (fcvt_to_sint_sat ty x) - (make_inst ty (InstructionData.Unary (Opcode.FcvtToSintSat) x)) -) - -(decl fcvt_from_uint (Type Value) Value) -(extractor - (fcvt_from_uint ty x) - (inst_data ty (InstructionData.Unary (Opcode.FcvtFromUint) x)) -) -(rule (fcvt_from_uint ty x) - (make_inst ty (InstructionData.Unary (Opcode.FcvtFromUint) x)) -) - -(decl fcvt_from_sint (Type Value) Value) -(extractor - (fcvt_from_sint ty x) - (inst_data ty (InstructionData.Unary (Opcode.FcvtFromSint) x)) -) -(rule (fcvt_from_sint ty x) - (make_inst ty (InstructionData.Unary (Opcode.FcvtFromSint) x)) -) - -(decl fcvt_low_from_sint (Type Value) Value) -(extractor - (fcvt_low_from_sint ty x) - (inst_data ty (InstructionData.Unary (Opcode.FcvtLowFromSint) x)) -) -(rule (fcvt_low_from_sint ty x) - (make_inst ty (InstructionData.Unary (Opcode.FcvtLowFromSint) x)) -) - -(decl isplit (Type Value) Value) -(extractor - (isplit ty x) - (inst_data ty (InstructionData.Unary (Opcode.Isplit) x)) -) -(rule (isplit ty x) - (make_inst ty (InstructionData.Unary (Opcode.Isplit) x)) -) - -(decl iconcat (Type Value Value) Value) -(extractor - (iconcat ty lo hi) - (inst_data ty (InstructionData.Binary (Opcode.Iconcat) (value_array_2 lo hi))) -) -(rule (iconcat ty lo hi) - (make_inst ty (InstructionData.Binary (Opcode.Iconcat) (value_array_2_ctor lo hi))) -) - -(decl atomic_rmw (Type MemFlags AtomicRmwOp Value Value) Value) -(extractor - (atomic_rmw ty MemFlags AtomicRmwOp p x) - (inst_data ty (InstructionData.AtomicRmw (Opcode.AtomicRmw) (value_array_2 p x) MemFlags AtomicRmwOp)) -) -(rule (atomic_rmw ty MemFlags AtomicRmwOp p x) - (make_inst ty (InstructionData.AtomicRmw (Opcode.AtomicRmw) (value_array_2_ctor p x) MemFlags AtomicRmwOp)) -) - -(decl atomic_cas (Type MemFlags Value Value Value) Value) -(extractor - (atomic_cas ty MemFlags p e x) - (inst_data ty (InstructionData.AtomicCas (Opcode.AtomicCas) (value_array_3 p e x) MemFlags)) -) -(rule (atomic_cas ty MemFlags p e x) - (make_inst ty (InstructionData.AtomicCas (Opcode.AtomicCas) (value_array_3_ctor p e x) MemFlags)) -) - -(decl atomic_load (Type MemFlags Value) Value) -(extractor - (atomic_load ty MemFlags p) - (inst_data ty (InstructionData.LoadNoOffset (Opcode.AtomicLoad) p MemFlags)) -) -(rule (atomic_load ty MemFlags p) - (make_inst ty (InstructionData.LoadNoOffset (Opcode.AtomicLoad) p MemFlags)) -) - -(decl atomic_store (Type MemFlags Value Value) Value) -(extractor - (atomic_store ty MemFlags x p) - (inst_data ty (InstructionData.StoreNoOffset (Opcode.AtomicStore) (value_array_2 x p) MemFlags)) -) -(rule (atomic_store ty MemFlags x p) - (make_inst ty (InstructionData.StoreNoOffset (Opcode.AtomicStore) (value_array_2_ctor x p) MemFlags)) -) - -(decl fence (Type ) Value) -(extractor - (fence ty ) - (inst_data ty (InstructionData.NullAry (Opcode.Fence))) -) -(rule (fence ty ) - (make_inst ty (InstructionData.NullAry (Opcode.Fence))) -) - -(decl extract_vector (Type Value Uimm8) Value) -(extractor - (extract_vector ty x y) - (inst_data ty (InstructionData.BinaryImm8 (Opcode.ExtractVector) x y)) -) -(rule (extract_vector ty x y) - (make_inst ty (InstructionData.BinaryImm8 (Opcode.ExtractVector) x y)) -) - diff --git a/cranelift/codegen/isle_generated_code/isle_aarch64.rs b/cranelift/codegen/isle_generated_code/isle_aarch64.rs deleted file mode 100644 index dd3a268b9f98..000000000000 --- a/cranelift/codegen/isle_generated_code/isle_aarch64.rs +++ /dev/null @@ -1,17009 +0,0 @@ -// GENERATED BY ISLE. DO NOT EDIT! -// -// Generated automatically from the instruction-selection DSL code in: -// - src/prelude.isle -// - src/prelude_lower.isle -// - src/isa/aarch64/inst.isle -// - src/isa/aarch64/inst_neon.isle -// - src/isa/aarch64/lower.isle -// - src/isa/aarch64/lower_dynamic_neon.isle -// - /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_lower.isle - -use super::*; // Pulls in all external types. -use std::marker::PhantomData; - -/// Context during lowering: an implementation of this trait -/// must be provided with all external constructors and extractors. -/// A mutable borrow is passed along through all lowering logic. -pub trait Context { - fn unit(&mut self) -> Unit; - fn value_type(&mut self, arg0: Value) -> Type; - fn u32_add(&mut self, arg0: u32, arg1: u32) -> u32; - fn s32_add_fallible(&mut self, arg0: u32, arg1: u32) -> Option; - fn u32_nonnegative(&mut self, arg0: u32) -> Option; - fn offset32(&mut self, arg0: Offset32) -> u32; - fn u32_lteq(&mut self, arg0: u32, arg1: u32) -> Option; - fn u8_lteq(&mut self, arg0: u8, arg1: u8) -> Option; - fn u8_lt(&mut self, arg0: u8, arg1: u8) -> Option; - fn simm32(&mut self, arg0: Imm64) -> Option; - fn uimm8(&mut self, arg0: Imm64) -> Option; - fn u8_and(&mut self, arg0: u8, arg1: u8) -> u8; - fn u8_as_u32(&mut self, arg0: u8) -> u32; - fn u8_as_u64(&mut self, arg0: u8) -> u64; - fn u16_as_u64(&mut self, arg0: u16) -> u64; - fn u32_as_u64(&mut self, arg0: u32) -> u64; - fn i64_as_u64(&mut self, arg0: i64) -> u64; - fn u64_add(&mut self, arg0: u64, arg1: u64) -> u64; - fn u64_sub(&mut self, arg0: u64, arg1: u64) -> u64; - fn u64_mul(&mut self, arg0: u64, arg1: u64) -> u64; - fn u64_sdiv(&mut self, arg0: u64, arg1: u64) -> Option; - fn u64_udiv(&mut self, arg0: u64, arg1: u64) -> Option; - fn u64_and(&mut self, arg0: u64, arg1: u64) -> u64; - fn u64_or(&mut self, arg0: u64, arg1: u64) -> u64; - fn u64_xor(&mut self, arg0: u64, arg1: u64) -> u64; - fn u64_not(&mut self, arg0: u64) -> u64; - fn u64_sextend_u32(&mut self, arg0: u64) -> u64; - fn u64_uextend_u32(&mut self, arg0: u64) -> u64; - fn u64_is_zero(&mut self, arg0: u64) -> bool; - fn u64_is_odd(&mut self, arg0: u64) -> bool; - fn ty_bits(&mut self, arg0: Type) -> u8; - fn ty_bits_u16(&mut self, arg0: Type) -> u16; - fn ty_bits_u64(&mut self, arg0: Type) -> u64; - fn ty_mask(&mut self, arg0: Type) -> u64; - fn ty_bytes(&mut self, arg0: Type) -> u16; - fn lane_type(&mut self, arg0: Type) -> Type; - fn mem_flags_trusted(&mut self) -> MemFlags; - fn intcc_reverse(&mut self, arg0: &IntCC) -> IntCC; - fn intcc_inverse(&mut self, arg0: &IntCC) -> IntCC; - fn floatcc_reverse(&mut self, arg0: &FloatCC) -> FloatCC; - fn floatcc_inverse(&mut self, arg0: &FloatCC) -> FloatCC; - fn fits_in_16(&mut self, arg0: Type) -> Option; - fn fits_in_32(&mut self, arg0: Type) -> Option; - fn lane_fits_in_32(&mut self, arg0: Type) -> Option; - fn fits_in_64(&mut self, arg0: Type) -> Option; - fn ty_32(&mut self, arg0: Type) -> Option; - fn ty_64(&mut self, arg0: Type) -> Option; - fn ty_int_ref_scalar_64(&mut self, arg0: Type) -> Option; - fn ty_32_or_64(&mut self, arg0: Type) -> Option; - fn ty_8_or_16(&mut self, arg0: Type) -> Option; - fn int_fits_in_32(&mut self, arg0: Type) -> Option; - fn ty_int_ref_64(&mut self, arg0: Type) -> Option; - fn ty_int(&mut self, arg0: Type) -> Option; - fn ty_scalar_float(&mut self, arg0: Type) -> Option; - fn ty_float_or_vec(&mut self, arg0: Type) -> Option; - fn ty_vector_float(&mut self, arg0: Type) -> Option; - fn ty_vector_not_float(&mut self, arg0: Type) -> Option; - fn ty_vec64(&mut self, arg0: Type) -> Option; - fn ty_vec64_ctor(&mut self, arg0: Type) -> Option; - fn ty_vec128(&mut self, arg0: Type) -> Option; - fn ty_dyn_vec64(&mut self, arg0: Type) -> Option; - fn ty_dyn_vec128(&mut self, arg0: Type) -> Option; - fn ty_vec64_int(&mut self, arg0: Type) -> Option; - fn ty_vec128_int(&mut self, arg0: Type) -> Option; - fn not_vec32x2(&mut self, arg0: Type) -> Option; - fn not_i64x2(&mut self, arg0: Type) -> Option<()>; - fn u8_from_uimm8(&mut self, arg0: Uimm8) -> u8; - fn u64_from_bool(&mut self, arg0: bool) -> u64; - fn u64_from_imm64(&mut self, arg0: Imm64) -> u64; - fn nonzero_u64_from_imm64(&mut self, arg0: Imm64) -> Option; - fn imm64(&mut self, arg0: u64) -> Imm64; - fn imm64_masked(&mut self, arg0: Type, arg1: u64) -> Imm64; - fn u64_from_ieee32(&mut self, arg0: Ieee32) -> u64; - fn u64_from_ieee64(&mut self, arg0: Ieee64) -> u64; - fn multi_lane(&mut self, arg0: Type) -> Option<(u32, u32)>; - fn dynamic_lane(&mut self, arg0: Type) -> Option<(u32, u32)>; - fn dynamic_int_lane(&mut self, arg0: Type) -> Option; - fn dynamic_fp_lane(&mut self, arg0: Type) -> Option; - fn ty_dyn64_int(&mut self, arg0: Type) -> Option; - fn ty_dyn128_int(&mut self, arg0: Type) -> Option; - fn offset32_to_u32(&mut self, arg0: Offset32) -> u32; - fn intcc_unsigned(&mut self, arg0: &IntCC) -> IntCC; - fn signed_cond_code(&mut self, arg0: &IntCC) -> Option; - fn trap_code_division_by_zero(&mut self) -> TrapCode; - fn trap_code_integer_overflow(&mut self) -> TrapCode; - fn trap_code_bad_conversion_to_integer(&mut self) -> TrapCode; - fn range(&mut self, arg0: usize, arg1: usize) -> Range; - fn range_view(&mut self, arg0: Range) -> RangeView; - fn value_reg(&mut self, arg0: Reg) -> ValueRegs; - fn value_regs(&mut self, arg0: Reg, arg1: Reg) -> ValueRegs; - fn value_regs_invalid(&mut self) -> ValueRegs; - fn output_none(&mut self) -> InstOutput; - fn output(&mut self, arg0: ValueRegs) -> InstOutput; - fn output_pair(&mut self, arg0: ValueRegs, arg1: ValueRegs) -> InstOutput; - fn output_builder_new(&mut self) -> InstOutputBuilder; - fn output_builder_push(&mut self, arg0: &InstOutputBuilder, arg1: ValueRegs) -> Unit; - fn output_builder_finish(&mut self, arg0: &InstOutputBuilder) -> InstOutput; - fn temp_writable_reg(&mut self, arg0: Type) -> WritableReg; - fn is_valid_reg(&mut self, arg0: Reg) -> bool; - fn invalid_reg(&mut self) -> Reg; - fn mark_value_used(&mut self, arg0: Value) -> Unit; - fn put_in_reg(&mut self, arg0: Value) -> Reg; - fn put_in_regs(&mut self, arg0: Value) -> ValueRegs; - fn ensure_in_vreg(&mut self, arg0: Reg, arg1: Type) -> Reg; - fn value_regs_get(&mut self, arg0: ValueRegs, arg1: usize) -> Reg; - fn value_regs_len(&mut self, arg0: ValueRegs) -> usize; - fn preg_to_reg(&mut self, arg0: PReg) -> Reg; - fn value_list_slice(&mut self, arg0: ValueList) -> ValueSlice; - fn value_slice_empty(&mut self, arg0: ValueSlice) -> Option<()>; - fn value_slice_unwrap(&mut self, arg0: ValueSlice) -> Option<(Value, ValueSlice)>; - fn value_slice_len(&mut self, arg0: ValueSlice) -> usize; - fn value_slice_get(&mut self, arg0: ValueSlice, arg1: usize) -> Value; - fn writable_reg_to_reg(&mut self, arg0: WritableReg) -> Reg; - fn inst_results(&mut self, arg0: Inst) -> ValueSlice; - fn first_result(&mut self, arg0: Inst) -> Option; - fn inst_data(&mut self, arg0: Inst) -> InstructionData; - fn def_inst(&mut self, arg0: Value) -> Option; - fn zero_value(&mut self, arg0: Value) -> Option; - fn is_sinkable_inst(&mut self, arg0: Value) -> Option; - fn maybe_uextend(&mut self, arg0: Value) -> Option; - fn emit(&mut self, arg0: &MInst) -> Unit; - fn sink_inst(&mut self, arg0: Inst) -> Unit; - fn emit_u64_le_const(&mut self, arg0: u64) -> VCodeConstant; - fn emit_u128_le_const(&mut self, arg0: u128) -> VCodeConstant; - fn const_to_vconst(&mut self, arg0: Constant) -> VCodeConstant; - fn avoid_div_traps(&mut self, arg0: Type) -> Option<()>; - fn tls_model(&mut self, arg0: Type) -> TlsModel; - fn tls_model_is_elf_gd(&mut self) -> Option; - fn tls_model_is_macho(&mut self) -> Option; - fn tls_model_is_coff(&mut self) -> Option; - fn preserve_frame_pointers(&mut self) -> Option; - fn box_external_name(&mut self, arg0: ExternalName) -> BoxExternalName; - fn func_ref_data(&mut self, arg0: FuncRef) -> (SigRef, ExternalName, RelocDistance); - fn symbol_value_data( - &mut self, - arg0: GlobalValue, - ) -> Option<(ExternalName, RelocDistance, i64)>; - fn reloc_distance_near(&mut self, arg0: RelocDistance) -> Option<()>; - fn vec_mask_from_immediate(&mut self, arg0: Immediate) -> Option; - fn u128_from_immediate(&mut self, arg0: Immediate) -> Option; - fn u128_from_constant(&mut self, arg0: Constant) -> Option; - fn u64_from_constant(&mut self, arg0: Constant) -> Option; - fn only_writable_reg(&mut self, arg0: WritableValueRegs) -> Option; - fn writable_regs_get(&mut self, arg0: WritableValueRegs, arg1: usize) -> WritableReg; - fn abi_num_args(&mut self, arg0: Sig) -> usize; - fn abi_get_arg(&mut self, arg0: Sig, arg1: usize) -> ABIArg; - fn abi_num_rets(&mut self, arg0: Sig) -> usize; - fn abi_get_ret(&mut self, arg0: Sig, arg1: usize) -> ABIArg; - fn abi_ret_arg(&mut self, arg0: Sig) -> Option; - fn abi_no_ret_arg(&mut self, arg0: Sig) -> Option<()>; - fn abi_sized_stack_arg_space(&mut self, arg0: Sig) -> i64; - fn abi_sized_stack_ret_space(&mut self, arg0: Sig) -> i64; - fn abi_stackslot_addr(&mut self, arg0: WritableReg, arg1: StackSlot, arg2: Offset32) -> MInst; - fn abi_dynamic_stackslot_addr(&mut self, arg0: WritableReg, arg1: DynamicStackSlot) -> MInst; - fn abi_arg_only_slot(&mut self, arg0: &ABIArg) -> Option; - fn abi_arg_struct_pointer(&mut self, arg0: &ABIArg) -> Option<(ABIArgSlot, i64, u64)>; - fn abi_arg_implicit_pointer(&mut self, arg0: &ABIArg) -> Option<(ABIArgSlot, i64, Type)>; - fn real_reg_to_reg(&mut self, arg0: RealReg) -> Reg; - fn real_reg_to_writable_reg(&mut self, arg0: RealReg) -> WritableReg; - fn gen_move(&mut self, arg0: Type, arg1: WritableReg, arg2: Reg) -> MInst; - fn gen_return(&mut self, arg0: ValueSlice) -> Unit; - fn sign_return_address_disabled(&mut self) -> Option; - fn use_lse(&mut self, arg0: Inst) -> Option<()>; - fn move_wide_const_from_u64(&mut self, arg0: Type, arg1: u64) -> Option; - fn move_wide_const_from_inverted_u64(&mut self, arg0: Type, arg1: u64) - -> Option; - fn imm_logic_from_u64(&mut self, arg0: Type, arg1: u64) -> Option; - fn imm_logic_from_imm64(&mut self, arg0: Type, arg1: Imm64) -> Option; - fn imm_shift_from_imm64(&mut self, arg0: Type, arg1: Imm64) -> Option; - fn imm_shift_from_u8(&mut self, arg0: u8) -> ImmShift; - fn imm12_from_u64(&mut self, arg0: u64) -> Option; - fn u8_into_uimm5(&mut self, arg0: u8) -> UImm5; - fn u8_into_imm12(&mut self, arg0: u8) -> Imm12; - fn u64_into_imm_logic(&mut self, arg0: Type, arg1: u64) -> ImmLogic; - fn branch_target(&mut self, arg0: &VecMachLabel, arg1: u8) -> BranchTarget; - fn targets_jt_size(&mut self, arg0: &VecMachLabel) -> u32; - fn targets_jt_space(&mut self, arg0: &VecMachLabel) -> CodeOffset; - fn targets_jt_info(&mut self, arg0: &VecMachLabel) -> BoxJTSequenceInfo; - fn min_fp_value(&mut self, arg0: bool, arg1: u8, arg2: u8) -> Reg; - fn max_fp_value(&mut self, arg0: bool, arg1: u8, arg2: u8) -> Reg; - fn fpu_op_ri_ushr(&mut self, arg0: u8, arg1: u8) -> FPUOpRI; - fn fpu_op_ri_sli(&mut self, arg0: u8, arg1: u8) -> FPUOpRIMod; - fn imm12_from_negated_u64(&mut self, arg0: u64) -> Option; - fn lshr_from_u64(&mut self, arg0: Type, arg1: u64) -> Option; - fn lshl_from_imm64(&mut self, arg0: Type, arg1: Imm64) -> Option; - fn lshl_from_u64(&mut self, arg0: Type, arg1: u64) -> Option; - fn integral_ty(&mut self, arg0: Type) -> Option; - fn valid_atomic_transaction(&mut self, arg0: Type) -> Option; - fn is_zero_simm9(&mut self, arg0: &SImm9) -> Option; - fn is_zero_uimm12(&mut self, arg0: &UImm12Scaled) -> Option; - fn extended_value_from_value(&mut self, arg0: Value) -> Option; - fn put_extended_in_reg(&mut self, arg0: &ExtendedValue) -> Reg; - fn get_extended_op(&mut self, arg0: &ExtendedValue) -> ExtendOp; - fn nzcv(&mut self, arg0: bool, arg1: bool, arg2: bool, arg3: bool) -> NZCV; - fn cond_br_zero(&mut self, arg0: Reg) -> CondBrKind; - fn cond_br_not_zero(&mut self, arg0: Reg) -> CondBrKind; - fn cond_br_cond(&mut self, arg0: &Cond) -> CondBrKind; - fn pair_amode(&mut self, arg0: Value, arg1: u32) -> PairAMode; - fn zero_reg(&mut self) -> Reg; - fn fp_reg(&mut self) -> Reg; - fn stack_reg(&mut self) -> Reg; - fn writable_link_reg(&mut self) -> WritableReg; - fn writable_zero_reg(&mut self) -> WritableReg; - fn load_constant64_full(&mut self, arg0: Type, arg1: &ImmExtend, arg2: u64) -> Reg; - fn amode(&mut self, arg0: Type, arg1: Value, arg2: u32) -> AMode; - fn constant_f32(&mut self, arg0: u64) -> Reg; - fn constant_f64(&mut self, arg0: u64) -> Reg; - fn constant_f128(&mut self, arg0: u128) -> Reg; - fn splat_const(&mut self, arg0: u64, arg1: &VectorSize) -> Reg; - fn fp_cond_code(&mut self, arg0: &FloatCC) -> Cond; - fn cond_code(&mut self, arg0: &IntCC) -> Cond; - fn invert_cond(&mut self, arg0: &Cond) -> Cond; - fn float_cc_cmp_zero_to_vec_misc_op(&mut self, arg0: &FloatCC) -> VecMisc2; - fn float_cc_cmp_zero_to_vec_misc_op_swap(&mut self, arg0: &FloatCC) -> VecMisc2; - fn fcmp_zero_cond(&mut self, arg0: &FloatCC) -> Option; - fn fcmp_zero_cond_not_eq(&mut self, arg0: &FloatCC) -> Option; - fn int_cc_cmp_zero_to_vec_misc_op(&mut self, arg0: &IntCC) -> VecMisc2; - fn int_cc_cmp_zero_to_vec_misc_op_swap(&mut self, arg0: &IntCC) -> VecMisc2; - fn icmp_zero_cond(&mut self, arg0: &IntCC) -> Option; - fn icmp_zero_cond_not_eq(&mut self, arg0: &IntCC) -> Option; - fn preg_sp(&mut self) -> PReg; - fn preg_fp(&mut self) -> PReg; - fn preg_link(&mut self) -> PReg; - fn preg_pinned(&mut self) -> PReg; - fn gen_call( - &mut self, - arg0: SigRef, - arg1: ExternalName, - arg2: RelocDistance, - arg3: ValueSlice, - ) -> InstOutput; - fn gen_call_indirect(&mut self, arg0: SigRef, arg1: Value, arg2: ValueSlice) -> InstOutput; - fn safe_divisor_from_imm64(&mut self, arg0: Imm64) -> Option; - fn shift_mask(&mut self, arg0: Type) -> ImmLogic; - fn negate_imm_shift(&mut self, arg0: Type, arg1: ImmShift) -> ImmShift; - fn rotr_mask(&mut self, arg0: Type) -> ImmLogic; - fn rotr_opposite_amount(&mut self, arg0: Type, arg1: ImmShift) -> ImmShift; - fn unpack_value_array_2(&mut self, arg0: &ValueArray2) -> (Value, Value); - fn pack_value_array_2(&mut self, arg0: Value, arg1: Value) -> ValueArray2; - fn unpack_value_array_3(&mut self, arg0: &ValueArray3) -> (Value, Value, Value); - fn pack_value_array_3(&mut self, arg0: Value, arg1: Value, arg2: Value) -> ValueArray3; -} - -pub trait ContextIter { - type Context; - type Output; - fn next(&mut self, ctx: &mut Self::Context) -> Option; -} - -pub struct ContextIterWrapper, C: Context> { - iter: I, - _ctx: PhantomData, -} -impl, C: Context> From for ContextIterWrapper { - fn from(iter: I) -> Self { - Self { - iter, - _ctx: PhantomData, - } - } -} -impl, C: Context> ContextIter for ContextIterWrapper { - type Context = C; - type Output = Item; - fn next(&mut self, _ctx: &mut Self::Context) -> Option { - self.iter.next() - } -} - -/// Internal type SideEffectNoResult: defined at src/prelude_lower.isle line 282. -#[derive(Clone, Debug)] -pub enum SideEffectNoResult { - Inst { - inst: MInst, - }, - Inst2 { - inst1: MInst, - inst2: MInst, - }, - Inst3 { - inst1: MInst, - inst2: MInst, - inst3: MInst, - }, -} - -/// Internal type ProducesFlags: defined at src/prelude_lower.isle line 324. -#[derive(Clone, Debug)] -pub enum ProducesFlags { - AlreadyExistingFlags, - ProducesFlagsSideEffect { inst: MInst }, - ProducesFlagsTwiceSideEffect { inst1: MInst, inst2: MInst }, - ProducesFlagsReturnsReg { inst: MInst, result: Reg }, - ProducesFlagsReturnsResultWithConsumer { inst: MInst, result: Reg }, -} - -/// Internal type ConsumesFlags: defined at src/prelude_lower.isle line 346. -#[derive(Clone, Debug)] -pub enum ConsumesFlags { - ConsumesFlagsSideEffect { - inst: MInst, - }, - ConsumesFlagsSideEffect2 { - inst1: MInst, - inst2: MInst, - }, - ConsumesFlagsReturnsResultWithProducer { - inst: MInst, - result: Reg, - }, - ConsumesFlagsReturnsReg { - inst: MInst, - result: Reg, - }, - ConsumesFlagsTwiceReturnsValueRegs { - inst1: MInst, - inst2: MInst, - result: ValueRegs, - }, - ConsumesFlagsFourTimesReturnsValueRegs { - inst1: MInst, - inst2: MInst, - inst3: MInst, - inst4: MInst, - result: ValueRegs, - }, -} - -/// Internal type MInst: defined at src/isa/aarch64/inst.isle line 2. -#[derive(Clone, Debug)] -pub enum MInst { - Nop0, - Nop4, - AluRRR { - alu_op: ALUOp, - size: OperandSize, - rd: WritableReg, - rn: Reg, - rm: Reg, - }, - AluRRRR { - alu_op: ALUOp3, - size: OperandSize, - rd: WritableReg, - rn: Reg, - rm: Reg, - ra: Reg, - }, - AluRRImm12 { - alu_op: ALUOp, - size: OperandSize, - rd: WritableReg, - rn: Reg, - imm12: Imm12, - }, - AluRRImmLogic { - alu_op: ALUOp, - size: OperandSize, - rd: WritableReg, - rn: Reg, - imml: ImmLogic, - }, - AluRRImmShift { - alu_op: ALUOp, - size: OperandSize, - rd: WritableReg, - rn: Reg, - immshift: ImmShift, - }, - AluRRRShift { - alu_op: ALUOp, - size: OperandSize, - rd: WritableReg, - rn: Reg, - rm: Reg, - shiftop: ShiftOpAndAmt, - }, - AluRRRExtend { - alu_op: ALUOp, - size: OperandSize, - rd: WritableReg, - rn: Reg, - rm: Reg, - extendop: ExtendOp, - }, - BitRR { - op: BitOp, - size: OperandSize, - rd: WritableReg, - rn: Reg, - }, - ULoad8 { - rd: WritableReg, - mem: AMode, - flags: MemFlags, - }, - SLoad8 { - rd: WritableReg, - mem: AMode, - flags: MemFlags, - }, - ULoad16 { - rd: WritableReg, - mem: AMode, - flags: MemFlags, - }, - SLoad16 { - rd: WritableReg, - mem: AMode, - flags: MemFlags, - }, - ULoad32 { - rd: WritableReg, - mem: AMode, - flags: MemFlags, - }, - SLoad32 { - rd: WritableReg, - mem: AMode, - flags: MemFlags, - }, - ULoad64 { - rd: WritableReg, - mem: AMode, - flags: MemFlags, - }, - Store8 { - rd: Reg, - mem: AMode, - flags: MemFlags, - }, - Store16 { - rd: Reg, - mem: AMode, - flags: MemFlags, - }, - Store32 { - rd: Reg, - mem: AMode, - flags: MemFlags, - }, - Store64 { - rd: Reg, - mem: AMode, - flags: MemFlags, - }, - StoreP64 { - rt: Reg, - rt2: Reg, - mem: PairAMode, - flags: MemFlags, - }, - LoadP64 { - rt: WritableReg, - rt2: WritableReg, - mem: PairAMode, - flags: MemFlags, - }, - Mov { - size: OperandSize, - rd: WritableReg, - rm: Reg, - }, - MovFromPReg { - rd: WritableReg, - rm: PReg, - }, - MovToPReg { - rd: PReg, - rm: Reg, - }, - MovWide { - op: MoveWideOp, - rd: WritableReg, - imm: MoveWideConst, - size: OperandSize, - }, - MovK { - rd: WritableReg, - rn: Reg, - imm: MoveWideConst, - size: OperandSize, - }, - Extend { - rd: WritableReg, - rn: Reg, - signed: bool, - from_bits: u8, - to_bits: u8, - }, - CSel { - rd: WritableReg, - cond: Cond, - rn: Reg, - rm: Reg, - }, - CSNeg { - rd: WritableReg, - cond: Cond, - rn: Reg, - rm: Reg, - }, - CSet { - rd: WritableReg, - cond: Cond, - }, - CSetm { - rd: WritableReg, - cond: Cond, - }, - CCmp { - size: OperandSize, - rn: Reg, - rm: Reg, - nzcv: NZCV, - cond: Cond, - }, - CCmpImm { - size: OperandSize, - rn: Reg, - imm: UImm5, - nzcv: NZCV, - cond: Cond, - }, - AtomicRMWLoop { - ty: Type, - op: AtomicRMWLoopOp, - flags: MemFlags, - addr: Reg, - operand: Reg, - oldval: WritableReg, - scratch1: WritableReg, - scratch2: WritableReg, - }, - AtomicCASLoop { - ty: Type, - flags: MemFlags, - addr: Reg, - expected: Reg, - replacement: Reg, - oldval: WritableReg, - scratch: WritableReg, - }, - AtomicRMW { - op: AtomicRMWOp, - rs: Reg, - rt: WritableReg, - rn: Reg, - ty: Type, - flags: MemFlags, - }, - AtomicCAS { - rd: WritableReg, - rs: Reg, - rt: Reg, - rn: Reg, - ty: Type, - flags: MemFlags, - }, - LoadAcquire { - access_ty: Type, - rt: WritableReg, - rn: Reg, - flags: MemFlags, - }, - StoreRelease { - access_ty: Type, - rt: Reg, - rn: Reg, - flags: MemFlags, - }, - Fence, - Csdb, - FpuMove64 { - rd: WritableReg, - rn: Reg, - }, - FpuMove128 { - rd: WritableReg, - rn: Reg, - }, - FpuMoveFromVec { - rd: WritableReg, - rn: Reg, - idx: u8, - size: VectorSize, - }, - FpuExtend { - rd: WritableReg, - rn: Reg, - size: ScalarSize, - }, - FpuRR { - fpu_op: FPUOp1, - size: ScalarSize, - rd: WritableReg, - rn: Reg, - }, - FpuRRR { - fpu_op: FPUOp2, - size: ScalarSize, - rd: WritableReg, - rn: Reg, - rm: Reg, - }, - FpuRRI { - fpu_op: FPUOpRI, - rd: WritableReg, - rn: Reg, - }, - FpuRRIMod { - fpu_op: FPUOpRIMod, - rd: WritableReg, - ri: Reg, - rn: Reg, - }, - FpuRRRR { - fpu_op: FPUOp3, - size: ScalarSize, - rd: WritableReg, - rn: Reg, - rm: Reg, - ra: Reg, - }, - FpuCmp { - size: ScalarSize, - rn: Reg, - rm: Reg, - }, - FpuLoad32 { - rd: WritableReg, - mem: AMode, - flags: MemFlags, - }, - FpuStore32 { - rd: Reg, - mem: AMode, - flags: MemFlags, - }, - FpuLoad64 { - rd: WritableReg, - mem: AMode, - flags: MemFlags, - }, - FpuStore64 { - rd: Reg, - mem: AMode, - flags: MemFlags, - }, - FpuLoad128 { - rd: WritableReg, - mem: AMode, - flags: MemFlags, - }, - FpuStore128 { - rd: Reg, - mem: AMode, - flags: MemFlags, - }, - FpuLoadP64 { - rt: WritableReg, - rt2: WritableReg, - mem: PairAMode, - flags: MemFlags, - }, - FpuStoreP64 { - rt: Reg, - rt2: Reg, - mem: PairAMode, - flags: MemFlags, - }, - FpuLoadP128 { - rt: WritableReg, - rt2: WritableReg, - mem: PairAMode, - flags: MemFlags, - }, - FpuStoreP128 { - rt: Reg, - rt2: Reg, - mem: PairAMode, - flags: MemFlags, - }, - LoadFpuConst64 { - rd: WritableReg, - const_data: u64, - }, - LoadFpuConst128 { - rd: WritableReg, - const_data: u128, - }, - FpuToInt { - op: FpuToIntOp, - rd: WritableReg, - rn: Reg, - }, - IntToFpu { - op: IntToFpuOp, - rd: WritableReg, - rn: Reg, - }, - FpuCSel32 { - rd: WritableReg, - rn: Reg, - rm: Reg, - cond: Cond, - }, - FpuCSel64 { - rd: WritableReg, - rn: Reg, - rm: Reg, - cond: Cond, - }, - FpuRound { - op: FpuRoundMode, - rd: WritableReg, - rn: Reg, - }, - MovToFpu { - rd: WritableReg, - rn: Reg, - size: ScalarSize, - }, - FpuMoveFPImm { - rd: WritableReg, - imm: ASIMDFPModImm, - size: ScalarSize, - }, - MovToVec { - rd: WritableReg, - ri: Reg, - rn: Reg, - idx: u8, - size: VectorSize, - }, - MovFromVec { - rd: WritableReg, - rn: Reg, - idx: u8, - size: ScalarSize, - }, - MovFromVecSigned { - rd: WritableReg, - rn: Reg, - idx: u8, - size: VectorSize, - scalar_size: OperandSize, - }, - VecDup { - rd: WritableReg, - rn: Reg, - size: VectorSize, - }, - VecDupFromFpu { - rd: WritableReg, - rn: Reg, - size: VectorSize, - }, - VecDupFPImm { - rd: WritableReg, - imm: ASIMDFPModImm, - size: VectorSize, - }, - VecDupImm { - rd: WritableReg, - imm: ASIMDMovModImm, - invert: bool, - size: VectorSize, - }, - VecExtend { - t: VecExtendOp, - rd: WritableReg, - rn: Reg, - high_half: bool, - lane_size: ScalarSize, - }, - VecMovElement { - rd: WritableReg, - ri: Reg, - rn: Reg, - dest_idx: u8, - src_idx: u8, - size: VectorSize, - }, - VecRRLong { - op: VecRRLongOp, - rd: WritableReg, - rn: Reg, - high_half: bool, - }, - VecRRNarrowLow { - op: VecRRNarrowOp, - rd: WritableReg, - rn: Reg, - lane_size: ScalarSize, - }, - VecRRNarrowHigh { - op: VecRRNarrowOp, - rd: WritableReg, - ri: Reg, - rn: Reg, - lane_size: ScalarSize, - }, - VecRRPair { - op: VecPairOp, - rd: WritableReg, - rn: Reg, - }, - VecRRRLong { - alu_op: VecRRRLongOp, - rd: WritableReg, - rn: Reg, - rm: Reg, - high_half: bool, - }, - VecRRRLongMod { - alu_op: VecRRRLongModOp, - rd: WritableReg, - ri: Reg, - rn: Reg, - rm: Reg, - high_half: bool, - }, - VecRRPairLong { - op: VecRRPairLongOp, - rd: WritableReg, - rn: Reg, - }, - VecRRR { - alu_op: VecALUOp, - rd: WritableReg, - rn: Reg, - rm: Reg, - size: VectorSize, - }, - VecRRRMod { - alu_op: VecALUModOp, - rd: WritableReg, - ri: Reg, - rn: Reg, - rm: Reg, - size: VectorSize, - }, - VecMisc { - op: VecMisc2, - rd: WritableReg, - rn: Reg, - size: VectorSize, - }, - VecLanes { - op: VecLanesOp, - rd: WritableReg, - rn: Reg, - size: VectorSize, - }, - VecShiftImm { - op: VecShiftImmOp, - rd: WritableReg, - rn: Reg, - size: VectorSize, - imm: u8, - }, - VecShiftImmMod { - op: VecShiftImmModOp, - rd: WritableReg, - ri: Reg, - rn: Reg, - size: VectorSize, - imm: u8, - }, - VecExtract { - rd: WritableReg, - rn: Reg, - rm: Reg, - imm4: u8, - }, - VecTbl { - rd: WritableReg, - rn: Reg, - rm: Reg, - }, - VecTblExt { - rd: WritableReg, - ri: Reg, - rn: Reg, - rm: Reg, - }, - VecTbl2 { - rd: WritableReg, - rn: Reg, - rn2: Reg, - rm: Reg, - }, - VecTbl2Ext { - rd: WritableReg, - ri: Reg, - rn: Reg, - rn2: Reg, - rm: Reg, - }, - VecLoadReplicate { - rd: WritableReg, - rn: Reg, - size: VectorSize, - flags: MemFlags, - }, - VecCSel { - rd: WritableReg, - rn: Reg, - rm: Reg, - cond: Cond, - }, - MovToNZCV { - rn: Reg, - }, - MovFromNZCV { - rd: WritableReg, - }, - Call { - info: BoxCallInfo, - }, - CallInd { - info: BoxCallIndInfo, - }, - Args { - args: VecArgPair, - }, - Ret { - rets: VecRetPair, - }, - AuthenticatedRet { - key: APIKey, - is_hint: bool, - rets: VecRetPair, - }, - Jump { - dest: BranchTarget, - }, - CondBr { - taken: BranchTarget, - not_taken: BranchTarget, - kind: CondBrKind, - }, - TrapIf { - kind: CondBrKind, - trap_code: TrapCode, - }, - IndirectBr { - rn: Reg, - targets: VecMachLabel, - }, - Brk, - Udf { - trap_code: TrapCode, - }, - Adr { - rd: WritableReg, - off: i32, - }, - Word4 { - data: u32, - }, - Word8 { - data: u64, - }, - JTSequence { - info: BoxJTSequenceInfo, - ridx: Reg, - rtmp1: WritableReg, - rtmp2: WritableReg, - }, - LoadExtName { - rd: WritableReg, - name: BoxExternalName, - offset: i64, - }, - LoadAddr { - rd: WritableReg, - mem: AMode, - }, - Pacisp { - key: APIKey, - }, - Xpaclri, - Bti { - targets: BranchTargetType, - }, - VirtualSPOffsetAdj { - offset: i64, - }, - EmitIsland { - needed_space: CodeOffset, - }, - ElfTlsGetAddr { - symbol: ExternalName, - rd: WritableReg, - }, - Unwind { - inst: UnwindInst, - }, - DummyUse { - reg: Reg, - }, - StackProbeLoop { - start: WritableReg, - end: Reg, - step: Imm12, - }, -} - -/// Internal type ALUOp: defined at src/isa/aarch64/inst.isle line 951. -#[derive(Copy, Clone, PartialEq, Eq, Debug)] -pub enum ALUOp { - Add, - Sub, - Orr, - OrrNot, - And, - AndS, - AndNot, - Eor, - EorNot, - AddS, - SubS, - SMulH, - UMulH, - SDiv, - UDiv, - RotR, - Lsr, - Asr, - Lsl, - Adc, - AdcS, - Sbc, - SbcS, -} - -/// Internal type ALUOp3: defined at src/isa/aarch64/inst.isle line 989. -#[derive(Copy, Clone, PartialEq, Eq, Debug)] -pub enum ALUOp3 { - MAdd, - MSub, -} - -/// Internal type MoveWideOp: defined at src/isa/aarch64/inst.isle line 997. -#[derive(Copy, Clone, PartialEq, Eq, Debug)] -pub enum MoveWideOp { - MovZ, - MovN, -} - -/// Internal type BitOp: defined at src/isa/aarch64/inst.isle line 1035. -#[derive(Copy, Clone, PartialEq, Eq, Debug)] -pub enum BitOp { - RBit, - Clz, - Cls, - Rev16, - Rev32, - Rev64, -} - -/// Internal type AMode: defined at src/isa/aarch64/inst.isle line 1052. -#[derive(Clone, Debug)] -pub enum AMode { - SPPostIndexed { - simm9: SImm9, - }, - SPPreIndexed { - simm9: SImm9, - }, - RegReg { - rn: Reg, - rm: Reg, - }, - RegScaled { - rn: Reg, - rm: Reg, - ty: Type, - }, - RegScaledExtended { - rn: Reg, - rm: Reg, - ty: Type, - extendop: ExtendOp, - }, - RegExtended { - rn: Reg, - rm: Reg, - extendop: ExtendOp, - }, - Unscaled { - rn: Reg, - simm9: SImm9, - }, - UnsignedOffset { - rn: Reg, - uimm12: UImm12Scaled, - }, - Label { - label: MemLabel, - }, - RegOffset { - rn: Reg, - off: i64, - ty: Type, - }, - SPOffset { - off: i64, - ty: Type, - }, - FPOffset { - off: i64, - ty: Type, - }, - NominalSPOffset { - off: i64, - ty: Type, - }, -} - -/// Internal type FPUOp1: defined at src/isa/aarch64/inst.isle line 1240. -#[derive(Copy, Clone, PartialEq, Eq, Debug)] -pub enum FPUOp1 { - Abs, - Neg, - Sqrt, - Cvt32To64, - Cvt64To32, -} - -/// Internal type FPUOp2: defined at src/isa/aarch64/inst.isle line 1250. -#[derive(Copy, Clone, PartialEq, Eq, Debug)] -pub enum FPUOp2 { - Add, - Sub, - Mul, - Div, - Max, - Min, -} - -/// Internal type FPUOp3: defined at src/isa/aarch64/inst.isle line 1261. -#[derive(Copy, Clone, PartialEq, Eq, Debug)] -pub enum FPUOp3 { - MAdd, -} - -/// Internal type FpuToIntOp: defined at src/isa/aarch64/inst.isle line 1267. -#[derive(Copy, Clone, PartialEq, Eq, Debug)] -pub enum FpuToIntOp { - F32ToU32, - F32ToI32, - F32ToU64, - F32ToI64, - F64ToU32, - F64ToI32, - F64ToU64, - F64ToI64, -} - -/// Internal type IntToFpuOp: defined at src/isa/aarch64/inst.isle line 1280. -#[derive(Copy, Clone, PartialEq, Eq, Debug)] -pub enum IntToFpuOp { - U32ToF32, - I32ToF32, - U32ToF64, - I32ToF64, - U64ToF32, - I64ToF32, - U64ToF64, - I64ToF64, -} - -/// Internal type FpuRoundMode: defined at src/isa/aarch64/inst.isle line 1294. -#[derive(Copy, Clone, PartialEq, Eq, Debug)] -pub enum FpuRoundMode { - Minus32, - Minus64, - Plus32, - Plus64, - Zero32, - Zero64, - Nearest32, - Nearest64, -} - -/// Internal type VecExtendOp: defined at src/isa/aarch64/inst.isle line 1307. -#[derive(Copy, Clone, PartialEq, Eq, Debug)] -pub enum VecExtendOp { - Sxtl, - Uxtl, -} - -/// Internal type VecALUOp: defined at src/isa/aarch64/inst.isle line 1316. -#[derive(Copy, Clone, PartialEq, Eq, Debug)] -pub enum VecALUOp { - Sqadd, - Uqadd, - Sqsub, - Uqsub, - Cmeq, - Cmge, - Cmgt, - Cmhs, - Cmhi, - Fcmeq, - Fcmgt, - Fcmge, - And, - Bic, - Orr, - Eor, - Umaxp, - Add, - Sub, - Mul, - Sshl, - Ushl, - Umin, - Smin, - Umax, - Smax, - Urhadd, - Fadd, - Fsub, - Fdiv, - Fmax, - Fmin, - Fmul, - Addp, - Zip1, - Sqrdmulh, -} - -/// Internal type VecALUModOp: defined at src/isa/aarch64/inst.isle line 1393. -#[derive(Copy, Clone, PartialEq, Eq, Debug)] -pub enum VecALUModOp { - Bsl, - Fmla, -} - -/// Internal type VecMisc2: defined at src/isa/aarch64/inst.isle line 1402. -#[derive(Copy, Clone, PartialEq, Eq, Debug)] -pub enum VecMisc2 { - Not, - Neg, - Abs, - Fabs, - Fneg, - Fsqrt, - Rev64, - Fcvtzs, - Fcvtzu, - Scvtf, - Ucvtf, - Frintn, - Frintz, - Frintm, - Frintp, - Cnt, - Cmeq0, - Cmge0, - Cmgt0, - Cmle0, - Cmlt0, - Fcmeq0, - Fcmge0, - Fcmgt0, - Fcmle0, - Fcmlt0, -} - -/// Internal type VecRRLongOp: defined at src/isa/aarch64/inst.isle line 1459. -#[derive(Copy, Clone, PartialEq, Eq, Debug)] -pub enum VecRRLongOp { - Fcvtl16, - Fcvtl32, - Shll8, - Shll16, - Shll32, -} - -/// Internal type VecRRNarrowOp: defined at src/isa/aarch64/inst.isle line 1474. -#[derive(Copy, Clone, PartialEq, Eq, Debug)] -pub enum VecRRNarrowOp { - Xtn, - Sqxtn, - Sqxtun, - Uqxtn, - Fcvtn, -} - -/// Internal type VecRRRLongOp: defined at src/isa/aarch64/inst.isle line 1488. -#[derive(Copy, Clone, PartialEq, Eq, Debug)] -pub enum VecRRRLongOp { - Smull8, - Smull16, - Smull32, - Umull8, - Umull16, - Umull32, -} - -/// Internal type VecRRRLongModOp: defined at src/isa/aarch64/inst.isle line 1500. -#[derive(Copy, Clone, PartialEq, Eq, Debug)] -pub enum VecRRRLongModOp { - Umlal8, - Umlal16, - Umlal32, -} - -/// Internal type VecPairOp: defined at src/isa/aarch64/inst.isle line 1509. -#[derive(Copy, Clone, PartialEq, Eq, Debug)] -pub enum VecPairOp { - Addp, -} - -/// Internal type VecRRPairLongOp: defined at src/isa/aarch64/inst.isle line 1517. -#[derive(Copy, Clone, PartialEq, Eq, Debug)] -pub enum VecRRPairLongOp { - Saddlp8, - Saddlp16, - Uaddlp8, - Uaddlp16, -} - -/// Internal type VecLanesOp: defined at src/isa/aarch64/inst.isle line 1528. -#[derive(Copy, Clone, PartialEq, Eq, Debug)] -pub enum VecLanesOp { - Addv, - Uminv, -} - -/// Internal type VecShiftImmOp: defined at src/isa/aarch64/inst.isle line 1537. -#[derive(Copy, Clone, PartialEq, Eq, Debug)] -pub enum VecShiftImmOp { - Shl, - Ushr, - Sshr, -} - -/// Internal type VecShiftImmModOp: defined at src/isa/aarch64/inst.isle line 1548. -#[derive(Copy, Clone, PartialEq, Eq, Debug)] -pub enum VecShiftImmModOp { - Sli, -} - -/// Internal type AtomicRMWOp: defined at src/isa/aarch64/inst.isle line 1555. -#[derive(Copy, Clone, PartialEq, Eq, Debug)] -pub enum AtomicRMWOp { - Add, - Clr, - Eor, - Set, - Smax, - Smin, - Umax, - Umin, - Swp, -} - -/// Internal type AtomicRMWLoopOp: defined at src/isa/aarch64/inst.isle line 1570. -#[derive(Copy, Clone, PartialEq, Eq, Debug)] -pub enum AtomicRMWLoopOp { - Add, - Sub, - And, - Nand, - Eor, - Orr, - Smax, - Smin, - Umax, - Umin, - Xchg, -} - -/// Internal type APIKey: defined at src/isa/aarch64/inst.isle line 1586. -#[derive(Copy, Clone, PartialEq, Eq, Debug)] -pub enum APIKey { - A, - B, -} - -/// Internal type BranchTargetType: defined at src/isa/aarch64/inst.isle line 1593. -#[derive(Copy, Clone, PartialEq, Eq, Debug)] -pub enum BranchTargetType { - None, - C, - J, - JC, -} - -/// Internal type ImmExtend: defined at src/isa/aarch64/inst.isle line 2739. -#[derive(Copy, Clone, PartialEq, Eq, Debug)] -pub enum ImmExtend { - Sign, - Zero, -} - -/// Internal type FlagsAndCC: defined at src/isa/aarch64/inst.isle line 3435. -#[derive(Clone, Debug)] -pub enum FlagsAndCC { - FlagsAndCC { flags: ProducesFlags, cc: IntCC }, -} - -// Generated as internal constructor for term output_reg. -pub fn constructor_output_reg(ctx: &mut C, arg0: Reg) -> InstOutput { - let pattern0_0 = arg0; - // Rule at src/prelude_lower.isle line 55. - let expr0_0 = C::value_reg(ctx, pattern0_0); - let expr1_0 = C::output(ctx, expr0_0); - return expr1_0; -} - -// Generated as internal constructor for term output_value. -pub fn constructor_output_value(ctx: &mut C, arg0: Value) -> InstOutput { - let pattern0_0 = arg0; - // Rule at src/prelude_lower.isle line 59. - let expr0_0 = C::put_in_regs(ctx, pattern0_0); - let expr1_0 = C::output(ctx, expr0_0); - return expr1_0; -} - -// Generated as internal constructor for term temp_reg. -pub fn constructor_temp_reg(ctx: &mut C, arg0: Type) -> Reg { - let pattern0_0 = arg0; - // Rule at src/prelude_lower.isle line 79. - let expr0_0 = C::temp_writable_reg(ctx, pattern0_0); - let expr1_0 = C::writable_reg_to_reg(ctx, expr0_0); - return expr1_0; -} - -// Generated as internal constructor for term value_regs_range. -pub fn constructor_value_regs_range(ctx: &mut C, arg0: ValueRegs) -> Range { - let pattern0_0 = arg0; - // Rule at src/prelude_lower.isle line 128. - let expr0_0: usize = 0i128 as usize; - let expr1_0 = C::value_regs_len(ctx, pattern0_0); - let expr2_0 = C::range(ctx, expr0_0, expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term lo_reg. -pub fn constructor_lo_reg(ctx: &mut C, arg0: Value) -> Reg { - let pattern0_0 = arg0; - // Rule at src/prelude_lower.isle line 139. - let expr0_0 = C::put_in_regs(ctx, pattern0_0); - let expr1_0: usize = 0i128 as usize; - let expr2_0 = C::value_regs_get(ctx, expr0_0, expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term emit_side_effect. -pub fn constructor_emit_side_effect(ctx: &mut C, arg0: &SideEffectNoResult) -> Unit { - let pattern0_0 = arg0; - match pattern0_0 { - &SideEffectNoResult::Inst { - inst: ref pattern1_0, - } => { - // Rule at src/prelude_lower.isle line 292. - let expr0_0 = C::emit(ctx, pattern1_0); - return expr0_0; - } - &SideEffectNoResult::Inst2 { - inst1: ref pattern1_0, - inst2: ref pattern1_1, - } => { - // Rule at src/prelude_lower.isle line 294. - let expr0_0 = C::emit(ctx, pattern1_0); - let expr1_0 = C::emit(ctx, pattern1_1); - return expr1_0; - } - &SideEffectNoResult::Inst3 { - inst1: ref pattern1_0, - inst2: ref pattern1_1, - inst3: ref pattern1_2, - } => { - // Rule at src/prelude_lower.isle line 297. - let expr0_0 = C::emit(ctx, pattern1_0); - let expr1_0 = C::emit(ctx, pattern1_1); - let expr2_0 = C::emit(ctx, pattern1_2); - return expr2_0; - } - _ => {} - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "emit_side_effect", "src/prelude_lower.isle line 291" - ); -} - -// Generated as internal constructor for term side_effect. -pub fn constructor_side_effect(ctx: &mut C, arg0: &SideEffectNoResult) -> InstOutput { - let pattern0_0 = arg0; - // Rule at src/prelude_lower.isle line 305. - let expr0_0 = constructor_emit_side_effect(ctx, pattern0_0); - let expr1_0 = C::output_none(ctx); - return expr1_0; -} - -// Generated as internal constructor for term side_effect_concat. -pub fn constructor_side_effect_concat( - ctx: &mut C, - arg0: &SideEffectNoResult, - arg1: &SideEffectNoResult, -) -> SideEffectNoResult { - let pattern0_0 = arg0; - match pattern0_0 { - &SideEffectNoResult::Inst { - inst: ref pattern1_0, - } => { - let pattern2_0 = arg1; - match pattern2_0 { - &SideEffectNoResult::Inst { - inst: ref pattern3_0, - } => { - // Rule at src/prelude_lower.isle line 310. - let expr0_0 = SideEffectNoResult::Inst2 { - inst1: pattern1_0.clone(), - inst2: pattern3_0.clone(), - }; - return expr0_0; - } - &SideEffectNoResult::Inst2 { - inst1: ref pattern3_0, - inst2: ref pattern3_1, - } => { - // Rule at src/prelude_lower.isle line 312. - let expr0_0 = SideEffectNoResult::Inst3 { - inst1: pattern1_0.clone(), - inst2: pattern3_0.clone(), - inst3: pattern3_1.clone(), - }; - return expr0_0; - } - _ => {} - } - } - &SideEffectNoResult::Inst2 { - inst1: ref pattern1_0, - inst2: ref pattern1_1, - } => { - let pattern2_0 = arg1; - if let &SideEffectNoResult::Inst { - inst: ref pattern3_0, - } = pattern2_0 - { - // Rule at src/prelude_lower.isle line 314. - let expr0_0 = SideEffectNoResult::Inst3 { - inst1: pattern1_0.clone(), - inst2: pattern1_1.clone(), - inst3: pattern3_0.clone(), - }; - return expr0_0; - } - } - _ => {} - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "side_effect_concat", "src/prelude_lower.isle line 309" - ); -} - -// Generated as internal constructor for term produces_flags_append. -pub fn constructor_produces_flags_append( - ctx: &mut C, - arg0: &ProducesFlags, - arg1: &MInst, -) -> ProducesFlags { - let pattern0_0 = arg0; - if let &ProducesFlags::ProducesFlagsSideEffect { - inst: ref pattern1_0, - } = pattern0_0 - { - let pattern2_0 = arg1; - // Rule at src/prelude_lower.isle line 339. - let expr0_0 = ProducesFlags::ProducesFlagsTwiceSideEffect { - inst1: pattern1_0.clone(), - inst2: pattern2_0.clone(), - }; - return expr0_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "produces_flags_append", "src/prelude_lower.isle line 338" - ); -} - -// Generated as internal constructor for term produces_flags_get_reg. -pub fn constructor_produces_flags_get_reg(ctx: &mut C, arg0: &ProducesFlags) -> Reg { - let pattern0_0 = arg0; - if let &ProducesFlags::ProducesFlagsReturnsReg { - inst: ref pattern1_0, - result: pattern1_1, - } = pattern0_0 - { - // Rule at src/prelude_lower.isle line 364. - return pattern1_1; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "produces_flags_get_reg", "src/prelude_lower.isle line 363" - ); -} - -// Generated as internal constructor for term produces_flags_ignore. -pub fn constructor_produces_flags_ignore( - ctx: &mut C, - arg0: &ProducesFlags, -) -> ProducesFlags { - let pattern0_0 = arg0; - match pattern0_0 { - &ProducesFlags::ProducesFlagsReturnsReg { - inst: ref pattern1_0, - result: pattern1_1, - } => { - // Rule at src/prelude_lower.isle line 369. - let expr0_0 = ProducesFlags::ProducesFlagsSideEffect { - inst: pattern1_0.clone(), - }; - return expr0_0; - } - &ProducesFlags::ProducesFlagsReturnsResultWithConsumer { - inst: ref pattern1_0, - result: pattern1_1, - } => { - // Rule at src/prelude_lower.isle line 371. - let expr0_0 = ProducesFlags::ProducesFlagsSideEffect { - inst: pattern1_0.clone(), - }; - return expr0_0; - } - _ => {} - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "produces_flags_ignore", "src/prelude_lower.isle line 368" - ); -} - -// Generated as internal constructor for term consumes_flags_concat. -pub fn constructor_consumes_flags_concat( - ctx: &mut C, - arg0: &ConsumesFlags, - arg1: &ConsumesFlags, -) -> ConsumesFlags { - let pattern0_0 = arg0; - match pattern0_0 { - &ConsumesFlags::ConsumesFlagsSideEffect { - inst: ref pattern1_0, - } => { - let pattern2_0 = arg1; - if let &ConsumesFlags::ConsumesFlagsSideEffect { - inst: ref pattern3_0, - } = pattern2_0 - { - // Rule at src/prelude_lower.isle line 384. - let expr0_0 = ConsumesFlags::ConsumesFlagsSideEffect2 { - inst1: pattern1_0.clone(), - inst2: pattern3_0.clone(), - }; - return expr0_0; - } - } - &ConsumesFlags::ConsumesFlagsReturnsReg { - inst: ref pattern1_0, - result: pattern1_1, - } => { - let pattern2_0 = arg1; - if let &ConsumesFlags::ConsumesFlagsReturnsReg { - inst: ref pattern3_0, - result: pattern3_1, - } = pattern2_0 - { - // Rule at src/prelude_lower.isle line 378. - let expr0_0 = C::value_regs(ctx, pattern1_1, pattern3_1); - let expr1_0 = ConsumesFlags::ConsumesFlagsTwiceReturnsValueRegs { - inst1: pattern1_0.clone(), - inst2: pattern3_0.clone(), - result: expr0_0, - }; - return expr1_0; - } - } - _ => {} - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "consumes_flags_concat", "src/prelude_lower.isle line 377" - ); -} - -// Generated as internal constructor for term with_flags. -pub fn constructor_with_flags( - ctx: &mut C, - arg0: &ProducesFlags, - arg1: &ConsumesFlags, -) -> ValueRegs { - let pattern0_0 = arg0; - match pattern0_0 { - &ProducesFlags::ProducesFlagsSideEffect { - inst: ref pattern1_0, - } => { - let pattern2_0 = arg1; - match pattern2_0 { - &ConsumesFlags::ConsumesFlagsReturnsReg { - inst: ref pattern3_0, - result: pattern3_1, - } => { - // Rule at src/prelude_lower.isle line 415. - let expr0_0 = C::emit(ctx, pattern1_0); - let expr1_0 = C::emit(ctx, pattern3_0); - let expr2_0 = C::value_reg(ctx, pattern3_1); - return expr2_0; - } - &ConsumesFlags::ConsumesFlagsTwiceReturnsValueRegs { - inst1: ref pattern3_0, - inst2: ref pattern3_1, - result: pattern3_2, - } => { - // Rule at src/prelude_lower.isle line 421. - let expr0_0 = C::emit(ctx, pattern1_0); - let expr1_0 = C::emit(ctx, pattern3_0); - let expr2_0 = C::emit(ctx, pattern3_1); - return pattern3_2; - } - &ConsumesFlags::ConsumesFlagsFourTimesReturnsValueRegs { - inst1: ref pattern3_0, - inst2: ref pattern3_1, - inst3: ref pattern3_2, - inst4: ref pattern3_3, - result: pattern3_4, - } => { - // Rule at src/prelude_lower.isle line 433. - let expr0_0 = C::emit(ctx, pattern1_0); - let expr1_0 = C::emit(ctx, pattern3_0); - let expr2_0 = C::emit(ctx, pattern3_1); - let expr3_0 = C::emit(ctx, pattern3_2); - let expr4_0 = C::emit(ctx, pattern3_3); - return pattern3_4; - } - _ => {} - } - } - &ProducesFlags::ProducesFlagsReturnsResultWithConsumer { - inst: ref pattern1_0, - result: pattern1_1, - } => { - let pattern2_0 = arg1; - match pattern2_0 { - &ConsumesFlags::ConsumesFlagsSideEffect { - inst: ref pattern3_0, - } => { - // Rule at src/prelude_lower.isle line 409. - let expr0_0 = C::emit(ctx, pattern1_0); - let expr1_0 = C::emit(ctx, pattern3_0); - let expr2_0 = C::value_reg(ctx, pattern1_1); - return expr2_0; - } - &ConsumesFlags::ConsumesFlagsReturnsResultWithProducer { - inst: ref pattern3_0, - result: pattern3_1, - } => { - // Rule at src/prelude_lower.isle line 401. - let expr0_0 = C::emit(ctx, pattern1_0); - let expr1_0 = C::emit(ctx, pattern3_0); - let expr2_0 = C::value_regs(ctx, pattern1_1, pattern3_1); - return expr2_0; - } - _ => {} - } - } - &ProducesFlags::ProducesFlagsTwiceSideEffect { - inst1: ref pattern1_0, - inst2: ref pattern1_1, - } => { - let pattern2_0 = arg1; - match pattern2_0 { - &ConsumesFlags::ConsumesFlagsReturnsReg { - inst: ref pattern3_0, - result: pattern3_1, - } => { - // Rule at src/prelude_lower.isle line 449. - let expr0_0 = C::emit(ctx, pattern1_0); - let expr1_0 = C::emit(ctx, pattern1_1); - let expr2_0 = C::emit(ctx, pattern3_0); - let expr3_0 = C::value_reg(ctx, pattern3_1); - return expr3_0; - } - &ConsumesFlags::ConsumesFlagsTwiceReturnsValueRegs { - inst1: ref pattern3_0, - inst2: ref pattern3_1, - result: pattern3_2, - } => { - // Rule at src/prelude_lower.isle line 456. - let expr0_0 = C::emit(ctx, pattern1_0); - let expr1_0 = C::emit(ctx, pattern1_1); - let expr2_0 = C::emit(ctx, pattern3_0); - let expr3_0 = C::emit(ctx, pattern3_1); - return pattern3_2; - } - &ConsumesFlags::ConsumesFlagsFourTimesReturnsValueRegs { - inst1: ref pattern3_0, - inst2: ref pattern3_1, - inst3: ref pattern3_2, - inst4: ref pattern3_3, - result: pattern3_4, - } => { - // Rule at src/prelude_lower.isle line 469. - let expr0_0 = C::emit(ctx, pattern1_0); - let expr1_0 = C::emit(ctx, pattern1_1); - let expr2_0 = C::emit(ctx, pattern3_0); - let expr3_0 = C::emit(ctx, pattern3_1); - let expr4_0 = C::emit(ctx, pattern3_2); - let expr5_0 = C::emit(ctx, pattern3_3); - return pattern3_4; - } - _ => {} - } - } - _ => {} - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "with_flags", "src/prelude_lower.isle line 399" - ); -} - -// Generated as internal constructor for term with_flags_reg. -pub fn constructor_with_flags_reg( - ctx: &mut C, - arg0: &ProducesFlags, - arg1: &ConsumesFlags, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/prelude_lower.isle line 487. - let expr0_0 = constructor_with_flags(ctx, pattern0_0, pattern1_0); - let expr1_0: usize = 0i128 as usize; - let expr2_0 = C::value_regs_get(ctx, expr0_0, expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term flags_to_producesflags. -pub fn constructor_flags_to_producesflags(ctx: &mut C, arg0: Value) -> ProducesFlags { - let pattern0_0 = arg0; - // Rule at src/prelude_lower.isle line 494. - let expr0_0 = C::mark_value_used(ctx, pattern0_0); - let expr1_0 = ProducesFlags::AlreadyExistingFlags; - return expr1_0; -} - -// Generated as internal constructor for term with_flags_side_effect. -pub fn constructor_with_flags_side_effect( - ctx: &mut C, - arg0: &ProducesFlags, - arg1: &ConsumesFlags, -) -> SideEffectNoResult { - let pattern0_0 = arg0; - match pattern0_0 { - &ProducesFlags::AlreadyExistingFlags => { - let pattern2_0 = arg1; - match pattern2_0 { - &ConsumesFlags::ConsumesFlagsSideEffect { - inst: ref pattern3_0, - } => { - // Rule at src/prelude_lower.isle line 505. - let expr0_0 = SideEffectNoResult::Inst { - inst: pattern3_0.clone(), - }; - return expr0_0; - } - &ConsumesFlags::ConsumesFlagsSideEffect2 { - inst1: ref pattern3_0, - inst2: ref pattern3_1, - } => { - // Rule at src/prelude_lower.isle line 510. - let expr0_0 = SideEffectNoResult::Inst2 { - inst1: pattern3_0.clone(), - inst2: pattern3_1.clone(), - }; - return expr0_0; - } - _ => {} - } - } - &ProducesFlags::ProducesFlagsSideEffect { - inst: ref pattern1_0, - } => { - let pattern2_0 = arg1; - match pattern2_0 { - &ConsumesFlags::ConsumesFlagsSideEffect { - inst: ref pattern3_0, - } => { - // Rule at src/prelude_lower.isle line 515. - let expr0_0 = SideEffectNoResult::Inst2 { - inst1: pattern1_0.clone(), - inst2: pattern3_0.clone(), - }; - return expr0_0; - } - &ConsumesFlags::ConsumesFlagsSideEffect2 { - inst1: ref pattern3_0, - inst2: ref pattern3_1, - } => { - // Rule at src/prelude_lower.isle line 520. - let expr0_0 = SideEffectNoResult::Inst3 { - inst1: pattern1_0.clone(), - inst2: pattern3_0.clone(), - inst3: pattern3_1.clone(), - }; - return expr0_0; - } - _ => {} - } - } - &ProducesFlags::ProducesFlagsTwiceSideEffect { - inst1: ref pattern1_0, - inst2: ref pattern1_1, - } => { - let pattern2_0 = arg1; - if let &ConsumesFlags::ConsumesFlagsSideEffect { - inst: ref pattern3_0, - } = pattern2_0 - { - // Rule at src/prelude_lower.isle line 525. - let expr0_0 = SideEffectNoResult::Inst3 { - inst1: pattern1_0.clone(), - inst2: pattern1_1.clone(), - inst3: pattern3_0.clone(), - }; - return expr0_0; - } - } - _ => {} - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "with_flags_side_effect", "src/prelude_lower.isle line 503" - ); -} - -// Generated as internal constructor for term lower_return. -pub fn constructor_lower_return( - ctx: &mut C, - arg0: Range, - arg1: ValueSlice, -) -> InstOutput { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/prelude_lower.isle line 705. - let expr0_0 = C::gen_return(ctx, pattern1_0); - let expr1_0 = C::output_none(ctx); - return expr1_0; -} - -// Generated as internal constructor for term operand_size. -pub fn constructor_operand_size(ctx: &mut C, arg0: Type) -> OperandSize { - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::fits_in_32(ctx, pattern0_0) { - // Rule at src/isa/aarch64/inst.isle line 1158. - let expr0_0 = OperandSize::Size32; - return expr0_0; - } - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::fits_in_64(ctx, pattern0_0) { - // Rule at src/isa/aarch64/inst.isle line 1159. - let expr0_0 = OperandSize::Size64; - return expr0_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "operand_size", "src/isa/aarch64/inst.isle line 1157" - ); -} - -// Generated as internal constructor for term scalar_size. -pub fn constructor_scalar_size(ctx: &mut C, arg0: Type) -> ScalarSize { - let pattern0_0 = arg0; - if pattern0_0 == I8 { - // Rule at src/isa/aarch64/inst.isle line 1171. - let expr0_0 = ScalarSize::Size8; - return expr0_0; - } - if pattern0_0 == I16 { - // Rule at src/isa/aarch64/inst.isle line 1172. - let expr0_0 = ScalarSize::Size16; - return expr0_0; - } - if pattern0_0 == I32 { - // Rule at src/isa/aarch64/inst.isle line 1173. - let expr0_0 = ScalarSize::Size32; - return expr0_0; - } - if pattern0_0 == I64 { - // Rule at src/isa/aarch64/inst.isle line 1174. - let expr0_0 = ScalarSize::Size64; - return expr0_0; - } - if pattern0_0 == I128 { - // Rule at src/isa/aarch64/inst.isle line 1175. - let expr0_0 = ScalarSize::Size128; - return expr0_0; - } - if pattern0_0 == F32 { - // Rule at src/isa/aarch64/inst.isle line 1177. - let expr0_0 = ScalarSize::Size32; - return expr0_0; - } - if pattern0_0 == F64 { - // Rule at src/isa/aarch64/inst.isle line 1178. - let expr0_0 = ScalarSize::Size64; - return expr0_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "scalar_size", "src/isa/aarch64/inst.isle line 1169" - ); -} - -// Generated as internal constructor for term lane_size. -pub fn constructor_lane_size(ctx: &mut C, arg0: Type) -> ScalarSize { - let pattern0_0 = arg0; - if let Some((pattern1_0, pattern1_1)) = C::multi_lane(ctx, pattern0_0) { - if pattern1_0 == 8i128 as u32 { - // Rule at src/isa/aarch64/inst.isle line 1182. - let expr0_0 = ScalarSize::Size8; - return expr0_0; - } - if pattern1_0 == 16i128 as u32 { - // Rule at src/isa/aarch64/inst.isle line 1183. - let expr0_0 = ScalarSize::Size16; - return expr0_0; - } - if pattern1_0 == 32i128 as u32 { - // Rule at src/isa/aarch64/inst.isle line 1184. - let expr0_0 = ScalarSize::Size32; - return expr0_0; - } - if pattern1_0 == 64i128 as u32 { - // Rule at src/isa/aarch64/inst.isle line 1185. - let expr0_0 = ScalarSize::Size64; - return expr0_0; - } - } - let pattern0_0 = arg0; - if let Some((pattern1_0, pattern1_1)) = C::dynamic_lane(ctx, pattern0_0) { - if pattern1_0 == 8i128 as u32 { - // Rule at src/isa/aarch64/inst.isle line 1186. - let expr0_0 = ScalarSize::Size8; - return expr0_0; - } - if pattern1_0 == 16i128 as u32 { - // Rule at src/isa/aarch64/inst.isle line 1187. - let expr0_0 = ScalarSize::Size16; - return expr0_0; - } - if pattern1_0 == 32i128 as u32 { - // Rule at src/isa/aarch64/inst.isle line 1188. - let expr0_0 = ScalarSize::Size32; - return expr0_0; - } - if pattern1_0 == 64i128 as u32 { - // Rule at src/isa/aarch64/inst.isle line 1189. - let expr0_0 = ScalarSize::Size64; - return expr0_0; - } - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "lane_size", "src/isa/aarch64/inst.isle line 1181" - ); -} - -// Generated as internal constructor for term vector_size. -pub fn constructor_vector_size(ctx: &mut C, arg0: Type) -> VectorSize { - let pattern0_0 = arg0; - if let Some((pattern1_0, pattern1_1)) = C::multi_lane(ctx, pattern0_0) { - if pattern1_0 == 8i128 as u32 { - if pattern1_1 == 8i128 as u32 { - // Rule at src/isa/aarch64/inst.isle line 1224. - let expr0_0 = VectorSize::Size8x8; - return expr0_0; - } - if pattern1_1 == 16i128 as u32 { - // Rule at src/isa/aarch64/inst.isle line 1225. - let expr0_0 = VectorSize::Size8x16; - return expr0_0; - } - } - if pattern1_0 == 16i128 as u32 { - if pattern1_1 == 4i128 as u32 { - // Rule at src/isa/aarch64/inst.isle line 1226. - let expr0_0 = VectorSize::Size16x4; - return expr0_0; - } - if pattern1_1 == 8i128 as u32 { - // Rule at src/isa/aarch64/inst.isle line 1227. - let expr0_0 = VectorSize::Size16x8; - return expr0_0; - } - } - if pattern1_0 == 32i128 as u32 { - if pattern1_1 == 2i128 as u32 { - // Rule at src/isa/aarch64/inst.isle line 1228. - let expr0_0 = VectorSize::Size32x2; - return expr0_0; - } - if pattern1_1 == 4i128 as u32 { - // Rule at src/isa/aarch64/inst.isle line 1229. - let expr0_0 = VectorSize::Size32x4; - return expr0_0; - } - } - if pattern1_0 == 64i128 as u32 { - if pattern1_1 == 2i128 as u32 { - // Rule at src/isa/aarch64/inst.isle line 1230. - let expr0_0 = VectorSize::Size64x2; - return expr0_0; - } - } - } - let pattern0_0 = arg0; - if let Some((pattern1_0, pattern1_1)) = C::dynamic_lane(ctx, pattern0_0) { - if pattern1_0 == 8i128 as u32 { - if pattern1_1 == 8i128 as u32 { - // Rule at src/isa/aarch64/inst.isle line 1231. - let expr0_0 = VectorSize::Size8x8; - return expr0_0; - } - if pattern1_1 == 16i128 as u32 { - // Rule at src/isa/aarch64/inst.isle line 1232. - let expr0_0 = VectorSize::Size8x16; - return expr0_0; - } - } - if pattern1_0 == 16i128 as u32 { - if pattern1_1 == 4i128 as u32 { - // Rule at src/isa/aarch64/inst.isle line 1233. - let expr0_0 = VectorSize::Size16x4; - return expr0_0; - } - if pattern1_1 == 8i128 as u32 { - // Rule at src/isa/aarch64/inst.isle line 1234. - let expr0_0 = VectorSize::Size16x8; - return expr0_0; - } - } - if pattern1_0 == 32i128 as u32 { - if pattern1_1 == 2i128 as u32 { - // Rule at src/isa/aarch64/inst.isle line 1235. - let expr0_0 = VectorSize::Size32x2; - return expr0_0; - } - if pattern1_1 == 4i128 as u32 { - // Rule at src/isa/aarch64/inst.isle line 1236. - let expr0_0 = VectorSize::Size32x4; - return expr0_0; - } - } - if pattern1_0 == 64i128 as u32 { - if pattern1_1 == 2i128 as u32 { - // Rule at src/isa/aarch64/inst.isle line 1237. - let expr0_0 = VectorSize::Size64x2; - return expr0_0; - } - } - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "vector_size", "src/isa/aarch64/inst.isle line 1223" - ); -} - -// Generated as internal constructor for term value_regs_zero. -pub fn constructor_value_regs_zero(ctx: &mut C) -> ValueRegs { - // Rule at src/isa/aarch64/inst.isle line 1759. - let expr0_0: Type = I64; - let expr1_0 = ImmExtend::Zero; - let expr2_0: u64 = 0i128 as u64; - let expr3_0 = constructor_imm(ctx, expr0_0, &expr1_0, expr2_0); - let expr4_0: Type = I64; - let expr5_0 = ImmExtend::Zero; - let expr6_0: u64 = 0i128 as u64; - let expr7_0 = constructor_imm(ctx, expr4_0, &expr5_0, expr6_0); - let expr8_0 = C::value_regs(ctx, expr3_0, expr7_0); - return expr8_0; -} - -// Generated as internal constructor for term mov. -pub fn constructor_mov(ctx: &mut C, arg0: Reg, arg1: Type) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/aarch64/inst.isle line 1767. - let expr0_0: Type = I64; - let expr1_0 = C::temp_writable_reg(ctx, expr0_0); - let expr2_0 = constructor_operand_size(ctx, pattern1_0); - let expr3_0 = MInst::Mov { - size: expr2_0, - rd: expr1_0, - rm: pattern0_0, - }; - let expr4_0 = C::emit(ctx, &expr3_0); - let expr5_0 = C::writable_reg_to_reg(ctx, expr1_0); - return expr5_0; -} - -// Generated as internal constructor for term movz. -pub fn constructor_movz(ctx: &mut C, arg0: MoveWideConst, arg1: &OperandSize) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/aarch64/inst.isle line 1774. - let expr0_0: Type = I64; - let expr1_0 = C::temp_writable_reg(ctx, expr0_0); - let expr2_0 = MoveWideOp::MovZ; - let expr3_0 = MInst::MovWide { - op: expr2_0, - rd: expr1_0, - imm: pattern0_0, - size: pattern1_0.clone(), - }; - let expr4_0 = C::emit(ctx, &expr3_0); - let expr5_0 = C::writable_reg_to_reg(ctx, expr1_0); - return expr5_0; -} - -// Generated as internal constructor for term movn. -pub fn constructor_movn(ctx: &mut C, arg0: MoveWideConst, arg1: &OperandSize) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/aarch64/inst.isle line 1781. - let expr0_0: Type = I64; - let expr1_0 = C::temp_writable_reg(ctx, expr0_0); - let expr2_0 = MoveWideOp::MovN; - let expr3_0 = MInst::MovWide { - op: expr2_0, - rd: expr1_0, - imm: pattern0_0, - size: pattern1_0.clone(), - }; - let expr4_0 = C::emit(ctx, &expr3_0); - let expr5_0 = C::writable_reg_to_reg(ctx, expr1_0); - return expr5_0; -} - -// Generated as internal constructor for term alu_rr_imm_logic. -pub fn constructor_alu_rr_imm_logic( - ctx: &mut C, - arg0: &ALUOp, - arg1: Type, - arg2: Reg, - arg3: ImmLogic, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - // Rule at src/isa/aarch64/inst.isle line 1788. - let expr0_0: Type = I64; - let expr1_0 = C::temp_writable_reg(ctx, expr0_0); - let expr2_0 = constructor_operand_size(ctx, pattern1_0); - let expr3_0 = MInst::AluRRImmLogic { - alu_op: pattern0_0.clone(), - size: expr2_0, - rd: expr1_0, - rn: pattern2_0, - imml: pattern3_0, - }; - let expr4_0 = C::emit(ctx, &expr3_0); - let expr5_0 = C::writable_reg_to_reg(ctx, expr1_0); - return expr5_0; -} - -// Generated as internal constructor for term alu_rr_imm_shift. -pub fn constructor_alu_rr_imm_shift( - ctx: &mut C, - arg0: &ALUOp, - arg1: Type, - arg2: Reg, - arg3: ImmShift, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - // Rule at src/isa/aarch64/inst.isle line 1795. - let expr0_0: Type = I64; - let expr1_0 = C::temp_writable_reg(ctx, expr0_0); - let expr2_0 = constructor_operand_size(ctx, pattern1_0); - let expr3_0 = MInst::AluRRImmShift { - alu_op: pattern0_0.clone(), - size: expr2_0, - rd: expr1_0, - rn: pattern2_0, - immshift: pattern3_0, - }; - let expr4_0 = C::emit(ctx, &expr3_0); - let expr5_0 = C::writable_reg_to_reg(ctx, expr1_0); - return expr5_0; -} - -// Generated as internal constructor for term alu_rrr. -pub fn constructor_alu_rrr( - ctx: &mut C, - arg0: &ALUOp, - arg1: Type, - arg2: Reg, - arg3: Reg, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - // Rule at src/isa/aarch64/inst.isle line 1802. - let expr0_0: Type = I64; - let expr1_0 = C::temp_writable_reg(ctx, expr0_0); - let expr2_0 = constructor_operand_size(ctx, pattern1_0); - let expr3_0 = MInst::AluRRR { - alu_op: pattern0_0.clone(), - size: expr2_0, - rd: expr1_0, - rn: pattern2_0, - rm: pattern3_0, - }; - let expr4_0 = C::emit(ctx, &expr3_0); - let expr5_0 = C::writable_reg_to_reg(ctx, expr1_0); - return expr5_0; -} - -// Generated as internal constructor for term vec_rrr. -pub fn constructor_vec_rrr( - ctx: &mut C, - arg0: &VecALUOp, - arg1: Reg, - arg2: Reg, - arg3: &VectorSize, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - // Rule at src/isa/aarch64/inst.isle line 1809. - let expr0_0: Type = I8X16; - let expr1_0 = C::temp_writable_reg(ctx, expr0_0); - let expr2_0 = MInst::VecRRR { - alu_op: pattern0_0.clone(), - rd: expr1_0, - rn: pattern1_0, - rm: pattern2_0, - size: pattern3_0.clone(), - }; - let expr3_0 = C::emit(ctx, &expr2_0); - let expr4_0 = C::writable_reg_to_reg(ctx, expr1_0); - return expr4_0; -} - -// Generated as internal constructor for term fpu_rr. -pub fn constructor_fpu_rr( - ctx: &mut C, - arg0: &FPUOp1, - arg1: Reg, - arg2: &ScalarSize, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/aarch64/inst.isle line 1816. - let expr0_0: Type = F64; - let expr1_0 = C::temp_writable_reg(ctx, expr0_0); - let expr2_0 = MInst::FpuRR { - fpu_op: pattern0_0.clone(), - size: pattern2_0.clone(), - rd: expr1_0, - rn: pattern1_0, - }; - let expr3_0 = C::emit(ctx, &expr2_0); - let expr4_0 = C::writable_reg_to_reg(ctx, expr1_0); - return expr4_0; -} - -// Generated as internal constructor for term vec_rrr_mod. -pub fn constructor_vec_rrr_mod( - ctx: &mut C, - arg0: &VecALUModOp, - arg1: Reg, - arg2: Reg, - arg3: Reg, - arg4: &VectorSize, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - let pattern4_0 = arg4; - // Rule at src/isa/aarch64/inst.isle line 1824. - let expr0_0: Type = I8X16; - let expr1_0 = C::temp_writable_reg(ctx, expr0_0); - let expr2_0 = MInst::VecRRRMod { - alu_op: pattern0_0.clone(), - rd: expr1_0, - ri: pattern1_0, - rn: pattern2_0, - rm: pattern3_0, - size: pattern4_0.clone(), - }; - let expr3_0 = C::emit(ctx, &expr2_0); - let expr4_0 = C::writable_reg_to_reg(ctx, expr1_0); - return expr4_0; -} - -// Generated as internal constructor for term fpu_rri. -pub fn constructor_fpu_rri(ctx: &mut C, arg0: &FPUOpRI, arg1: Reg) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/aarch64/inst.isle line 1830. - let expr0_0: Type = F64; - let expr1_0 = C::temp_writable_reg(ctx, expr0_0); - let expr2_0 = MInst::FpuRRI { - fpu_op: pattern0_0.clone(), - rd: expr1_0, - rn: pattern1_0, - }; - let expr3_0 = C::emit(ctx, &expr2_0); - let expr4_0 = C::writable_reg_to_reg(ctx, expr1_0); - return expr4_0; -} - -// Generated as internal constructor for term fpu_rri_mod. -pub fn constructor_fpu_rri_mod( - ctx: &mut C, - arg0: &FPUOpRIMod, - arg1: Reg, - arg2: Reg, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/aarch64/inst.isle line 1836. - let expr0_0: Type = F64; - let expr1_0 = C::temp_writable_reg(ctx, expr0_0); - let expr2_0 = MInst::FpuRRIMod { - fpu_op: pattern0_0.clone(), - rd: expr1_0, - ri: pattern1_0, - rn: pattern2_0, - }; - let expr3_0 = C::emit(ctx, &expr2_0); - let expr4_0 = C::writable_reg_to_reg(ctx, expr1_0); - return expr4_0; -} - -// Generated as internal constructor for term fpu_rrr. -pub fn constructor_fpu_rrr( - ctx: &mut C, - arg0: &FPUOp2, - arg1: Reg, - arg2: Reg, - arg3: &ScalarSize, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - // Rule at src/isa/aarch64/inst.isle line 1843. - let expr0_0: Type = F64; - let expr1_0 = C::temp_writable_reg(ctx, expr0_0); - let expr2_0 = MInst::FpuRRR { - fpu_op: pattern0_0.clone(), - size: pattern3_0.clone(), - rd: expr1_0, - rn: pattern1_0, - rm: pattern2_0, - }; - let expr3_0 = C::emit(ctx, &expr2_0); - let expr4_0 = C::writable_reg_to_reg(ctx, expr1_0); - return expr4_0; -} - -// Generated as internal constructor for term fpu_rrrr. -pub fn constructor_fpu_rrrr( - ctx: &mut C, - arg0: &FPUOp3, - arg1: &ScalarSize, - arg2: Reg, - arg3: Reg, - arg4: Reg, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - let pattern4_0 = arg4; - // Rule at src/isa/aarch64/inst.isle line 1850. - let expr0_0: Type = F64; - let expr1_0 = C::temp_writable_reg(ctx, expr0_0); - let expr2_0 = MInst::FpuRRRR { - fpu_op: pattern0_0.clone(), - size: pattern1_0.clone(), - rd: expr1_0, - rn: pattern2_0, - rm: pattern3_0, - ra: pattern4_0, - }; - let expr3_0 = C::emit(ctx, &expr2_0); - let expr4_0 = C::writable_reg_to_reg(ctx, expr1_0); - return expr4_0; -} - -// Generated as internal constructor for term fpu_cmp. -pub fn constructor_fpu_cmp( - ctx: &mut C, - arg0: &ScalarSize, - arg1: Reg, - arg2: Reg, -) -> ProducesFlags { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/aarch64/inst.isle line 1857. - let expr0_0 = MInst::FpuCmp { - size: pattern0_0.clone(), - rn: pattern1_0, - rm: pattern2_0, - }; - let expr1_0 = ProducesFlags::ProducesFlagsSideEffect { inst: expr0_0 }; - return expr1_0; -} - -// Generated as internal constructor for term vec_lanes. -pub fn constructor_vec_lanes( - ctx: &mut C, - arg0: &VecLanesOp, - arg1: Reg, - arg2: &VectorSize, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/aarch64/inst.isle line 1863. - let expr0_0: Type = I8X16; - let expr1_0 = C::temp_writable_reg(ctx, expr0_0); - let expr2_0 = MInst::VecLanes { - op: pattern0_0.clone(), - rd: expr1_0, - rn: pattern1_0, - size: pattern2_0.clone(), - }; - let expr3_0 = C::emit(ctx, &expr2_0); - let expr4_0 = C::writable_reg_to_reg(ctx, expr1_0); - return expr4_0; -} - -// Generated as internal constructor for term vec_shift_imm. -pub fn constructor_vec_shift_imm( - ctx: &mut C, - arg0: &VecShiftImmOp, - arg1: u8, - arg2: Reg, - arg3: &VectorSize, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - // Rule at src/isa/aarch64/inst.isle line 1870. - let expr0_0: Type = I8X16; - let expr1_0 = C::temp_writable_reg(ctx, expr0_0); - let expr2_0 = MInst::VecShiftImm { - op: pattern0_0.clone(), - rd: expr1_0, - rn: pattern2_0, - size: pattern3_0.clone(), - imm: pattern1_0, - }; - let expr3_0 = C::emit(ctx, &expr2_0); - let expr4_0 = C::writable_reg_to_reg(ctx, expr1_0); - return expr4_0; -} - -// Generated as internal constructor for term vec_dup. -pub fn constructor_vec_dup(ctx: &mut C, arg0: Reg, arg1: &VectorSize) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/aarch64/inst.isle line 1877. - let expr0_0: Type = I8X16; - let expr1_0 = C::temp_writable_reg(ctx, expr0_0); - let expr2_0 = MInst::VecDup { - rd: expr1_0, - rn: pattern0_0, - size: pattern1_0.clone(), - }; - let expr3_0 = C::emit(ctx, &expr2_0); - let expr4_0 = C::writable_reg_to_reg(ctx, expr1_0); - return expr4_0; -} - -// Generated as internal constructor for term vec_dup_from_fpu. -pub fn constructor_vec_dup_from_fpu(ctx: &mut C, arg0: Reg, arg1: &VectorSize) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/aarch64/inst.isle line 1884. - let expr0_0: Type = I8X16; - let expr1_0 = C::temp_writable_reg(ctx, expr0_0); - let expr2_0 = MInst::VecDupFromFpu { - rd: expr1_0, - rn: pattern0_0, - size: pattern1_0.clone(), - }; - let expr3_0 = C::emit(ctx, &expr2_0); - let expr4_0 = C::writable_reg_to_reg(ctx, expr1_0); - return expr4_0; -} - -// Generated as internal constructor for term alu_rr_imm12. -pub fn constructor_alu_rr_imm12( - ctx: &mut C, - arg0: &ALUOp, - arg1: Type, - arg2: Reg, - arg3: Imm12, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - // Rule at src/isa/aarch64/inst.isle line 1891. - let expr0_0: Type = I64; - let expr1_0 = C::temp_writable_reg(ctx, expr0_0); - let expr2_0 = constructor_operand_size(ctx, pattern1_0); - let expr3_0 = MInst::AluRRImm12 { - alu_op: pattern0_0.clone(), - size: expr2_0, - rd: expr1_0, - rn: pattern2_0, - imm12: pattern3_0, - }; - let expr4_0 = C::emit(ctx, &expr3_0); - let expr5_0 = C::writable_reg_to_reg(ctx, expr1_0); - return expr5_0; -} - -// Generated as internal constructor for term alu_rrr_shift. -pub fn constructor_alu_rrr_shift( - ctx: &mut C, - arg0: &ALUOp, - arg1: Type, - arg2: Reg, - arg3: Reg, - arg4: ShiftOpAndAmt, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - let pattern4_0 = arg4; - // Rule at src/isa/aarch64/inst.isle line 1898. - let expr0_0: Type = I64; - let expr1_0 = C::temp_writable_reg(ctx, expr0_0); - let expr2_0 = constructor_operand_size(ctx, pattern1_0); - let expr3_0 = MInst::AluRRRShift { - alu_op: pattern0_0.clone(), - size: expr2_0, - rd: expr1_0, - rn: pattern2_0, - rm: pattern3_0, - shiftop: pattern4_0, - }; - let expr4_0 = C::emit(ctx, &expr3_0); - let expr5_0 = C::writable_reg_to_reg(ctx, expr1_0); - return expr5_0; -} - -// Generated as internal constructor for term cmp_rr_shift. -pub fn constructor_cmp_rr_shift( - ctx: &mut C, - arg0: &OperandSize, - arg1: Reg, - arg2: Reg, - arg3: u64, -) -> ProducesFlags { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - let mut closure4 = || { - let expr0_0: Type = I64; - let expr1_0 = C::lshr_from_u64(ctx, expr0_0, pattern3_0)?; - return Some(expr1_0); - }; - if let Some(pattern4_0) = closure4() { - // Rule at src/isa/aarch64/inst.isle line 1906. - let expr0_0 = ALUOp::SubS; - let expr1_0 = C::writable_zero_reg(ctx); - let expr2_0 = MInst::AluRRRShift { - alu_op: expr0_0, - size: pattern0_0.clone(), - rd: expr1_0, - rn: pattern1_0, - rm: pattern2_0, - shiftop: pattern4_0, - }; - let expr3_0 = ProducesFlags::ProducesFlagsSideEffect { inst: expr2_0 }; - return expr3_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "cmp_rr_shift", "src/isa/aarch64/inst.isle line 1905" - ); -} - -// Generated as internal constructor for term alu_rrr_extend. -pub fn constructor_alu_rrr_extend( - ctx: &mut C, - arg0: &ALUOp, - arg1: Type, - arg2: Reg, - arg3: Reg, - arg4: &ExtendOp, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - let pattern4_0 = arg4; - // Rule at src/isa/aarch64/inst.isle line 1914. - let expr0_0: Type = I64; - let expr1_0 = C::temp_writable_reg(ctx, expr0_0); - let expr2_0 = constructor_operand_size(ctx, pattern1_0); - let expr3_0 = MInst::AluRRRExtend { - alu_op: pattern0_0.clone(), - size: expr2_0, - rd: expr1_0, - rn: pattern2_0, - rm: pattern3_0, - extendop: pattern4_0.clone(), - }; - let expr4_0 = C::emit(ctx, &expr3_0); - let expr5_0 = C::writable_reg_to_reg(ctx, expr1_0); - return expr5_0; -} - -// Generated as internal constructor for term alu_rr_extend_reg. -pub fn constructor_alu_rr_extend_reg( - ctx: &mut C, - arg0: &ALUOp, - arg1: Type, - arg2: Reg, - arg3: &ExtendedValue, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - // Rule at src/isa/aarch64/inst.isle line 1922. - let expr0_0 = C::put_extended_in_reg(ctx, pattern3_0); - let expr1_0 = C::get_extended_op(ctx, pattern3_0); - let expr2_0 = - constructor_alu_rrr_extend(ctx, pattern0_0, pattern1_0, pattern2_0, expr0_0, &expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term alu_rrrr. -pub fn constructor_alu_rrrr( - ctx: &mut C, - arg0: &ALUOp3, - arg1: Type, - arg2: Reg, - arg3: Reg, - arg4: Reg, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - let pattern4_0 = arg4; - // Rule at src/isa/aarch64/inst.isle line 1929. - let expr0_0: Type = I64; - let expr1_0 = C::temp_writable_reg(ctx, expr0_0); - let expr2_0 = constructor_operand_size(ctx, pattern1_0); - let expr3_0 = MInst::AluRRRR { - alu_op: pattern0_0.clone(), - size: expr2_0, - rd: expr1_0, - rn: pattern2_0, - rm: pattern3_0, - ra: pattern4_0, - }; - let expr4_0 = C::emit(ctx, &expr3_0); - let expr5_0 = C::writable_reg_to_reg(ctx, expr1_0); - return expr5_0; -} - -// Generated as internal constructor for term bit_rr. -pub fn constructor_bit_rr(ctx: &mut C, arg0: &BitOp, arg1: Type, arg2: Reg) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/aarch64/inst.isle line 1936. - let expr0_0: Type = I64; - let expr1_0 = C::temp_writable_reg(ctx, expr0_0); - let expr2_0 = constructor_operand_size(ctx, pattern1_0); - let expr3_0 = MInst::BitRR { - op: pattern0_0.clone(), - size: expr2_0, - rd: expr1_0, - rn: pattern2_0, - }; - let expr4_0 = C::emit(ctx, &expr3_0); - let expr5_0 = C::writable_reg_to_reg(ctx, expr1_0); - return expr5_0; -} - -// Generated as internal constructor for term add_with_flags_paired. -pub fn constructor_add_with_flags_paired( - ctx: &mut C, - arg0: Type, - arg1: Reg, - arg2: Reg, -) -> ProducesFlags { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/aarch64/inst.isle line 1943. - let expr0_0: Type = I64; - let expr1_0 = C::temp_writable_reg(ctx, expr0_0); - let expr2_0 = ALUOp::AddS; - let expr3_0 = constructor_operand_size(ctx, pattern0_0); - let expr4_0 = MInst::AluRRR { - alu_op: expr2_0, - size: expr3_0, - rd: expr1_0, - rn: pattern1_0, - rm: pattern2_0, - }; - let expr5_0 = C::writable_reg_to_reg(ctx, expr1_0); - let expr6_0 = ProducesFlags::ProducesFlagsReturnsResultWithConsumer { - inst: expr4_0, - result: expr5_0, - }; - return expr6_0; -} - -// Generated as internal constructor for term adc_paired. -pub fn constructor_adc_paired( - ctx: &mut C, - arg0: Type, - arg1: Reg, - arg2: Reg, -) -> ConsumesFlags { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/aarch64/inst.isle line 1951. - let expr0_0: Type = I64; - let expr1_0 = C::temp_writable_reg(ctx, expr0_0); - let expr2_0 = ALUOp::Adc; - let expr3_0 = constructor_operand_size(ctx, pattern0_0); - let expr4_0 = MInst::AluRRR { - alu_op: expr2_0, - size: expr3_0, - rd: expr1_0, - rn: pattern1_0, - rm: pattern2_0, - }; - let expr5_0 = C::writable_reg_to_reg(ctx, expr1_0); - let expr6_0 = ConsumesFlags::ConsumesFlagsReturnsResultWithProducer { - inst: expr4_0, - result: expr5_0, - }; - return expr6_0; -} - -// Generated as internal constructor for term sub_with_flags_paired. -pub fn constructor_sub_with_flags_paired( - ctx: &mut C, - arg0: Type, - arg1: Reg, - arg2: Reg, -) -> ProducesFlags { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/aarch64/inst.isle line 1959. - let expr0_0: Type = I64; - let expr1_0 = C::temp_writable_reg(ctx, expr0_0); - let expr2_0 = ALUOp::SubS; - let expr3_0 = constructor_operand_size(ctx, pattern0_0); - let expr4_0 = MInst::AluRRR { - alu_op: expr2_0, - size: expr3_0, - rd: expr1_0, - rn: pattern1_0, - rm: pattern2_0, - }; - let expr5_0 = C::writable_reg_to_reg(ctx, expr1_0); - let expr6_0 = ProducesFlags::ProducesFlagsReturnsResultWithConsumer { - inst: expr4_0, - result: expr5_0, - }; - return expr6_0; -} - -// Generated as internal constructor for term materialize_bool_result. -pub fn constructor_materialize_bool_result(ctx: &mut C, arg0: &Cond) -> ConsumesFlags { - let pattern0_0 = arg0; - // Rule at src/isa/aarch64/inst.isle line 1968. - let expr0_0: Type = I64; - let expr1_0 = C::temp_writable_reg(ctx, expr0_0); - let expr2_0 = MInst::CSet { - rd: expr1_0, - cond: pattern0_0.clone(), - }; - let expr3_0 = C::writable_reg_to_reg(ctx, expr1_0); - let expr4_0 = ConsumesFlags::ConsumesFlagsReturnsReg { - inst: expr2_0, - result: expr3_0, - }; - return expr4_0; -} - -// Generated as internal constructor for term cmn_imm. -pub fn constructor_cmn_imm( - ctx: &mut C, - arg0: &OperandSize, - arg1: Reg, - arg2: Imm12, -) -> ProducesFlags { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/aarch64/inst.isle line 1975. - let expr0_0 = ALUOp::AddS; - let expr1_0 = C::writable_zero_reg(ctx); - let expr2_0 = MInst::AluRRImm12 { - alu_op: expr0_0, - size: pattern0_0.clone(), - rd: expr1_0, - rn: pattern1_0, - imm12: pattern2_0, - }; - let expr3_0 = ProducesFlags::ProducesFlagsSideEffect { inst: expr2_0 }; - return expr3_0; -} - -// Generated as internal constructor for term cmp. -pub fn constructor_cmp( - ctx: &mut C, - arg0: &OperandSize, - arg1: Reg, - arg2: Reg, -) -> ProducesFlags { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/aarch64/inst.isle line 1981. - let expr0_0 = ALUOp::SubS; - let expr1_0 = C::writable_zero_reg(ctx); - let expr2_0 = MInst::AluRRR { - alu_op: expr0_0, - size: pattern0_0.clone(), - rd: expr1_0, - rn: pattern1_0, - rm: pattern2_0, - }; - let expr3_0 = ProducesFlags::ProducesFlagsSideEffect { inst: expr2_0 }; - return expr3_0; -} - -// Generated as internal constructor for term cmp_imm. -pub fn constructor_cmp_imm( - ctx: &mut C, - arg0: &OperandSize, - arg1: Reg, - arg2: Imm12, -) -> ProducesFlags { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/aarch64/inst.isle line 1987. - let expr0_0 = ALUOp::SubS; - let expr1_0 = C::writable_zero_reg(ctx); - let expr2_0 = MInst::AluRRImm12 { - alu_op: expr0_0, - size: pattern0_0.clone(), - rd: expr1_0, - rn: pattern1_0, - imm12: pattern2_0, - }; - let expr3_0 = ProducesFlags::ProducesFlagsSideEffect { inst: expr2_0 }; - return expr3_0; -} - -// Generated as internal constructor for term cmp64_imm. -pub fn constructor_cmp64_imm(ctx: &mut C, arg0: Reg, arg1: Imm12) -> ProducesFlags { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/aarch64/inst.isle line 1993. - let expr0_0 = OperandSize::Size64; - let expr1_0 = constructor_cmp_imm(ctx, &expr0_0, pattern0_0, pattern1_0); - return expr1_0; -} - -// Generated as internal constructor for term cmp_extend. -pub fn constructor_cmp_extend( - ctx: &mut C, - arg0: &OperandSize, - arg1: Reg, - arg2: Reg, - arg3: &ExtendOp, -) -> ProducesFlags { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - // Rule at src/isa/aarch64/inst.isle line 1997. - let expr0_0 = ALUOp::SubS; - let expr1_0 = C::writable_zero_reg(ctx); - let expr2_0 = MInst::AluRRRExtend { - alu_op: expr0_0, - size: pattern0_0.clone(), - rd: expr1_0, - rn: pattern1_0, - rm: pattern2_0, - extendop: pattern3_0.clone(), - }; - let expr3_0 = ProducesFlags::ProducesFlagsSideEffect { inst: expr2_0 }; - return expr3_0; -} - -// Generated as internal constructor for term sbc_paired. -pub fn constructor_sbc_paired( - ctx: &mut C, - arg0: Type, - arg1: Reg, - arg2: Reg, -) -> ConsumesFlags { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/aarch64/inst.isle line 2004. - let expr0_0: Type = I64; - let expr1_0 = C::temp_writable_reg(ctx, expr0_0); - let expr2_0 = ALUOp::Sbc; - let expr3_0 = constructor_operand_size(ctx, pattern0_0); - let expr4_0 = MInst::AluRRR { - alu_op: expr2_0, - size: expr3_0, - rd: expr1_0, - rn: pattern1_0, - rm: pattern2_0, - }; - let expr5_0 = C::writable_reg_to_reg(ctx, expr1_0); - let expr6_0 = ConsumesFlags::ConsumesFlagsReturnsResultWithProducer { - inst: expr4_0, - result: expr5_0, - }; - return expr6_0; -} - -// Generated as internal constructor for term vec_misc. -pub fn constructor_vec_misc( - ctx: &mut C, - arg0: &VecMisc2, - arg1: Reg, - arg2: &VectorSize, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/aarch64/inst.isle line 2012. - let expr0_0: Type = I8X16; - let expr1_0 = C::temp_writable_reg(ctx, expr0_0); - let expr2_0 = MInst::VecMisc { - op: pattern0_0.clone(), - rd: expr1_0, - rn: pattern1_0, - size: pattern2_0.clone(), - }; - let expr3_0 = C::emit(ctx, &expr2_0); - let expr4_0 = C::writable_reg_to_reg(ctx, expr1_0); - return expr4_0; -} - -// Generated as internal constructor for term vec_tbl. -pub fn constructor_vec_tbl(ctx: &mut C, arg0: Reg, arg1: Reg) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/aarch64/inst.isle line 2019. - let expr0_0: Type = I8X16; - let expr1_0 = C::temp_writable_reg(ctx, expr0_0); - let expr2_0 = MInst::VecTbl { - rd: expr1_0, - rn: pattern0_0, - rm: pattern1_0, - }; - let expr3_0 = C::emit(ctx, &expr2_0); - let expr4_0 = C::writable_reg_to_reg(ctx, expr1_0); - return expr4_0; -} - -// Generated as internal constructor for term vec_tbl_ext. -pub fn constructor_vec_tbl_ext(ctx: &mut C, arg0: Reg, arg1: Reg, arg2: Reg) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/aarch64/inst.isle line 2025. - let expr0_0: Type = I8X16; - let expr1_0 = C::temp_writable_reg(ctx, expr0_0); - let expr2_0 = MInst::VecTblExt { - rd: expr1_0, - ri: pattern0_0, - rn: pattern1_0, - rm: pattern2_0, - }; - let expr3_0 = C::emit(ctx, &expr2_0); - let expr4_0 = C::writable_reg_to_reg(ctx, expr1_0); - return expr4_0; -} - -// Generated as internal constructor for term vec_tbl2. -pub fn constructor_vec_tbl2( - ctx: &mut C, - arg0: Reg, - arg1: Reg, - arg2: Reg, - arg3: Type, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - // Rule at src/isa/aarch64/inst.isle line 2032. - let expr0_0: Type = I8X16; - let expr1_0 = C::temp_writable_reg(ctx, expr0_0); - let expr2_0 = MInst::VecTbl2 { - rd: expr1_0, - rn: pattern0_0, - rn2: pattern1_0, - rm: pattern2_0, - }; - let expr3_0 = C::emit(ctx, &expr2_0); - let expr4_0 = C::writable_reg_to_reg(ctx, expr1_0); - return expr4_0; -} - -// Generated as internal constructor for term vec_tbl2_ext. -pub fn constructor_vec_tbl2_ext( - ctx: &mut C, - arg0: Reg, - arg1: Reg, - arg2: Reg, - arg3: Reg, - arg4: Type, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - let pattern4_0 = arg4; - // Rule at src/isa/aarch64/inst.isle line 2041. - let expr0_0: Type = I8X16; - let expr1_0 = C::temp_writable_reg(ctx, expr0_0); - let expr2_0 = MInst::VecTbl2Ext { - rd: expr1_0, - ri: pattern0_0, - rn: pattern1_0, - rn2: pattern2_0, - rm: pattern3_0, - }; - let expr3_0 = C::emit(ctx, &expr2_0); - let expr4_0 = C::writable_reg_to_reg(ctx, expr1_0); - return expr4_0; -} - -// Generated as internal constructor for term vec_rrr_long. -pub fn constructor_vec_rrr_long( - ctx: &mut C, - arg0: &VecRRRLongOp, - arg1: Reg, - arg2: Reg, - arg3: bool, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - // Rule at src/isa/aarch64/inst.isle line 2050. - let expr0_0: Type = I8X16; - let expr1_0 = C::temp_writable_reg(ctx, expr0_0); - let expr2_0 = MInst::VecRRRLong { - alu_op: pattern0_0.clone(), - rd: expr1_0, - rn: pattern1_0, - rm: pattern2_0, - high_half: pattern3_0, - }; - let expr3_0 = C::emit(ctx, &expr2_0); - let expr4_0 = C::writable_reg_to_reg(ctx, expr1_0); - return expr4_0; -} - -// Generated as internal constructor for term vec_rr_pair_long. -pub fn constructor_vec_rr_pair_long( - ctx: &mut C, - arg0: &VecRRPairLongOp, - arg1: Reg, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/aarch64/inst.isle line 2057. - let expr0_0: Type = I8X16; - let expr1_0 = C::temp_writable_reg(ctx, expr0_0); - let expr2_0 = MInst::VecRRPairLong { - op: pattern0_0.clone(), - rd: expr1_0, - rn: pattern1_0, - }; - let expr3_0 = C::emit(ctx, &expr2_0); - let expr4_0 = C::writable_reg_to_reg(ctx, expr1_0); - return expr4_0; -} - -// Generated as internal constructor for term vec_rrrr_long. -pub fn constructor_vec_rrrr_long( - ctx: &mut C, - arg0: &VecRRRLongModOp, - arg1: Reg, - arg2: Reg, - arg3: Reg, - arg4: bool, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - let pattern4_0 = arg4; - // Rule at src/isa/aarch64/inst.isle line 2064. - let expr0_0: Type = I8X16; - let expr1_0 = C::temp_writable_reg(ctx, expr0_0); - let expr2_0 = MInst::VecRRRLongMod { - alu_op: pattern0_0.clone(), - rd: expr1_0, - ri: pattern1_0, - rn: pattern2_0, - rm: pattern3_0, - high_half: pattern4_0, - }; - let expr3_0 = C::emit(ctx, &expr2_0); - let expr4_0 = C::writable_reg_to_reg(ctx, expr1_0); - return expr4_0; -} - -// Generated as internal constructor for term vec_rr_narrow_low. -pub fn constructor_vec_rr_narrow_low( - ctx: &mut C, - arg0: &VecRRNarrowOp, - arg1: Reg, - arg2: &ScalarSize, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/aarch64/inst.isle line 2071. - let expr0_0: Type = I8X16; - let expr1_0 = C::temp_writable_reg(ctx, expr0_0); - let expr2_0 = MInst::VecRRNarrowLow { - op: pattern0_0.clone(), - rd: expr1_0, - rn: pattern1_0, - lane_size: pattern2_0.clone(), - }; - let expr3_0 = C::emit(ctx, &expr2_0); - let expr4_0 = C::writable_reg_to_reg(ctx, expr1_0); - return expr4_0; -} - -// Generated as internal constructor for term vec_rr_narrow_high. -pub fn constructor_vec_rr_narrow_high( - ctx: &mut C, - arg0: &VecRRNarrowOp, - arg1: Reg, - arg2: Reg, - arg3: &ScalarSize, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - // Rule at src/isa/aarch64/inst.isle line 2079. - let expr0_0: Type = I8X16; - let expr1_0 = C::temp_writable_reg(ctx, expr0_0); - let expr2_0 = MInst::VecRRNarrowHigh { - op: pattern0_0.clone(), - rd: expr1_0, - ri: pattern1_0, - rn: pattern2_0, - lane_size: pattern3_0.clone(), - }; - let expr3_0 = C::emit(ctx, &expr2_0); - let expr4_0 = C::writable_reg_to_reg(ctx, expr1_0); - return expr4_0; -} - -// Generated as internal constructor for term vec_rr_long. -pub fn constructor_vec_rr_long( - ctx: &mut C, - arg0: &VecRRLongOp, - arg1: Reg, - arg2: bool, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/aarch64/inst.isle line 2086. - let expr0_0: Type = I8X16; - let expr1_0 = C::temp_writable_reg(ctx, expr0_0); - let expr2_0 = MInst::VecRRLong { - op: pattern0_0.clone(), - rd: expr1_0, - rn: pattern1_0, - high_half: pattern2_0, - }; - let expr3_0 = C::emit(ctx, &expr2_0); - let expr4_0 = C::writable_reg_to_reg(ctx, expr1_0); - return expr4_0; -} - -// Generated as internal constructor for term fpu_csel. -pub fn constructor_fpu_csel( - ctx: &mut C, - arg0: Type, - arg1: &Cond, - arg2: Reg, - arg3: Reg, -) -> ConsumesFlags { - let pattern0_0 = arg0; - if pattern0_0 == F32 { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - let pattern4_0 = arg3; - // Rule at src/isa/aarch64/inst.isle line 2094. - let expr0_0: Type = F32; - let expr1_0 = C::temp_writable_reg(ctx, expr0_0); - let expr2_0 = MInst::FpuCSel32 { - rd: expr1_0, - rn: pattern3_0, - rm: pattern4_0, - cond: pattern2_0.clone(), - }; - let expr3_0 = C::writable_reg_to_reg(ctx, expr1_0); - let expr4_0 = ConsumesFlags::ConsumesFlagsReturnsReg { - inst: expr2_0, - result: expr3_0, - }; - return expr4_0; - } - if pattern0_0 == F64 { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - let pattern4_0 = arg3; - // Rule at src/isa/aarch64/inst.isle line 2100. - let expr0_0: Type = F64; - let expr1_0 = C::temp_writable_reg(ctx, expr0_0); - let expr2_0 = MInst::FpuCSel64 { - rd: expr1_0, - rn: pattern3_0, - rm: pattern4_0, - cond: pattern2_0.clone(), - }; - let expr3_0 = C::writable_reg_to_reg(ctx, expr1_0); - let expr4_0 = ConsumesFlags::ConsumesFlagsReturnsReg { - inst: expr2_0, - result: expr3_0, - }; - return expr4_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "fpu_csel", "src/isa/aarch64/inst.isle line 2093" - ); -} - -// Generated as internal constructor for term vec_csel. -pub fn constructor_vec_csel( - ctx: &mut C, - arg0: &Cond, - arg1: Reg, - arg2: Reg, -) -> ConsumesFlags { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/aarch64/inst.isle line 2108. - let expr0_0: Type = I8X16; - let expr1_0 = C::temp_writable_reg(ctx, expr0_0); - let expr2_0 = MInst::VecCSel { - rd: expr1_0, - rn: pattern1_0, - rm: pattern2_0, - cond: pattern0_0.clone(), - }; - let expr3_0 = C::writable_reg_to_reg(ctx, expr1_0); - let expr4_0 = ConsumesFlags::ConsumesFlagsReturnsReg { - inst: expr2_0, - result: expr3_0, - }; - return expr4_0; -} - -// Generated as internal constructor for term fpu_round. -pub fn constructor_fpu_round(ctx: &mut C, arg0: &FpuRoundMode, arg1: Reg) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/aarch64/inst.isle line 2116. - let expr0_0: Type = F64; - let expr1_0 = C::temp_writable_reg(ctx, expr0_0); - let expr2_0 = MInst::FpuRound { - op: pattern0_0.clone(), - rd: expr1_0, - rn: pattern1_0, - }; - let expr3_0 = C::emit(ctx, &expr2_0); - let expr4_0 = C::writable_reg_to_reg(ctx, expr1_0); - return expr4_0; -} - -// Generated as internal constructor for term fpu_move. -pub fn constructor_fpu_move(ctx: &mut C, arg0: Type, arg1: Reg) -> Reg { - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::fits_in_64(ctx, pattern0_0) { - let pattern2_0 = arg1; - // Rule at src/isa/aarch64/inst.isle line 2127. - let expr0_0: Type = F64; - let expr1_0 = C::temp_writable_reg(ctx, expr0_0); - let expr2_0 = MInst::FpuMove64 { - rd: expr1_0, - rn: pattern2_0, - }; - let expr3_0 = C::emit(ctx, &expr2_0); - let expr4_0 = C::writable_reg_to_reg(ctx, expr1_0); - return expr4_0; - } - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/aarch64/inst.isle line 2123. - let expr0_0: Type = I8X16; - let expr1_0 = C::temp_writable_reg(ctx, expr0_0); - let expr2_0 = MInst::FpuMove128 { - rd: expr1_0, - rn: pattern1_0, - }; - let expr3_0 = C::emit(ctx, &expr2_0); - let expr4_0 = C::writable_reg_to_reg(ctx, expr1_0); - return expr4_0; -} - -// Generated as internal constructor for term mov_to_fpu. -pub fn constructor_mov_to_fpu(ctx: &mut C, arg0: Reg, arg1: &ScalarSize) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/aarch64/inst.isle line 2134. - let expr0_0: Type = I8X16; - let expr1_0 = C::temp_writable_reg(ctx, expr0_0); - let expr2_0 = MInst::MovToFpu { - rd: expr1_0, - rn: pattern0_0, - size: pattern1_0.clone(), - }; - let expr3_0 = C::emit(ctx, &expr2_0); - let expr4_0 = C::writable_reg_to_reg(ctx, expr1_0); - return expr4_0; -} - -// Generated as internal constructor for term mov_to_vec. -pub fn constructor_mov_to_vec( - ctx: &mut C, - arg0: Reg, - arg1: Reg, - arg2: u8, - arg3: &VectorSize, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - // Rule at src/isa/aarch64/inst.isle line 2141. - let expr0_0: Type = I8X16; - let expr1_0 = C::temp_writable_reg(ctx, expr0_0); - let expr2_0 = MInst::MovToVec { - rd: expr1_0, - ri: pattern0_0, - rn: pattern1_0, - idx: pattern2_0, - size: pattern3_0.clone(), - }; - let expr3_0 = C::emit(ctx, &expr2_0); - let expr4_0 = C::writable_reg_to_reg(ctx, expr1_0); - return expr4_0; -} - -// Generated as internal constructor for term mov_vec_elem. -pub fn constructor_mov_vec_elem( - ctx: &mut C, - arg0: Reg, - arg1: Reg, - arg2: u8, - arg3: u8, - arg4: &VectorSize, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - let pattern4_0 = arg4; - // Rule at src/isa/aarch64/inst.isle line 2148. - let expr0_0: Type = I8X16; - let expr1_0 = C::temp_writable_reg(ctx, expr0_0); - let expr2_0 = MInst::VecMovElement { - rd: expr1_0, - ri: pattern0_0, - rn: pattern1_0, - dest_idx: pattern2_0, - src_idx: pattern3_0, - size: pattern4_0.clone(), - }; - let expr3_0 = C::emit(ctx, &expr2_0); - let expr4_0 = C::writable_reg_to_reg(ctx, expr1_0); - return expr4_0; -} - -// Generated as internal constructor for term mov_from_vec. -pub fn constructor_mov_from_vec( - ctx: &mut C, - arg0: Reg, - arg1: u8, - arg2: &ScalarSize, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/aarch64/inst.isle line 2155. - let expr0_0: Type = I64; - let expr1_0 = C::temp_writable_reg(ctx, expr0_0); - let expr2_0 = MInst::MovFromVec { - rd: expr1_0, - rn: pattern0_0, - idx: pattern1_0, - size: pattern2_0.clone(), - }; - let expr3_0 = C::emit(ctx, &expr2_0); - let expr4_0 = C::writable_reg_to_reg(ctx, expr1_0); - return expr4_0; -} - -// Generated as internal constructor for term mov_from_vec_signed. -pub fn constructor_mov_from_vec_signed( - ctx: &mut C, - arg0: Reg, - arg1: u8, - arg2: &VectorSize, - arg3: &OperandSize, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - // Rule at src/isa/aarch64/inst.isle line 2162. - let expr0_0: Type = I64; - let expr1_0 = C::temp_writable_reg(ctx, expr0_0); - let expr2_0 = MInst::MovFromVecSigned { - rd: expr1_0, - rn: pattern0_0, - idx: pattern1_0, - size: pattern2_0.clone(), - scalar_size: pattern3_0.clone(), - }; - let expr3_0 = C::emit(ctx, &expr2_0); - let expr4_0 = C::writable_reg_to_reg(ctx, expr1_0); - return expr4_0; -} - -// Generated as internal constructor for term fpu_move_from_vec. -pub fn constructor_fpu_move_from_vec( - ctx: &mut C, - arg0: Reg, - arg1: u8, - arg2: &VectorSize, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/aarch64/inst.isle line 2168. - let expr0_0: Type = I8X16; - let expr1_0 = C::temp_writable_reg(ctx, expr0_0); - let expr2_0 = MInst::FpuMoveFromVec { - rd: expr1_0, - rn: pattern0_0, - idx: pattern1_0, - size: pattern2_0.clone(), - }; - let expr3_0 = C::emit(ctx, &expr2_0); - let expr4_0 = C::writable_reg_to_reg(ctx, expr1_0); - return expr4_0; -} - -// Generated as internal constructor for term extend. -pub fn constructor_extend( - ctx: &mut C, - arg0: Reg, - arg1: bool, - arg2: u8, - arg3: u8, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - // Rule at src/isa/aarch64/inst.isle line 2175. - let expr0_0: Type = I64; - let expr1_0 = C::temp_writable_reg(ctx, expr0_0); - let expr2_0 = MInst::Extend { - rd: expr1_0, - rn: pattern0_0, - signed: pattern1_0, - from_bits: pattern2_0, - to_bits: pattern3_0, - }; - let expr3_0 = C::emit(ctx, &expr2_0); - let expr4_0 = C::writable_reg_to_reg(ctx, expr1_0); - return expr4_0; -} - -// Generated as internal constructor for term fpu_extend. -pub fn constructor_fpu_extend(ctx: &mut C, arg0: Reg, arg1: &ScalarSize) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/aarch64/inst.isle line 2182. - let expr0_0: Type = F32X4; - let expr1_0 = C::temp_writable_reg(ctx, expr0_0); - let expr2_0 = MInst::FpuExtend { - rd: expr1_0, - rn: pattern0_0, - size: pattern1_0.clone(), - }; - let expr3_0 = C::emit(ctx, &expr2_0); - let expr4_0 = C::writable_reg_to_reg(ctx, expr1_0); - return expr4_0; -} - -// Generated as internal constructor for term vec_extend. -pub fn constructor_vec_extend( - ctx: &mut C, - arg0: &VecExtendOp, - arg1: Reg, - arg2: bool, - arg3: &ScalarSize, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - // Rule at src/isa/aarch64/inst.isle line 2189. - let expr0_0: Type = I8X16; - let expr1_0 = C::temp_writable_reg(ctx, expr0_0); - let expr2_0 = MInst::VecExtend { - t: pattern0_0.clone(), - rd: expr1_0, - rn: pattern1_0, - high_half: pattern2_0, - lane_size: pattern3_0.clone(), - }; - let expr3_0 = C::emit(ctx, &expr2_0); - let expr4_0 = C::writable_reg_to_reg(ctx, expr1_0); - return expr4_0; -} - -// Generated as internal constructor for term vec_extract. -pub fn constructor_vec_extract(ctx: &mut C, arg0: Reg, arg1: Reg, arg2: u8) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/aarch64/inst.isle line 2196. - let expr0_0: Type = I8X16; - let expr1_0 = C::temp_writable_reg(ctx, expr0_0); - let expr2_0 = MInst::VecExtract { - rd: expr1_0, - rn: pattern0_0, - rm: pattern1_0, - imm4: pattern2_0, - }; - let expr3_0 = C::emit(ctx, &expr2_0); - let expr4_0 = C::writable_reg_to_reg(ctx, expr1_0); - return expr4_0; -} - -// Generated as internal constructor for term load_acquire. -pub fn constructor_load_acquire( - ctx: &mut C, - arg0: Type, - arg1: MemFlags, - arg2: Reg, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/aarch64/inst.isle line 2203. - let expr0_0: Type = I64; - let expr1_0 = C::temp_writable_reg(ctx, expr0_0); - let expr2_0 = MInst::LoadAcquire { - access_ty: pattern0_0, - rt: expr1_0, - rn: pattern2_0, - flags: pattern1_0, - }; - let expr3_0 = C::emit(ctx, &expr2_0); - let expr4_0 = C::writable_reg_to_reg(ctx, expr1_0); - return expr4_0; -} - -// Generated as internal constructor for term store_release. -pub fn constructor_store_release( - ctx: &mut C, - arg0: Type, - arg1: MemFlags, - arg2: Reg, - arg3: Reg, -) -> SideEffectNoResult { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - // Rule at src/isa/aarch64/inst.isle line 2210. - let expr0_0 = MInst::StoreRelease { - access_ty: pattern0_0, - rt: pattern2_0, - rn: pattern3_0, - flags: pattern1_0, - }; - let expr1_0 = SideEffectNoResult::Inst { inst: expr0_0 }; - return expr1_0; -} - -// Generated as internal constructor for term tst_imm. -pub fn constructor_tst_imm( - ctx: &mut C, - arg0: Type, - arg1: Reg, - arg2: ImmLogic, -) -> ProducesFlags { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/aarch64/inst.isle line 2218. - let expr0_0 = ALUOp::AndS; - let expr1_0 = constructor_operand_size(ctx, pattern0_0); - let expr2_0 = C::writable_zero_reg(ctx); - let expr3_0 = MInst::AluRRImmLogic { - alu_op: expr0_0, - size: expr1_0, - rd: expr2_0, - rn: pattern1_0, - imml: pattern2_0, - }; - let expr4_0 = ProducesFlags::ProducesFlagsSideEffect { inst: expr3_0 }; - return expr4_0; -} - -// Generated as internal constructor for term csel. -pub fn constructor_csel( - ctx: &mut C, - arg0: &Cond, - arg1: Reg, - arg2: Reg, -) -> ConsumesFlags { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/aarch64/inst.isle line 2232. - let expr0_0: Type = I64; - let expr1_0 = C::temp_writable_reg(ctx, expr0_0); - let expr2_0 = MInst::CSel { - rd: expr1_0, - cond: pattern0_0.clone(), - rn: pattern1_0, - rm: pattern2_0, - }; - let expr3_0 = C::writable_reg_to_reg(ctx, expr1_0); - let expr4_0 = ConsumesFlags::ConsumesFlagsReturnsReg { - inst: expr2_0, - result: expr3_0, - }; - return expr4_0; -} - -// Generated as internal constructor for term cset. -pub fn constructor_cset(ctx: &mut C, arg0: &Cond) -> ConsumesFlags { - let pattern0_0 = arg0; - // Rule at src/isa/aarch64/inst.isle line 2240. - let expr0_0: Type = I64; - let expr1_0 = C::temp_writable_reg(ctx, expr0_0); - let expr2_0 = MInst::CSet { - rd: expr1_0, - cond: pattern0_0.clone(), - }; - let expr3_0 = C::writable_reg_to_reg(ctx, expr1_0); - let expr4_0 = ConsumesFlags::ConsumesFlagsReturnsReg { - inst: expr2_0, - result: expr3_0, - }; - return expr4_0; -} - -// Generated as internal constructor for term cset_paired. -pub fn constructor_cset_paired(ctx: &mut C, arg0: &Cond) -> ConsumesFlags { - let pattern0_0 = arg0; - // Rule at src/isa/aarch64/inst.isle line 2247. - let expr0_0: Type = I64; - let expr1_0 = C::temp_writable_reg(ctx, expr0_0); - let expr2_0 = MInst::CSet { - rd: expr1_0, - cond: pattern0_0.clone(), - }; - let expr3_0 = C::writable_reg_to_reg(ctx, expr1_0); - let expr4_0 = ConsumesFlags::ConsumesFlagsReturnsResultWithProducer { - inst: expr2_0, - result: expr3_0, - }; - return expr4_0; -} - -// Generated as internal constructor for term csetm. -pub fn constructor_csetm(ctx: &mut C, arg0: &Cond) -> ConsumesFlags { - let pattern0_0 = arg0; - // Rule at src/isa/aarch64/inst.isle line 2253. - let expr0_0: Type = I64; - let expr1_0 = C::temp_writable_reg(ctx, expr0_0); - let expr2_0 = MInst::CSetm { - rd: expr1_0, - cond: pattern0_0.clone(), - }; - let expr3_0 = C::writable_reg_to_reg(ctx, expr1_0); - let expr4_0 = ConsumesFlags::ConsumesFlagsReturnsReg { - inst: expr2_0, - result: expr3_0, - }; - return expr4_0; -} - -// Generated as internal constructor for term csneg. -pub fn constructor_csneg( - ctx: &mut C, - arg0: &Cond, - arg1: Reg, - arg2: Reg, -) -> ConsumesFlags { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/aarch64/inst.isle line 2263. - let expr0_0: Type = I64; - let expr1_0 = C::temp_writable_reg(ctx, expr0_0); - let expr2_0 = MInst::CSNeg { - rd: expr1_0, - cond: pattern0_0.clone(), - rn: pattern1_0, - rm: pattern2_0, - }; - let expr3_0 = C::writable_reg_to_reg(ctx, expr1_0); - let expr4_0 = ConsumesFlags::ConsumesFlagsReturnsReg { - inst: expr2_0, - result: expr3_0, - }; - return expr4_0; -} - -// Generated as internal constructor for term ccmp. -pub fn constructor_ccmp( - ctx: &mut C, - arg0: &OperandSize, - arg1: Reg, - arg2: Reg, - arg3: NZCV, - arg4: &Cond, - arg5: &ProducesFlags, -) -> ProducesFlags { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - let pattern4_0 = arg4; - let pattern5_0 = arg5; - // Rule at src/isa/aarch64/inst.isle line 2273. - let expr0_0 = MInst::CCmp { - size: pattern0_0.clone(), - rn: pattern1_0, - rm: pattern2_0, - nzcv: pattern3_0, - cond: pattern4_0.clone(), - }; - let expr1_0 = constructor_produces_flags_append(ctx, pattern5_0, &expr0_0); - return expr1_0; -} - -// Generated as internal constructor for term ccmp_imm. -pub fn constructor_ccmp_imm( - ctx: &mut C, - arg0: &OperandSize, - arg1: Reg, - arg2: UImm5, - arg3: NZCV, - arg4: &Cond, -) -> ConsumesFlags { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - let pattern4_0 = arg4; - // Rule at src/isa/aarch64/inst.isle line 2278. - let expr0_0: Type = I64; - let expr1_0 = C::temp_writable_reg(ctx, expr0_0); - let expr2_0 = MInst::CCmpImm { - size: pattern0_0.clone(), - rn: pattern1_0, - imm: pattern2_0, - nzcv: pattern3_0, - cond: pattern4_0.clone(), - }; - let expr3_0 = MInst::CSet { - rd: expr1_0, - cond: pattern4_0.clone(), - }; - let expr4_0 = C::writable_reg_to_reg(ctx, expr1_0); - let expr5_0 = C::value_reg(ctx, expr4_0); - let expr6_0 = ConsumesFlags::ConsumesFlagsTwiceReturnsValueRegs { - inst1: expr2_0, - inst2: expr3_0, - result: expr5_0, - }; - return expr6_0; -} - -// Generated as internal constructor for term add. -pub fn constructor_add(ctx: &mut C, arg0: Type, arg1: Reg, arg2: Reg) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/aarch64/inst.isle line 2288. - let expr0_0 = ALUOp::Add; - let expr1_0 = constructor_alu_rrr(ctx, &expr0_0, pattern0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term add_imm. -pub fn constructor_add_imm(ctx: &mut C, arg0: Type, arg1: Reg, arg2: Imm12) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/aarch64/inst.isle line 2291. - let expr0_0 = ALUOp::Add; - let expr1_0 = constructor_alu_rr_imm12(ctx, &expr0_0, pattern0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term add_extend. -pub fn constructor_add_extend( - ctx: &mut C, - arg0: Type, - arg1: Reg, - arg2: &ExtendedValue, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/aarch64/inst.isle line 2294. - let expr0_0 = ALUOp::Add; - let expr1_0 = constructor_alu_rr_extend_reg(ctx, &expr0_0, pattern0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term add_extend_op. -pub fn constructor_add_extend_op( - ctx: &mut C, - arg0: Type, - arg1: Reg, - arg2: Reg, - arg3: &ExtendOp, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - // Rule at src/isa/aarch64/inst.isle line 2297. - let expr0_0 = ALUOp::Add; - let expr1_0 = constructor_alu_rrr_extend( - ctx, &expr0_0, pattern0_0, pattern1_0, pattern2_0, pattern3_0, - ); - return expr1_0; -} - -// Generated as internal constructor for term add_shift. -pub fn constructor_add_shift( - ctx: &mut C, - arg0: Type, - arg1: Reg, - arg2: Reg, - arg3: ShiftOpAndAmt, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - // Rule at src/isa/aarch64/inst.isle line 2300. - let expr0_0 = ALUOp::Add; - let expr1_0 = constructor_alu_rrr_shift( - ctx, &expr0_0, pattern0_0, pattern1_0, pattern2_0, pattern3_0, - ); - return expr1_0; -} - -// Generated as internal constructor for term add_vec. -pub fn constructor_add_vec( - ctx: &mut C, - arg0: Reg, - arg1: Reg, - arg2: &VectorSize, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/aarch64/inst.isle line 2303. - let expr0_0 = VecALUOp::Add; - let expr1_0 = constructor_vec_rrr(ctx, &expr0_0, pattern0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term sub. -pub fn constructor_sub(ctx: &mut C, arg0: Type, arg1: Reg, arg2: Reg) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/aarch64/inst.isle line 2308. - let expr0_0 = ALUOp::Sub; - let expr1_0 = constructor_alu_rrr(ctx, &expr0_0, pattern0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term sub_imm. -pub fn constructor_sub_imm(ctx: &mut C, arg0: Type, arg1: Reg, arg2: Imm12) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/aarch64/inst.isle line 2311. - let expr0_0 = ALUOp::Sub; - let expr1_0 = constructor_alu_rr_imm12(ctx, &expr0_0, pattern0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term sub_extend. -pub fn constructor_sub_extend( - ctx: &mut C, - arg0: Type, - arg1: Reg, - arg2: &ExtendedValue, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/aarch64/inst.isle line 2314. - let expr0_0 = ALUOp::Sub; - let expr1_0 = constructor_alu_rr_extend_reg(ctx, &expr0_0, pattern0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term sub_shift. -pub fn constructor_sub_shift( - ctx: &mut C, - arg0: Type, - arg1: Reg, - arg2: Reg, - arg3: ShiftOpAndAmt, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - // Rule at src/isa/aarch64/inst.isle line 2317. - let expr0_0 = ALUOp::Sub; - let expr1_0 = constructor_alu_rrr_shift( - ctx, &expr0_0, pattern0_0, pattern1_0, pattern2_0, pattern3_0, - ); - return expr1_0; -} - -// Generated as internal constructor for term sub_vec. -pub fn constructor_sub_vec( - ctx: &mut C, - arg0: Reg, - arg1: Reg, - arg2: &VectorSize, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/aarch64/inst.isle line 2320. - let expr0_0 = VecALUOp::Sub; - let expr1_0 = constructor_vec_rrr(ctx, &expr0_0, pattern0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term sub_i128. -pub fn constructor_sub_i128( - ctx: &mut C, - arg0: ValueRegs, - arg1: ValueRegs, -) -> ValueRegs { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/aarch64/inst.isle line 2323. - let expr0_0: usize = 0i128 as usize; - let expr1_0 = C::value_regs_get(ctx, pattern0_0, expr0_0); - let expr2_0: usize = 1i128 as usize; - let expr3_0 = C::value_regs_get(ctx, pattern0_0, expr2_0); - let expr4_0: usize = 0i128 as usize; - let expr5_0 = C::value_regs_get(ctx, pattern1_0, expr4_0); - let expr6_0: usize = 1i128 as usize; - let expr7_0 = C::value_regs_get(ctx, pattern1_0, expr6_0); - let expr8_0: Type = I64; - let expr9_0 = constructor_sub_with_flags_paired(ctx, expr8_0, expr1_0, expr5_0); - let expr10_0: Type = I64; - let expr11_0 = constructor_sbc_paired(ctx, expr10_0, expr3_0, expr7_0); - let expr12_0 = constructor_with_flags(ctx, &expr9_0, &expr11_0); - return expr12_0; -} - -// Generated as internal constructor for term madd. -pub fn constructor_madd( - ctx: &mut C, - arg0: Type, - arg1: Reg, - arg2: Reg, - arg3: Reg, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - // Rule at src/isa/aarch64/inst.isle line 2343. - let expr0_0 = ALUOp3::MAdd; - let expr1_0 = constructor_alu_rrrr( - ctx, &expr0_0, pattern0_0, pattern1_0, pattern2_0, pattern3_0, - ); - return expr1_0; -} - -// Generated as internal constructor for term msub. -pub fn constructor_msub( - ctx: &mut C, - arg0: Type, - arg1: Reg, - arg2: Reg, - arg3: Reg, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - // Rule at src/isa/aarch64/inst.isle line 2348. - let expr0_0 = ALUOp3::MSub; - let expr1_0 = constructor_alu_rrrr( - ctx, &expr0_0, pattern0_0, pattern1_0, pattern2_0, pattern3_0, - ); - return expr1_0; -} - -// Generated as internal constructor for term uqadd. -pub fn constructor_uqadd(ctx: &mut C, arg0: Reg, arg1: Reg, arg2: &VectorSize) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/aarch64/inst.isle line 2352. - let expr0_0 = VecALUOp::Uqadd; - let expr1_0 = constructor_vec_rrr(ctx, &expr0_0, pattern0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term sqadd. -pub fn constructor_sqadd(ctx: &mut C, arg0: Reg, arg1: Reg, arg2: &VectorSize) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/aarch64/inst.isle line 2356. - let expr0_0 = VecALUOp::Sqadd; - let expr1_0 = constructor_vec_rrr(ctx, &expr0_0, pattern0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term uqsub. -pub fn constructor_uqsub(ctx: &mut C, arg0: Reg, arg1: Reg, arg2: &VectorSize) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/aarch64/inst.isle line 2360. - let expr0_0 = VecALUOp::Uqsub; - let expr1_0 = constructor_vec_rrr(ctx, &expr0_0, pattern0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term sqsub. -pub fn constructor_sqsub(ctx: &mut C, arg0: Reg, arg1: Reg, arg2: &VectorSize) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/aarch64/inst.isle line 2364. - let expr0_0 = VecALUOp::Sqsub; - let expr1_0 = constructor_vec_rrr(ctx, &expr0_0, pattern0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term umulh. -pub fn constructor_umulh(ctx: &mut C, arg0: Type, arg1: Reg, arg2: Reg) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/aarch64/inst.isle line 2368. - let expr0_0 = ALUOp::UMulH; - let expr1_0 = constructor_alu_rrr(ctx, &expr0_0, pattern0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term smulh. -pub fn constructor_smulh(ctx: &mut C, arg0: Type, arg1: Reg, arg2: Reg) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/aarch64/inst.isle line 2372. - let expr0_0 = ALUOp::SMulH; - let expr1_0 = constructor_alu_rrr(ctx, &expr0_0, pattern0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term mul. -pub fn constructor_mul(ctx: &mut C, arg0: Reg, arg1: Reg, arg2: &VectorSize) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/aarch64/inst.isle line 2376. - let expr0_0 = VecALUOp::Mul; - let expr1_0 = constructor_vec_rrr(ctx, &expr0_0, pattern0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term neg. -pub fn constructor_neg(ctx: &mut C, arg0: Reg, arg1: &VectorSize) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/aarch64/inst.isle line 2380. - let expr0_0 = VecMisc2::Neg; - let expr1_0 = constructor_vec_misc(ctx, &expr0_0, pattern0_0, pattern1_0); - return expr1_0; -} - -// Generated as internal constructor for term rev64. -pub fn constructor_rev64(ctx: &mut C, arg0: Reg, arg1: &VectorSize) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/aarch64/inst.isle line 2384. - let expr0_0 = VecMisc2::Rev64; - let expr1_0 = constructor_vec_misc(ctx, &expr0_0, pattern0_0, pattern1_0); - return expr1_0; -} - -// Generated as internal constructor for term xtn. -pub fn constructor_xtn(ctx: &mut C, arg0: Reg, arg1: &ScalarSize) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/aarch64/inst.isle line 2388. - let expr0_0 = VecRRNarrowOp::Xtn; - let expr1_0 = constructor_vec_rr_narrow_low(ctx, &expr0_0, pattern0_0, pattern1_0); - return expr1_0; -} - -// Generated as internal constructor for term fcvtn. -pub fn constructor_fcvtn(ctx: &mut C, arg0: Reg, arg1: &ScalarSize) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/aarch64/inst.isle line 2392. - let expr0_0 = VecRRNarrowOp::Fcvtn; - let expr1_0 = constructor_vec_rr_narrow_low(ctx, &expr0_0, pattern0_0, pattern1_0); - return expr1_0; -} - -// Generated as internal constructor for term sqxtn. -pub fn constructor_sqxtn(ctx: &mut C, arg0: Reg, arg1: &ScalarSize) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/aarch64/inst.isle line 2396. - let expr0_0 = VecRRNarrowOp::Sqxtn; - let expr1_0 = constructor_vec_rr_narrow_low(ctx, &expr0_0, pattern0_0, pattern1_0); - return expr1_0; -} - -// Generated as internal constructor for term sqxtn2. -pub fn constructor_sqxtn2(ctx: &mut C, arg0: Reg, arg1: Reg, arg2: &ScalarSize) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/aarch64/inst.isle line 2400. - let expr0_0 = VecRRNarrowOp::Sqxtn; - let expr1_0 = constructor_vec_rr_narrow_high(ctx, &expr0_0, pattern0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term sqxtun. -pub fn constructor_sqxtun(ctx: &mut C, arg0: Reg, arg1: &ScalarSize) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/aarch64/inst.isle line 2404. - let expr0_0 = VecRRNarrowOp::Sqxtun; - let expr1_0 = constructor_vec_rr_narrow_low(ctx, &expr0_0, pattern0_0, pattern1_0); - return expr1_0; -} - -// Generated as internal constructor for term sqxtun2. -pub fn constructor_sqxtun2( - ctx: &mut C, - arg0: Reg, - arg1: Reg, - arg2: &ScalarSize, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/aarch64/inst.isle line 2408. - let expr0_0 = VecRRNarrowOp::Sqxtun; - let expr1_0 = constructor_vec_rr_narrow_high(ctx, &expr0_0, pattern0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term uqxtn. -pub fn constructor_uqxtn(ctx: &mut C, arg0: Reg, arg1: &ScalarSize) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/aarch64/inst.isle line 2412. - let expr0_0 = VecRRNarrowOp::Uqxtn; - let expr1_0 = constructor_vec_rr_narrow_low(ctx, &expr0_0, pattern0_0, pattern1_0); - return expr1_0; -} - -// Generated as internal constructor for term uqxtn2. -pub fn constructor_uqxtn2(ctx: &mut C, arg0: Reg, arg1: Reg, arg2: &ScalarSize) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/aarch64/inst.isle line 2416. - let expr0_0 = VecRRNarrowOp::Uqxtn; - let expr1_0 = constructor_vec_rr_narrow_high(ctx, &expr0_0, pattern0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term aarch64_fence. -pub fn constructor_aarch64_fence(ctx: &mut C) -> SideEffectNoResult { - // Rule at src/isa/aarch64/inst.isle line 2420. - let expr0_0 = MInst::Fence; - let expr1_0 = SideEffectNoResult::Inst { inst: expr0_0 }; - return expr1_0; -} - -// Generated as internal constructor for term csdb. -pub fn constructor_csdb(ctx: &mut C) -> SideEffectNoResult { - // Rule at src/isa/aarch64/inst.isle line 2425. - let expr0_0 = MInst::Csdb; - let expr1_0 = SideEffectNoResult::Inst { inst: expr0_0 }; - return expr1_0; -} - -// Generated as internal constructor for term brk. -pub fn constructor_brk(ctx: &mut C) -> SideEffectNoResult { - // Rule at src/isa/aarch64/inst.isle line 2430. - let expr0_0 = MInst::Brk; - let expr1_0 = SideEffectNoResult::Inst { inst: expr0_0 }; - return expr1_0; -} - -// Generated as internal constructor for term addp. -pub fn constructor_addp(ctx: &mut C, arg0: Reg, arg1: Reg, arg2: &VectorSize) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/aarch64/inst.isle line 2435. - let expr0_0 = VecALUOp::Addp; - let expr1_0 = constructor_vec_rrr(ctx, &expr0_0, pattern0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term zip1. -pub fn constructor_zip1(ctx: &mut C, arg0: Reg, arg1: Reg, arg2: &VectorSize) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/aarch64/inst.isle line 2439. - let expr0_0 = VecALUOp::Zip1; - let expr1_0 = constructor_vec_rrr(ctx, &expr0_0, pattern0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term vec_abs. -pub fn constructor_vec_abs(ctx: &mut C, arg0: Reg, arg1: &VectorSize) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/aarch64/inst.isle line 2443. - let expr0_0 = VecMisc2::Abs; - let expr1_0 = constructor_vec_misc(ctx, &expr0_0, pattern0_0, pattern1_0); - return expr1_0; -} - -// Generated as internal constructor for term abs. -pub fn constructor_abs(ctx: &mut C, arg0: &OperandSize, arg1: Reg) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/aarch64/inst.isle line 2448. - let expr0_0: u8 = 0i128 as u8; - let expr1_0 = C::u8_into_imm12(ctx, expr0_0); - let expr2_0 = constructor_cmp_imm(ctx, pattern0_0, pattern1_0, expr1_0); - let expr3_0 = Cond::Gt; - let expr4_0 = constructor_csneg(ctx, &expr3_0, pattern1_0, pattern1_0); - let expr5_0 = constructor_with_flags(ctx, &expr2_0, &expr4_0); - let expr6_0: usize = 0i128 as usize; - let expr7_0 = C::value_regs_get(ctx, expr5_0, expr6_0); - return expr7_0; -} - -// Generated as internal constructor for term addv. -pub fn constructor_addv(ctx: &mut C, arg0: Reg, arg1: &VectorSize) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/aarch64/inst.isle line 2454. - let expr0_0 = VecLanesOp::Addv; - let expr1_0 = constructor_vec_lanes(ctx, &expr0_0, pattern0_0, pattern1_0); - return expr1_0; -} - -// Generated as internal constructor for term shll32. -pub fn constructor_shll32(ctx: &mut C, arg0: Reg, arg1: bool) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/aarch64/inst.isle line 2458. - let expr0_0 = VecRRLongOp::Shll32; - let expr1_0 = constructor_vec_rr_long(ctx, &expr0_0, pattern0_0, pattern1_0); - return expr1_0; -} - -// Generated as internal constructor for term saddlp8. -pub fn constructor_saddlp8(ctx: &mut C, arg0: Reg) -> Reg { - let pattern0_0 = arg0; - // Rule at src/isa/aarch64/inst.isle line 2463. - let expr0_0 = VecRRPairLongOp::Saddlp8; - let expr1_0 = constructor_vec_rr_pair_long(ctx, &expr0_0, pattern0_0); - return expr1_0; -} - -// Generated as internal constructor for term saddlp16. -pub fn constructor_saddlp16(ctx: &mut C, arg0: Reg) -> Reg { - let pattern0_0 = arg0; - // Rule at src/isa/aarch64/inst.isle line 2466. - let expr0_0 = VecRRPairLongOp::Saddlp16; - let expr1_0 = constructor_vec_rr_pair_long(ctx, &expr0_0, pattern0_0); - return expr1_0; -} - -// Generated as internal constructor for term uaddlp8. -pub fn constructor_uaddlp8(ctx: &mut C, arg0: Reg) -> Reg { - let pattern0_0 = arg0; - // Rule at src/isa/aarch64/inst.isle line 2469. - let expr0_0 = VecRRPairLongOp::Uaddlp8; - let expr1_0 = constructor_vec_rr_pair_long(ctx, &expr0_0, pattern0_0); - return expr1_0; -} - -// Generated as internal constructor for term uaddlp16. -pub fn constructor_uaddlp16(ctx: &mut C, arg0: Reg) -> Reg { - let pattern0_0 = arg0; - // Rule at src/isa/aarch64/inst.isle line 2472. - let expr0_0 = VecRRPairLongOp::Uaddlp16; - let expr1_0 = constructor_vec_rr_pair_long(ctx, &expr0_0, pattern0_0); - return expr1_0; -} - -// Generated as internal constructor for term umlal32. -pub fn constructor_umlal32( - ctx: &mut C, - arg0: Reg, - arg1: Reg, - arg2: Reg, - arg3: bool, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - // Rule at src/isa/aarch64/inst.isle line 2476. - let expr0_0 = VecRRRLongModOp::Umlal32; - let expr1_0 = constructor_vec_rrrr_long( - ctx, &expr0_0, pattern0_0, pattern1_0, pattern2_0, pattern3_0, - ); - return expr1_0; -} - -// Generated as internal constructor for term smull8. -pub fn constructor_smull8(ctx: &mut C, arg0: Reg, arg1: Reg, arg2: bool) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/aarch64/inst.isle line 2480. - let expr0_0 = VecRRRLongOp::Smull8; - let expr1_0 = constructor_vec_rrr_long(ctx, &expr0_0, pattern0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term umull8. -pub fn constructor_umull8(ctx: &mut C, arg0: Reg, arg1: Reg, arg2: bool) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/aarch64/inst.isle line 2484. - let expr0_0 = VecRRRLongOp::Umull8; - let expr1_0 = constructor_vec_rrr_long(ctx, &expr0_0, pattern0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term smull16. -pub fn constructor_smull16(ctx: &mut C, arg0: Reg, arg1: Reg, arg2: bool) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/aarch64/inst.isle line 2488. - let expr0_0 = VecRRRLongOp::Smull16; - let expr1_0 = constructor_vec_rrr_long(ctx, &expr0_0, pattern0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term umull16. -pub fn constructor_umull16(ctx: &mut C, arg0: Reg, arg1: Reg, arg2: bool) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/aarch64/inst.isle line 2492. - let expr0_0 = VecRRRLongOp::Umull16; - let expr1_0 = constructor_vec_rrr_long(ctx, &expr0_0, pattern0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term smull32. -pub fn constructor_smull32(ctx: &mut C, arg0: Reg, arg1: Reg, arg2: bool) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/aarch64/inst.isle line 2496. - let expr0_0 = VecRRRLongOp::Smull32; - let expr1_0 = constructor_vec_rrr_long(ctx, &expr0_0, pattern0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term umull32. -pub fn constructor_umull32(ctx: &mut C, arg0: Reg, arg1: Reg, arg2: bool) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/aarch64/inst.isle line 2500. - let expr0_0 = VecRRRLongOp::Umull32; - let expr1_0 = constructor_vec_rrr_long(ctx, &expr0_0, pattern0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term asr. -pub fn constructor_asr(ctx: &mut C, arg0: Type, arg1: Reg, arg2: Reg) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/aarch64/inst.isle line 2504. - let expr0_0 = ALUOp::Asr; - let expr1_0 = constructor_alu_rrr(ctx, &expr0_0, pattern0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term asr_imm. -pub fn constructor_asr_imm(ctx: &mut C, arg0: Type, arg1: Reg, arg2: ImmShift) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/aarch64/inst.isle line 2507. - let expr0_0 = ALUOp::Asr; - let expr1_0 = constructor_alu_rr_imm_shift(ctx, &expr0_0, pattern0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term lsr. -pub fn constructor_lsr(ctx: &mut C, arg0: Type, arg1: Reg, arg2: Reg) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/aarch64/inst.isle line 2511. - let expr0_0 = ALUOp::Lsr; - let expr1_0 = constructor_alu_rrr(ctx, &expr0_0, pattern0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term lsr_imm. -pub fn constructor_lsr_imm(ctx: &mut C, arg0: Type, arg1: Reg, arg2: ImmShift) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/aarch64/inst.isle line 2514. - let expr0_0 = ALUOp::Lsr; - let expr1_0 = constructor_alu_rr_imm_shift(ctx, &expr0_0, pattern0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term lsl. -pub fn constructor_lsl(ctx: &mut C, arg0: Type, arg1: Reg, arg2: Reg) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/aarch64/inst.isle line 2518. - let expr0_0 = ALUOp::Lsl; - let expr1_0 = constructor_alu_rrr(ctx, &expr0_0, pattern0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term lsl_imm. -pub fn constructor_lsl_imm(ctx: &mut C, arg0: Type, arg1: Reg, arg2: ImmShift) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/aarch64/inst.isle line 2521. - let expr0_0 = ALUOp::Lsl; - let expr1_0 = constructor_alu_rr_imm_shift(ctx, &expr0_0, pattern0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term a64_udiv. -pub fn constructor_a64_udiv(ctx: &mut C, arg0: Type, arg1: Reg, arg2: Reg) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/aarch64/inst.isle line 2525. - let expr0_0 = ALUOp::UDiv; - let expr1_0 = constructor_alu_rrr(ctx, &expr0_0, pattern0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term a64_sdiv. -pub fn constructor_a64_sdiv(ctx: &mut C, arg0: Type, arg1: Reg, arg2: Reg) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/aarch64/inst.isle line 2529. - let expr0_0 = ALUOp::SDiv; - let expr1_0 = constructor_alu_rrr(ctx, &expr0_0, pattern0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term not. -pub fn constructor_not(ctx: &mut C, arg0: Reg, arg1: &VectorSize) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/aarch64/inst.isle line 2533. - let expr0_0 = VecMisc2::Not; - let expr1_0 = constructor_vec_misc(ctx, &expr0_0, pattern0_0, pattern1_0); - return expr1_0; -} - -// Generated as internal constructor for term orr_not. -pub fn constructor_orr_not(ctx: &mut C, arg0: Type, arg1: Reg, arg2: Reg) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/aarch64/inst.isle line 2538. - let expr0_0 = ALUOp::OrrNot; - let expr1_0 = constructor_alu_rrr(ctx, &expr0_0, pattern0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term orr_not_shift. -pub fn constructor_orr_not_shift( - ctx: &mut C, - arg0: Type, - arg1: Reg, - arg2: Reg, - arg3: ShiftOpAndAmt, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - // Rule at src/isa/aarch64/inst.isle line 2541. - let expr0_0 = ALUOp::OrrNot; - let expr1_0 = constructor_alu_rrr_shift( - ctx, &expr0_0, pattern0_0, pattern1_0, pattern2_0, pattern3_0, - ); - return expr1_0; -} - -// Generated as internal constructor for term orr. -pub fn constructor_orr(ctx: &mut C, arg0: Type, arg1: Reg, arg2: Reg) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/aarch64/inst.isle line 2546. - let expr0_0 = ALUOp::Orr; - let expr1_0 = constructor_alu_rrr(ctx, &expr0_0, pattern0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term orr_imm. -pub fn constructor_orr_imm(ctx: &mut C, arg0: Type, arg1: Reg, arg2: ImmLogic) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/aarch64/inst.isle line 2549. - let expr0_0 = ALUOp::Orr; - let expr1_0 = constructor_alu_rr_imm_logic(ctx, &expr0_0, pattern0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term orr_vec. -pub fn constructor_orr_vec( - ctx: &mut C, - arg0: Reg, - arg1: Reg, - arg2: &VectorSize, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/aarch64/inst.isle line 2552. - let expr0_0 = VecALUOp::Orr; - let expr1_0 = constructor_vec_rrr(ctx, &expr0_0, pattern0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term and_reg. -pub fn constructor_and_reg(ctx: &mut C, arg0: Type, arg1: Reg, arg2: Reg) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/aarch64/inst.isle line 2557. - let expr0_0 = ALUOp::And; - let expr1_0 = constructor_alu_rrr(ctx, &expr0_0, pattern0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term and_imm. -pub fn constructor_and_imm(ctx: &mut C, arg0: Type, arg1: Reg, arg2: ImmLogic) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/aarch64/inst.isle line 2560. - let expr0_0 = ALUOp::And; - let expr1_0 = constructor_alu_rr_imm_logic(ctx, &expr0_0, pattern0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term and_vec. -pub fn constructor_and_vec( - ctx: &mut C, - arg0: Reg, - arg1: Reg, - arg2: &VectorSize, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/aarch64/inst.isle line 2563. - let expr0_0 = VecALUOp::And; - let expr1_0 = constructor_vec_rrr(ctx, &expr0_0, pattern0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term eor_vec. -pub fn constructor_eor_vec( - ctx: &mut C, - arg0: Reg, - arg1: Reg, - arg2: &VectorSize, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/aarch64/inst.isle line 2567. - let expr0_0 = VecALUOp::Eor; - let expr1_0 = constructor_vec_rrr(ctx, &expr0_0, pattern0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term bic. -pub fn constructor_bic(ctx: &mut C, arg0: Type, arg1: Reg, arg2: Reg) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/aarch64/inst.isle line 2572. - let expr0_0 = ALUOp::AndNot; - let expr1_0 = constructor_alu_rrr(ctx, &expr0_0, pattern0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term bic_vec. -pub fn constructor_bic_vec( - ctx: &mut C, - arg0: Reg, - arg1: Reg, - arg2: &VectorSize, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/aarch64/inst.isle line 2575. - let expr0_0 = VecALUOp::Bic; - let expr1_0 = constructor_vec_rrr(ctx, &expr0_0, pattern0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term sshl. -pub fn constructor_sshl(ctx: &mut C, arg0: Reg, arg1: Reg, arg2: &VectorSize) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/aarch64/inst.isle line 2579. - let expr0_0 = VecALUOp::Sshl; - let expr1_0 = constructor_vec_rrr(ctx, &expr0_0, pattern0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term ushl. -pub fn constructor_ushl(ctx: &mut C, arg0: Reg, arg1: Reg, arg2: &VectorSize) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/aarch64/inst.isle line 2583. - let expr0_0 = VecALUOp::Ushl; - let expr1_0 = constructor_vec_rrr(ctx, &expr0_0, pattern0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term a64_rotr. -pub fn constructor_a64_rotr(ctx: &mut C, arg0: Type, arg1: Reg, arg2: Reg) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/aarch64/inst.isle line 2588. - let expr0_0 = ALUOp::RotR; - let expr1_0 = constructor_alu_rrr(ctx, &expr0_0, pattern0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term a64_rotr_imm. -pub fn constructor_a64_rotr_imm( - ctx: &mut C, - arg0: Type, - arg1: Reg, - arg2: ImmShift, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/aarch64/inst.isle line 2591. - let expr0_0 = ALUOp::RotR; - let expr1_0 = constructor_alu_rr_imm_shift(ctx, &expr0_0, pattern0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term rbit. -pub fn constructor_rbit(ctx: &mut C, arg0: Type, arg1: Reg) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/aarch64/inst.isle line 2596. - let expr0_0 = BitOp::RBit; - let expr1_0 = constructor_bit_rr(ctx, &expr0_0, pattern0_0, pattern1_0); - return expr1_0; -} - -// Generated as internal constructor for term a64_clz. -pub fn constructor_a64_clz(ctx: &mut C, arg0: Type, arg1: Reg) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/aarch64/inst.isle line 2601. - let expr0_0 = BitOp::Clz; - let expr1_0 = constructor_bit_rr(ctx, &expr0_0, pattern0_0, pattern1_0); - return expr1_0; -} - -// Generated as internal constructor for term a64_cls. -pub fn constructor_a64_cls(ctx: &mut C, arg0: Type, arg1: Reg) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/aarch64/inst.isle line 2606. - let expr0_0 = BitOp::Cls; - let expr1_0 = constructor_bit_rr(ctx, &expr0_0, pattern0_0, pattern1_0); - return expr1_0; -} - -// Generated as internal constructor for term a64_rev16. -pub fn constructor_a64_rev16(ctx: &mut C, arg0: Type, arg1: Reg) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/aarch64/inst.isle line 2611. - let expr0_0 = BitOp::Rev16; - let expr1_0 = constructor_bit_rr(ctx, &expr0_0, pattern0_0, pattern1_0); - return expr1_0; -} - -// Generated as internal constructor for term a64_rev32. -pub fn constructor_a64_rev32(ctx: &mut C, arg0: Type, arg1: Reg) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/aarch64/inst.isle line 2614. - let expr0_0 = BitOp::Rev32; - let expr1_0 = constructor_bit_rr(ctx, &expr0_0, pattern0_0, pattern1_0); - return expr1_0; -} - -// Generated as internal constructor for term a64_rev64. -pub fn constructor_a64_rev64(ctx: &mut C, arg0: Type, arg1: Reg) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/aarch64/inst.isle line 2617. - let expr0_0 = BitOp::Rev64; - let expr1_0 = constructor_bit_rr(ctx, &expr0_0, pattern0_0, pattern1_0); - return expr1_0; -} - -// Generated as internal constructor for term eon. -pub fn constructor_eon(ctx: &mut C, arg0: Type, arg1: Reg, arg2: Reg) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/aarch64/inst.isle line 2622. - let expr0_0 = ALUOp::EorNot; - let expr1_0 = constructor_alu_rrr(ctx, &expr0_0, pattern0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term vec_cnt. -pub fn constructor_vec_cnt(ctx: &mut C, arg0: Reg, arg1: &VectorSize) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/aarch64/inst.isle line 2627. - let expr0_0 = VecMisc2::Cnt; - let expr1_0 = constructor_vec_misc(ctx, &expr0_0, pattern0_0, pattern1_0); - return expr1_0; -} - -// Generated as internal constructor for term bsl. -pub fn constructor_bsl( - ctx: &mut C, - arg0: Type, - arg1: Reg, - arg2: Reg, - arg3: Reg, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - // Rule at src/isa/aarch64/inst.isle line 2632. - let expr0_0 = VecALUModOp::Bsl; - let expr1_0 = constructor_vector_size(ctx, pattern0_0); - let expr2_0 = - constructor_vec_rrr_mod(ctx, &expr0_0, pattern1_0, pattern2_0, pattern3_0, &expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term udf. -pub fn constructor_udf(ctx: &mut C, arg0: &TrapCode) -> SideEffectNoResult { - let pattern0_0 = arg0; - // Rule at src/isa/aarch64/inst.isle line 2638. - let expr0_0 = MInst::Udf { - trap_code: pattern0_0.clone(), - }; - let expr1_0 = SideEffectNoResult::Inst { inst: expr0_0 }; - return expr1_0; -} - -// Generated as internal constructor for term aarch64_uload8. -pub fn constructor_aarch64_uload8(ctx: &mut C, arg0: &AMode, arg1: MemFlags) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/aarch64/inst.isle line 2644. - let expr0_0: Type = I64; - let expr1_0 = C::temp_writable_reg(ctx, expr0_0); - let expr2_0 = MInst::ULoad8 { - rd: expr1_0, - mem: pattern0_0.clone(), - flags: pattern1_0, - }; - let expr3_0 = C::emit(ctx, &expr2_0); - let expr4_0 = C::writable_reg_to_reg(ctx, expr1_0); - return expr4_0; -} - -// Generated as internal constructor for term aarch64_sload8. -pub fn constructor_aarch64_sload8(ctx: &mut C, arg0: &AMode, arg1: MemFlags) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/aarch64/inst.isle line 2649. - let expr0_0: Type = I64; - let expr1_0 = C::temp_writable_reg(ctx, expr0_0); - let expr2_0 = MInst::SLoad8 { - rd: expr1_0, - mem: pattern0_0.clone(), - flags: pattern1_0, - }; - let expr3_0 = C::emit(ctx, &expr2_0); - let expr4_0 = C::writable_reg_to_reg(ctx, expr1_0); - return expr4_0; -} - -// Generated as internal constructor for term aarch64_uload16. -pub fn constructor_aarch64_uload16(ctx: &mut C, arg0: &AMode, arg1: MemFlags) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/aarch64/inst.isle line 2654. - let expr0_0: Type = I64; - let expr1_0 = C::temp_writable_reg(ctx, expr0_0); - let expr2_0 = MInst::ULoad16 { - rd: expr1_0, - mem: pattern0_0.clone(), - flags: pattern1_0, - }; - let expr3_0 = C::emit(ctx, &expr2_0); - let expr4_0 = C::writable_reg_to_reg(ctx, expr1_0); - return expr4_0; -} - -// Generated as internal constructor for term aarch64_sload16. -pub fn constructor_aarch64_sload16(ctx: &mut C, arg0: &AMode, arg1: MemFlags) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/aarch64/inst.isle line 2659. - let expr0_0: Type = I64; - let expr1_0 = C::temp_writable_reg(ctx, expr0_0); - let expr2_0 = MInst::SLoad16 { - rd: expr1_0, - mem: pattern0_0.clone(), - flags: pattern1_0, - }; - let expr3_0 = C::emit(ctx, &expr2_0); - let expr4_0 = C::writable_reg_to_reg(ctx, expr1_0); - return expr4_0; -} - -// Generated as internal constructor for term aarch64_uload32. -pub fn constructor_aarch64_uload32(ctx: &mut C, arg0: &AMode, arg1: MemFlags) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/aarch64/inst.isle line 2664. - let expr0_0: Type = I64; - let expr1_0 = C::temp_writable_reg(ctx, expr0_0); - let expr2_0 = MInst::ULoad32 { - rd: expr1_0, - mem: pattern0_0.clone(), - flags: pattern1_0, - }; - let expr3_0 = C::emit(ctx, &expr2_0); - let expr4_0 = C::writable_reg_to_reg(ctx, expr1_0); - return expr4_0; -} - -// Generated as internal constructor for term aarch64_sload32. -pub fn constructor_aarch64_sload32(ctx: &mut C, arg0: &AMode, arg1: MemFlags) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/aarch64/inst.isle line 2669. - let expr0_0: Type = I64; - let expr1_0 = C::temp_writable_reg(ctx, expr0_0); - let expr2_0 = MInst::SLoad32 { - rd: expr1_0, - mem: pattern0_0.clone(), - flags: pattern1_0, - }; - let expr3_0 = C::emit(ctx, &expr2_0); - let expr4_0 = C::writable_reg_to_reg(ctx, expr1_0); - return expr4_0; -} - -// Generated as internal constructor for term aarch64_uload64. -pub fn constructor_aarch64_uload64(ctx: &mut C, arg0: &AMode, arg1: MemFlags) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/aarch64/inst.isle line 2674. - let expr0_0: Type = I64; - let expr1_0 = C::temp_writable_reg(ctx, expr0_0); - let expr2_0 = MInst::ULoad64 { - rd: expr1_0, - mem: pattern0_0.clone(), - flags: pattern1_0, - }; - let expr3_0 = C::emit(ctx, &expr2_0); - let expr4_0 = C::writable_reg_to_reg(ctx, expr1_0); - return expr4_0; -} - -// Generated as internal constructor for term aarch64_fpuload32. -pub fn constructor_aarch64_fpuload32(ctx: &mut C, arg0: &AMode, arg1: MemFlags) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/aarch64/inst.isle line 2679. - let expr0_0: Type = F64; - let expr1_0 = C::temp_writable_reg(ctx, expr0_0); - let expr2_0 = MInst::FpuLoad32 { - rd: expr1_0, - mem: pattern0_0.clone(), - flags: pattern1_0, - }; - let expr3_0 = C::emit(ctx, &expr2_0); - let expr4_0 = C::writable_reg_to_reg(ctx, expr1_0); - return expr4_0; -} - -// Generated as internal constructor for term aarch64_fpuload64. -pub fn constructor_aarch64_fpuload64(ctx: &mut C, arg0: &AMode, arg1: MemFlags) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/aarch64/inst.isle line 2684. - let expr0_0: Type = F64; - let expr1_0 = C::temp_writable_reg(ctx, expr0_0); - let expr2_0 = MInst::FpuLoad64 { - rd: expr1_0, - mem: pattern0_0.clone(), - flags: pattern1_0, - }; - let expr3_0 = C::emit(ctx, &expr2_0); - let expr4_0 = C::writable_reg_to_reg(ctx, expr1_0); - return expr4_0; -} - -// Generated as internal constructor for term aarch64_fpuload128. -pub fn constructor_aarch64_fpuload128( - ctx: &mut C, - arg0: &AMode, - arg1: MemFlags, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/aarch64/inst.isle line 2689. - let expr0_0: Type = F64X2; - let expr1_0 = C::temp_writable_reg(ctx, expr0_0); - let expr2_0 = MInst::FpuLoad128 { - rd: expr1_0, - mem: pattern0_0.clone(), - flags: pattern1_0, - }; - let expr3_0 = C::emit(ctx, &expr2_0); - let expr4_0 = C::writable_reg_to_reg(ctx, expr1_0); - return expr4_0; -} - -// Generated as internal constructor for term aarch64_loadp64. -pub fn constructor_aarch64_loadp64( - ctx: &mut C, - arg0: &PairAMode, - arg1: MemFlags, -) -> ValueRegs { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/aarch64/inst.isle line 2694. - let expr0_0: Type = I64; - let expr1_0 = C::temp_writable_reg(ctx, expr0_0); - let expr2_0: Type = I64; - let expr3_0 = C::temp_writable_reg(ctx, expr2_0); - let expr4_0 = MInst::LoadP64 { - rt: expr1_0, - rt2: expr3_0, - mem: pattern0_0.clone(), - flags: pattern1_0, - }; - let expr5_0 = C::emit(ctx, &expr4_0); - let expr6_0 = C::writable_reg_to_reg(ctx, expr1_0); - let expr7_0 = C::writable_reg_to_reg(ctx, expr3_0); - let expr8_0 = C::value_regs(ctx, expr6_0, expr7_0); - return expr8_0; -} - -// Generated as internal constructor for term aarch64_store8. -pub fn constructor_aarch64_store8( - ctx: &mut C, - arg0: &AMode, - arg1: MemFlags, - arg2: Reg, -) -> SideEffectNoResult { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/aarch64/inst.isle line 2703. - let expr0_0 = MInst::Store8 { - rd: pattern2_0, - mem: pattern0_0.clone(), - flags: pattern1_0, - }; - let expr1_0 = SideEffectNoResult::Inst { inst: expr0_0 }; - return expr1_0; -} - -// Generated as internal constructor for term aarch64_store16. -pub fn constructor_aarch64_store16( - ctx: &mut C, - arg0: &AMode, - arg1: MemFlags, - arg2: Reg, -) -> SideEffectNoResult { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/aarch64/inst.isle line 2706. - let expr0_0 = MInst::Store16 { - rd: pattern2_0, - mem: pattern0_0.clone(), - flags: pattern1_0, - }; - let expr1_0 = SideEffectNoResult::Inst { inst: expr0_0 }; - return expr1_0; -} - -// Generated as internal constructor for term aarch64_store32. -pub fn constructor_aarch64_store32( - ctx: &mut C, - arg0: &AMode, - arg1: MemFlags, - arg2: Reg, -) -> SideEffectNoResult { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/aarch64/inst.isle line 2709. - let expr0_0 = MInst::Store32 { - rd: pattern2_0, - mem: pattern0_0.clone(), - flags: pattern1_0, - }; - let expr1_0 = SideEffectNoResult::Inst { inst: expr0_0 }; - return expr1_0; -} - -// Generated as internal constructor for term aarch64_store64. -pub fn constructor_aarch64_store64( - ctx: &mut C, - arg0: &AMode, - arg1: MemFlags, - arg2: Reg, -) -> SideEffectNoResult { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/aarch64/inst.isle line 2712. - let expr0_0 = MInst::Store64 { - rd: pattern2_0, - mem: pattern0_0.clone(), - flags: pattern1_0, - }; - let expr1_0 = SideEffectNoResult::Inst { inst: expr0_0 }; - return expr1_0; -} - -// Generated as internal constructor for term aarch64_fpustore32. -pub fn constructor_aarch64_fpustore32( - ctx: &mut C, - arg0: &AMode, - arg1: MemFlags, - arg2: Reg, -) -> SideEffectNoResult { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/aarch64/inst.isle line 2715. - let expr0_0 = MInst::FpuStore32 { - rd: pattern2_0, - mem: pattern0_0.clone(), - flags: pattern1_0, - }; - let expr1_0 = SideEffectNoResult::Inst { inst: expr0_0 }; - return expr1_0; -} - -// Generated as internal constructor for term aarch64_fpustore64. -pub fn constructor_aarch64_fpustore64( - ctx: &mut C, - arg0: &AMode, - arg1: MemFlags, - arg2: Reg, -) -> SideEffectNoResult { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/aarch64/inst.isle line 2718. - let expr0_0 = MInst::FpuStore64 { - rd: pattern2_0, - mem: pattern0_0.clone(), - flags: pattern1_0, - }; - let expr1_0 = SideEffectNoResult::Inst { inst: expr0_0 }; - return expr1_0; -} - -// Generated as internal constructor for term aarch64_fpustore128. -pub fn constructor_aarch64_fpustore128( - ctx: &mut C, - arg0: &AMode, - arg1: MemFlags, - arg2: Reg, -) -> SideEffectNoResult { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/aarch64/inst.isle line 2721. - let expr0_0 = MInst::FpuStore128 { - rd: pattern2_0, - mem: pattern0_0.clone(), - flags: pattern1_0, - }; - let expr1_0 = SideEffectNoResult::Inst { inst: expr0_0 }; - return expr1_0; -} - -// Generated as internal constructor for term aarch64_storep64. -pub fn constructor_aarch64_storep64( - ctx: &mut C, - arg0: &PairAMode, - arg1: MemFlags, - arg2: Reg, - arg3: Reg, -) -> SideEffectNoResult { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - // Rule at src/isa/aarch64/inst.isle line 2724. - let expr0_0 = MInst::StoreP64 { - rt: pattern2_0, - rt2: pattern3_0, - mem: pattern0_0.clone(), - flags: pattern1_0, - }; - let expr1_0 = SideEffectNoResult::Inst { inst: expr0_0 }; - return expr1_0; -} - -// Generated as internal constructor for term trap_if. -pub fn constructor_trap_if( - ctx: &mut C, - arg0: &ProducesFlags, - arg1: &TrapCode, - arg2: &Cond, -) -> InstOutput { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/aarch64/inst.isle line 2730. - let expr0_0 = C::cond_br_cond(ctx, pattern2_0); - let expr1_0 = MInst::TrapIf { - kind: expr0_0, - trap_code: pattern1_0.clone(), - }; - let expr2_0 = ConsumesFlags::ConsumesFlagsSideEffect { inst: expr1_0 }; - let expr3_0 = constructor_with_flags_side_effect(ctx, pattern0_0, &expr2_0); - let expr4_0 = constructor_side_effect(ctx, &expr3_0); - return expr4_0; -} - -// Generated as internal constructor for term imm. -pub fn constructor_imm(ctx: &mut C, arg0: Type, arg1: &ImmExtend, arg2: u64) -> Reg { - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::integral_ty(ctx, pattern0_0) { - let pattern2_0 = arg1; - if let &ImmExtend::Zero = pattern2_0 { - let pattern4_0 = arg2; - let mut closure5 = || { - let expr0_0 = C::move_wide_const_from_u64(ctx, pattern1_0, pattern4_0)?; - return Some(expr0_0); - }; - if let Some(pattern5_0) = closure5() { - // Rule at src/isa/aarch64/inst.isle line 2758. - let expr0_0 = constructor_operand_size(ctx, pattern1_0); - let expr1_0 = constructor_movz(ctx, pattern5_0, &expr0_0); - return expr1_0; - } - } - } - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::integral_ty(ctx, pattern0_0) { - if let Some(pattern2_0) = C::ty_32_or_64(ctx, pattern1_0) { - let pattern3_0 = arg1; - if let &ImmExtend::Zero = pattern3_0 { - let pattern5_0 = arg2; - let mut closure6 = || { - let expr0_0 = - C::move_wide_const_from_inverted_u64(ctx, pattern2_0, pattern5_0)?; - return Some(expr0_0); - }; - if let Some(pattern6_0) = closure6() { - // Rule at src/isa/aarch64/inst.isle line 2761. - let expr0_0 = constructor_operand_size(ctx, pattern2_0); - let expr1_0 = constructor_movn(ctx, pattern6_0, &expr0_0); - return expr1_0; - } - } - } - } - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::integral_ty(ctx, pattern0_0) { - let pattern2_0 = arg1; - if let &ImmExtend::Zero = pattern2_0 { - let pattern4_0 = arg2; - let mut closure5 = || { - let expr0_0 = C::imm_logic_from_u64(ctx, pattern1_0, pattern4_0)?; - return Some(expr0_0); - }; - if let Some(pattern5_0) = closure5() { - // Rule at src/isa/aarch64/inst.isle line 2767. - let expr0_0 = C::zero_reg(ctx); - let expr1_0 = constructor_orr_imm(ctx, pattern1_0, expr0_0, pattern5_0); - return expr1_0; - } - } - } - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::integral_ty(ctx, pattern0_0) { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - // Rule at src/isa/aarch64/inst.isle line 2775. - let expr0_0 = C::load_constant64_full(ctx, pattern1_0, pattern2_0, pattern3_0); - return expr0_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "imm", "src/isa/aarch64/inst.isle line 2754" - ); -} - -// Generated as internal constructor for term put_in_reg_sext32. -pub fn constructor_put_in_reg_sext32(ctx: &mut C, arg0: Value) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = C::value_type(ctx, pattern0_0); - if pattern1_0 == I32 { - // Rule at src/isa/aarch64/inst.isle line 2786. - let expr0_0 = C::put_in_reg(ctx, pattern0_0); - return expr0_0; - } - if pattern1_0 == I64 { - // Rule at src/isa/aarch64/inst.isle line 2787. - let expr0_0 = C::put_in_reg(ctx, pattern0_0); - return expr0_0; - } - let pattern0_0 = arg0; - let pattern1_0 = C::value_type(ctx, pattern0_0); - if let Some(pattern2_0) = C::fits_in_32(ctx, pattern1_0) { - // Rule at src/isa/aarch64/inst.isle line 2782. - let expr0_0 = C::put_in_reg(ctx, pattern0_0); - let expr1_0: bool = true; - let expr2_0 = C::ty_bits(ctx, pattern2_0); - let expr3_0: u8 = 32i128 as u8; - let expr4_0 = constructor_extend(ctx, expr0_0, expr1_0, expr2_0, expr3_0); - return expr4_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "put_in_reg_sext32", "src/isa/aarch64/inst.isle line 2781" - ); -} - -// Generated as internal constructor for term put_in_reg_zext32. -pub fn constructor_put_in_reg_zext32(ctx: &mut C, arg0: Value) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = C::value_type(ctx, pattern0_0); - if pattern1_0 == I32 { - // Rule at src/isa/aarch64/inst.isle line 2795. - let expr0_0 = C::put_in_reg(ctx, pattern0_0); - return expr0_0; - } - if pattern1_0 == I64 { - // Rule at src/isa/aarch64/inst.isle line 2796. - let expr0_0 = C::put_in_reg(ctx, pattern0_0); - return expr0_0; - } - let pattern0_0 = arg0; - let pattern1_0 = C::value_type(ctx, pattern0_0); - if let Some(pattern2_0) = C::fits_in_32(ctx, pattern1_0) { - // Rule at src/isa/aarch64/inst.isle line 2791. - let expr0_0 = C::put_in_reg(ctx, pattern0_0); - let expr1_0: bool = false; - let expr2_0 = C::ty_bits(ctx, pattern2_0); - let expr3_0: u8 = 32i128 as u8; - let expr4_0 = constructor_extend(ctx, expr0_0, expr1_0, expr2_0, expr3_0); - return expr4_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "put_in_reg_zext32", "src/isa/aarch64/inst.isle line 2790" - ); -} - -// Generated as internal constructor for term put_in_reg_sext64. -pub fn constructor_put_in_reg_sext64(ctx: &mut C, arg0: Value) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = C::value_type(ctx, pattern0_0); - if let Some(pattern2_0) = C::fits_in_32(ctx, pattern1_0) { - // Rule at src/isa/aarch64/inst.isle line 2800. - let expr0_0 = C::put_in_reg(ctx, pattern0_0); - let expr1_0: bool = true; - let expr2_0 = C::ty_bits(ctx, pattern2_0); - let expr3_0: u8 = 64i128 as u8; - let expr4_0 = constructor_extend(ctx, expr0_0, expr1_0, expr2_0, expr3_0); - return expr4_0; - } - let pattern0_0 = arg0; - let pattern1_0 = C::value_type(ctx, pattern0_0); - if pattern1_0 == I64 { - // Rule at src/isa/aarch64/inst.isle line 2804. - let expr0_0 = C::put_in_reg(ctx, pattern0_0); - return expr0_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "put_in_reg_sext64", "src/isa/aarch64/inst.isle line 2799" - ); -} - -// Generated as internal constructor for term put_in_reg_zext64. -pub fn constructor_put_in_reg_zext64(ctx: &mut C, arg0: Value) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = C::value_type(ctx, pattern0_0); - if let Some(pattern2_0) = C::fits_in_32(ctx, pattern1_0) { - // Rule at src/isa/aarch64/inst.isle line 2808. - let expr0_0 = C::put_in_reg(ctx, pattern0_0); - let expr1_0: bool = false; - let expr2_0 = C::ty_bits(ctx, pattern2_0); - let expr3_0: u8 = 64i128 as u8; - let expr4_0 = constructor_extend(ctx, expr0_0, expr1_0, expr2_0, expr3_0); - return expr4_0; - } - let pattern0_0 = arg0; - let pattern1_0 = C::value_type(ctx, pattern0_0); - if pattern1_0 == I64 { - // Rule at src/isa/aarch64/inst.isle line 2812. - let expr0_0 = C::put_in_reg(ctx, pattern0_0); - return expr0_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "put_in_reg_zext64", "src/isa/aarch64/inst.isle line 2807" - ); -} - -// Generated as internal constructor for term trap_if_zero_divisor. -pub fn constructor_trap_if_zero_divisor(ctx: &mut C, arg0: Reg) -> Reg { - let pattern0_0 = arg0; - // Rule at src/isa/aarch64/inst.isle line 2817. - let expr0_0 = C::cond_br_zero(ctx, pattern0_0); - let expr1_0 = C::trap_code_division_by_zero(ctx); - let expr2_0 = MInst::TrapIf { - kind: expr0_0, - trap_code: expr1_0, - }; - let expr3_0 = C::emit(ctx, &expr2_0); - return pattern0_0; -} - -// Generated as internal constructor for term size_from_ty. -pub fn constructor_size_from_ty(ctx: &mut C, arg0: Type) -> OperandSize { - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::fits_in_32(ctx, pattern0_0) { - // Rule at src/isa/aarch64/inst.isle line 2822. - let expr0_0 = OperandSize::Size32; - return expr0_0; - } - let pattern0_0 = arg0; - if pattern0_0 == I64 { - // Rule at src/isa/aarch64/inst.isle line 2823. - let expr0_0 = OperandSize::Size64; - return expr0_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "size_from_ty", "src/isa/aarch64/inst.isle line 2821" - ); -} - -// Generated as internal constructor for term trap_if_div_overflow. -pub fn constructor_trap_if_div_overflow( - ctx: &mut C, - arg0: Type, - arg1: Reg, - arg2: Reg, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/aarch64/inst.isle line 2829. - let expr0_0 = ALUOp::AddS; - let expr1_0 = constructor_operand_size(ctx, pattern0_0); - let expr2_0 = C::writable_zero_reg(ctx); - let expr3_0: u8 = 1i128 as u8; - let expr4_0 = C::u8_into_imm12(ctx, expr3_0); - let expr5_0 = MInst::AluRRImm12 { - alu_op: expr0_0, - size: expr1_0, - rd: expr2_0, - rn: pattern2_0, - imm12: expr4_0, - }; - let expr6_0 = C::emit(ctx, &expr5_0); - let expr7_0 = constructor_size_from_ty(ctx, pattern0_0); - let expr8_0: u8 = 1i128 as u8; - let expr9_0 = C::u8_into_uimm5(ctx, expr8_0); - let expr10_0: bool = false; - let expr11_0: bool = false; - let expr12_0: bool = false; - let expr13_0: bool = false; - let expr14_0 = C::nzcv(ctx, expr10_0, expr11_0, expr12_0, expr13_0); - let expr15_0 = Cond::Eq; - let expr16_0 = MInst::CCmpImm { - size: expr7_0, - rn: pattern1_0, - imm: expr9_0, - nzcv: expr14_0, - cond: expr15_0, - }; - let expr17_0 = C::emit(ctx, &expr16_0); - let expr18_0 = Cond::Vs; - let expr19_0 = C::cond_br_cond(ctx, &expr18_0); - let expr20_0 = C::trap_code_integer_overflow(ctx); - let expr21_0 = MInst::TrapIf { - kind: expr19_0, - trap_code: expr20_0, - }; - let expr22_0 = C::emit(ctx, &expr21_0); - return pattern1_0; -} - -// Generated as internal constructor for term trap_if_overflow. -pub fn constructor_trap_if_overflow( - ctx: &mut C, - arg0: &ProducesFlags, - arg1: &TrapCode, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/aarch64/inst.isle line 2848. - let expr0_0 = Cond::Hs; - let expr1_0 = C::cond_br_cond(ctx, &expr0_0); - let expr2_0 = MInst::TrapIf { - kind: expr1_0, - trap_code: pattern1_0.clone(), - }; - let expr3_0 = ConsumesFlags::ConsumesFlagsSideEffect { inst: expr2_0 }; - let expr4_0 = constructor_with_flags_reg(ctx, pattern0_0, &expr3_0); - return expr4_0; -} - -// Generated as internal constructor for term sink_atomic_load. -pub fn constructor_sink_atomic_load(ctx: &mut C, arg0: Inst) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::LoadNoOffset { - opcode: ref pattern2_0, - arg: pattern2_1, - flags: pattern2_2, - } = &pattern1_0 - { - if let &Opcode::AtomicLoad = pattern2_0 { - // Rule at src/isa/aarch64/inst.isle line 2855. - let expr0_0 = C::sink_inst(ctx, pattern0_0); - let expr1_0 = C::put_in_reg(ctx, pattern2_1); - return expr1_0; - } - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "sink_atomic_load", "src/isa/aarch64/inst.isle line 2854" - ); -} - -// Generated as internal constructor for term alu_rs_imm_logic_commutative. -pub fn constructor_alu_rs_imm_logic_commutative( - ctx: &mut C, - arg0: &ALUOp, - arg1: Type, - arg2: Value, - arg3: Value, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - if let Some(pattern3_0) = C::def_inst(ctx, pattern2_0) { - let pattern4_0 = C::inst_data(ctx, pattern3_0); - match &pattern4_0 { - &InstructionData::UnaryImm { - opcode: ref pattern5_0, - imm: pattern5_1, - } => { - if let &Opcode::Iconst = pattern5_0 { - let pattern7_0 = arg3; - let mut closure8 = || { - let expr0_0 = C::imm_logic_from_imm64(ctx, pattern1_0, pattern5_1)?; - return Some(expr0_0); - }; - if let Some(pattern8_0) = closure8() { - // Rule at src/isa/aarch64/inst.isle line 2872. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = constructor_alu_rr_imm_logic( - ctx, pattern0_0, pattern1_0, expr0_0, pattern8_0, - ); - return expr1_0; - } - } - } - &InstructionData::Binary { - opcode: ref pattern5_0, - args: ref pattern5_1, - } => { - if let &Opcode::Ishl = pattern5_0 { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - if let Some(pattern8_0) = C::def_inst(ctx, pattern7_1) { - let pattern9_0 = C::inst_data(ctx, pattern8_0); - if let &InstructionData::UnaryImm { - opcode: ref pattern10_0, - imm: pattern10_1, - } = &pattern9_0 - { - if let &Opcode::Iconst = pattern10_0 { - let pattern12_0 = arg3; - let mut closure13 = || { - let expr0_0 = C::lshl_from_imm64(ctx, pattern1_0, pattern10_1)?; - return Some(expr0_0); - }; - if let Some(pattern13_0) = closure13() { - // Rule at src/isa/aarch64/inst.isle line 2880. - let expr0_0 = C::put_in_reg(ctx, pattern12_0); - let expr1_0 = C::put_in_reg(ctx, pattern7_0); - let expr2_0 = constructor_alu_rrr_shift( - ctx, - pattern0_0, - pattern1_0, - expr0_0, - expr1_0, - pattern13_0, - ); - return expr2_0; - } - } - } - } - } - } - _ => {} - } - } - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - if let Some(pattern4_0) = C::def_inst(ctx, pattern3_0) { - let pattern5_0 = C::inst_data(ctx, pattern4_0); - match &pattern5_0 { - &InstructionData::UnaryImm { - opcode: ref pattern6_0, - imm: pattern6_1, - } => { - if let &Opcode::Iconst = pattern6_0 { - let mut closure8 = || { - let expr0_0 = C::imm_logic_from_imm64(ctx, pattern1_0, pattern6_1)?; - return Some(expr0_0); - }; - if let Some(pattern8_0) = closure8() { - // Rule at src/isa/aarch64/inst.isle line 2869. - let expr0_0 = C::put_in_reg(ctx, pattern2_0); - let expr1_0 = constructor_alu_rr_imm_logic( - ctx, pattern0_0, pattern1_0, expr0_0, pattern8_0, - ); - return expr1_0; - } - } - } - &InstructionData::Binary { - opcode: ref pattern6_0, - args: ref pattern6_1, - } => { - if let &Opcode::Ishl = pattern6_0 { - let (pattern8_0, pattern8_1) = C::unpack_value_array_2(ctx, pattern6_1); - if let Some(pattern9_0) = C::def_inst(ctx, pattern8_1) { - let pattern10_0 = C::inst_data(ctx, pattern9_0); - if let &InstructionData::UnaryImm { - opcode: ref pattern11_0, - imm: pattern11_1, - } = &pattern10_0 - { - if let &Opcode::Iconst = pattern11_0 { - let mut closure13 = || { - let expr0_0 = C::lshl_from_imm64(ctx, pattern1_0, pattern11_1)?; - return Some(expr0_0); - }; - if let Some(pattern13_0) = closure13() { - // Rule at src/isa/aarch64/inst.isle line 2877. - let expr0_0 = C::put_in_reg(ctx, pattern2_0); - let expr1_0 = C::put_in_reg(ctx, pattern8_0); - let expr2_0 = constructor_alu_rrr_shift( - ctx, - pattern0_0, - pattern1_0, - expr0_0, - expr1_0, - pattern13_0, - ); - return expr2_0; - } - } - } - } - } - } - _ => {} - } - } - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - // Rule at src/isa/aarch64/inst.isle line 2865. - let expr0_0 = C::put_in_reg(ctx, pattern2_0); - let expr1_0 = C::put_in_reg(ctx, pattern3_0); - let expr2_0 = constructor_alu_rrr(ctx, pattern0_0, pattern1_0, expr0_0, expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term alu_rs_imm_logic. -pub fn constructor_alu_rs_imm_logic( - ctx: &mut C, - arg0: &ALUOp, - arg1: Type, - arg2: Value, - arg3: Value, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - if let Some(pattern4_0) = C::def_inst(ctx, pattern3_0) { - let pattern5_0 = C::inst_data(ctx, pattern4_0); - match &pattern5_0 { - &InstructionData::UnaryImm { - opcode: ref pattern6_0, - imm: pattern6_1, - } => { - if let &Opcode::Iconst = pattern6_0 { - let mut closure8 = || { - let expr0_0 = C::imm_logic_from_imm64(ctx, pattern1_0, pattern6_1)?; - return Some(expr0_0); - }; - if let Some(pattern8_0) = closure8() { - // Rule at src/isa/aarch64/inst.isle line 2889. - let expr0_0 = C::put_in_reg(ctx, pattern2_0); - let expr1_0 = constructor_alu_rr_imm_logic( - ctx, pattern0_0, pattern1_0, expr0_0, pattern8_0, - ); - return expr1_0; - } - } - } - &InstructionData::Binary { - opcode: ref pattern6_0, - args: ref pattern6_1, - } => { - if let &Opcode::Ishl = pattern6_0 { - let (pattern8_0, pattern8_1) = C::unpack_value_array_2(ctx, pattern6_1); - if let Some(pattern9_0) = C::def_inst(ctx, pattern8_1) { - let pattern10_0 = C::inst_data(ctx, pattern9_0); - if let &InstructionData::UnaryImm { - opcode: ref pattern11_0, - imm: pattern11_1, - } = &pattern10_0 - { - if let &Opcode::Iconst = pattern11_0 { - let mut closure13 = || { - let expr0_0 = C::lshl_from_imm64(ctx, pattern1_0, pattern11_1)?; - return Some(expr0_0); - }; - if let Some(pattern13_0) = closure13() { - // Rule at src/isa/aarch64/inst.isle line 2892. - let expr0_0 = C::put_in_reg(ctx, pattern2_0); - let expr1_0 = C::put_in_reg(ctx, pattern8_0); - let expr2_0 = constructor_alu_rrr_shift( - ctx, - pattern0_0, - pattern1_0, - expr0_0, - expr1_0, - pattern13_0, - ); - return expr2_0; - } - } - } - } - } - } - _ => {} - } - } - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - // Rule at src/isa/aarch64/inst.isle line 2887. - let expr0_0 = C::put_in_reg(ctx, pattern2_0); - let expr1_0 = C::put_in_reg(ctx, pattern3_0); - let expr2_0 = constructor_alu_rrr(ctx, pattern0_0, pattern1_0, expr0_0, expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term i128_alu_bitop. -pub fn constructor_i128_alu_bitop( - ctx: &mut C, - arg0: &ALUOp, - arg1: Type, - arg2: Value, - arg3: Value, -) -> ValueRegs { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - // Rule at src/isa/aarch64/inst.isle line 2901. - let expr0_0 = C::put_in_regs(ctx, pattern2_0); - let expr1_0: usize = 0i128 as usize; - let expr2_0 = C::value_regs_get(ctx, expr0_0, expr1_0); - let expr3_0: usize = 1i128 as usize; - let expr4_0 = C::value_regs_get(ctx, expr0_0, expr3_0); - let expr5_0 = C::put_in_regs(ctx, pattern3_0); - let expr6_0: usize = 0i128 as usize; - let expr7_0 = C::value_regs_get(ctx, expr5_0, expr6_0); - let expr8_0: usize = 1i128 as usize; - let expr9_0 = C::value_regs_get(ctx, expr5_0, expr8_0); - let expr10_0 = constructor_alu_rrr(ctx, pattern0_0, pattern1_0, expr2_0, expr7_0); - let expr11_0 = constructor_alu_rrr(ctx, pattern0_0, pattern1_0, expr4_0, expr9_0); - let expr12_0 = C::value_regs(ctx, expr10_0, expr11_0); - return expr12_0; -} - -// Generated as internal constructor for term ld1r. -pub fn constructor_ld1r( - ctx: &mut C, - arg0: Reg, - arg1: &VectorSize, - arg2: MemFlags, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/aarch64/inst.isle line 2916. - let expr0_0: Type = I8X16; - let expr1_0 = C::temp_writable_reg(ctx, expr0_0); - let expr2_0 = MInst::VecLoadReplicate { - rd: expr1_0, - rn: pattern0_0, - size: pattern1_0.clone(), - flags: pattern2_0, - }; - let expr3_0 = C::emit(ctx, &expr2_0); - let expr4_0 = C::writable_reg_to_reg(ctx, expr1_0); - return expr4_0; -} - -// Generated as internal constructor for term load_ext_name. -pub fn constructor_load_ext_name(ctx: &mut C, arg0: BoxExternalName, arg1: i64) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/aarch64/inst.isle line 2923. - let expr0_0: Type = I64; - let expr1_0 = C::temp_writable_reg(ctx, expr0_0); - let expr2_0 = MInst::LoadExtName { - rd: expr1_0, - name: pattern0_0, - offset: pattern1_0, - }; - let expr3_0 = C::emit(ctx, &expr2_0); - let expr4_0 = C::writable_reg_to_reg(ctx, expr1_0); - return expr4_0; -} - -// Generated as internal constructor for term load_addr. -pub fn constructor_load_addr(ctx: &mut C, arg0: &AMode) -> Reg { - let pattern0_0 = arg0; - match pattern0_0 { - &AMode::SPOffset { - off: pattern1_0, - ty: pattern1_1, - } => { - if pattern1_0 == 0i128 as i64 { - // Rule at src/isa/aarch64/inst.isle line 2941. - let expr0_0 = C::stack_reg(ctx); - return expr0_0; - } - } - &AMode::FPOffset { - off: pattern1_0, - ty: pattern1_1, - } => { - if pattern1_0 == 0i128 as i64 { - // Rule at src/isa/aarch64/inst.isle line 2940. - let expr0_0 = C::fp_reg(ctx); - return expr0_0; - } - } - &AMode::RegOffset { - rn: pattern1_0, - off: pattern1_1, - ty: pattern1_2, - } => { - if pattern1_1 == 0i128 as i64 { - // Rule at src/isa/aarch64/inst.isle line 2939. - return pattern1_0; - } - } - &AMode::Unscaled { - rn: pattern1_0, - simm9: ref pattern1_1, - } => { - let mut closure2 = || { - let expr0_0 = C::is_zero_simm9(ctx, pattern1_1)?; - return Some(expr0_0); - }; - if let Some(pattern2_0) = closure2() { - // Rule at src/isa/aarch64/inst.isle line 2935. - return pattern1_0; - } - } - &AMode::UnsignedOffset { - rn: pattern1_0, - uimm12: ref pattern1_1, - } => { - let mut closure2 = || { - let expr0_0 = C::is_zero_uimm12(ctx, pattern1_1)?; - return Some(expr0_0); - }; - if let Some(pattern2_0) = closure2() { - // Rule at src/isa/aarch64/inst.isle line 2931. - return pattern1_0; - } - } - _ => {} - } - let pattern0_0 = arg0; - // Rule at src/isa/aarch64/inst.isle line 2943. - let expr0_0: Type = I64; - let expr1_0 = C::temp_writable_reg(ctx, expr0_0); - let expr2_0 = MInst::LoadAddr { - rd: expr1_0, - mem: pattern0_0.clone(), - }; - let expr3_0 = C::emit(ctx, &expr2_0); - let expr4_0 = C::writable_reg_to_reg(ctx, expr1_0); - return expr4_0; -} - -// Generated as internal constructor for term sink_load_into_amode. -pub fn constructor_sink_load_into_amode(ctx: &mut C, arg0: Type, arg1: Inst) -> AMode { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = C::inst_data(ctx, pattern1_0); - if let &InstructionData::Load { - opcode: ref pattern3_0, - arg: pattern3_1, - flags: pattern3_2, - offset: pattern3_3, - } = &pattern2_0 - { - if let &Opcode::Load = pattern3_0 { - // Rule at src/isa/aarch64/inst.isle line 2954. - let expr0_0 = C::sink_inst(ctx, pattern1_0); - let expr1_0 = C::offset32_to_u32(ctx, pattern3_3); - let expr2_0 = C::amode(ctx, pattern0_0, pattern3_1, expr1_0); - return expr2_0; - } - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "sink_load_into_amode", "src/isa/aarch64/inst.isle line 2953" - ); -} - -// Generated as internal constructor for term float_cmp_zero. -pub fn constructor_float_cmp_zero( - ctx: &mut C, - arg0: &FloatCC, - arg1: Reg, - arg2: &VectorSize, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/aarch64/inst.isle line 3010. - let expr0_0 = C::float_cc_cmp_zero_to_vec_misc_op(ctx, pattern0_0); - let expr1_0 = constructor_vec_misc(ctx, &expr0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term float_cmp_zero_swap. -pub fn constructor_float_cmp_zero_swap( - ctx: &mut C, - arg0: &FloatCC, - arg1: Reg, - arg2: &VectorSize, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/aarch64/inst.isle line 3015. - let expr0_0 = C::float_cc_cmp_zero_to_vec_misc_op_swap(ctx, pattern0_0); - let expr1_0 = constructor_vec_misc(ctx, &expr0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term fcmeq0. -pub fn constructor_fcmeq0(ctx: &mut C, arg0: Reg, arg1: &VectorSize) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/aarch64/inst.isle line 3020. - let expr0_0 = VecMisc2::Fcmeq0; - let expr1_0 = constructor_vec_misc(ctx, &expr0_0, pattern0_0, pattern1_0); - return expr1_0; -} - -// Generated as internal constructor for term int_cmp_zero. -pub fn constructor_int_cmp_zero( - ctx: &mut C, - arg0: &IntCC, - arg1: Reg, - arg2: &VectorSize, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/aarch64/inst.isle line 3040. - let expr0_0 = C::int_cc_cmp_zero_to_vec_misc_op(ctx, pattern0_0); - let expr1_0 = constructor_vec_misc(ctx, &expr0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term int_cmp_zero_swap. -pub fn constructor_int_cmp_zero_swap( - ctx: &mut C, - arg0: &IntCC, - arg1: Reg, - arg2: &VectorSize, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/aarch64/inst.isle line 3045. - let expr0_0 = C::int_cc_cmp_zero_to_vec_misc_op_swap(ctx, pattern0_0); - let expr1_0 = constructor_vec_misc(ctx, &expr0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term cmeq0. -pub fn constructor_cmeq0(ctx: &mut C, arg0: Reg, arg1: &VectorSize) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/aarch64/inst.isle line 3050. - let expr0_0 = VecMisc2::Cmeq0; - let expr1_0 = constructor_vec_misc(ctx, &expr0_0, pattern0_0, pattern1_0); - return expr1_0; -} - -// Generated as internal constructor for term lse_atomic_rmw. -pub fn constructor_lse_atomic_rmw( - ctx: &mut C, - arg0: &AtomicRMWOp, - arg1: Value, - arg2: Reg, - arg3: Type, - arg4: MemFlags, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - let pattern4_0 = arg4; - // Rule at src/isa/aarch64/inst.isle line 3055. - let expr0_0 = C::put_in_reg(ctx, pattern1_0); - let expr1_0 = C::temp_writable_reg(ctx, pattern3_0); - let expr2_0 = MInst::AtomicRMW { - op: pattern0_0.clone(), - rs: pattern2_0, - rt: expr1_0, - rn: expr0_0, - ty: pattern3_0, - flags: pattern4_0, - }; - let expr3_0 = C::emit(ctx, &expr2_0); - let expr4_0 = C::writable_reg_to_reg(ctx, expr1_0); - return expr4_0; -} - -// Generated as internal constructor for term lse_atomic_cas. -pub fn constructor_lse_atomic_cas( - ctx: &mut C, - arg0: Reg, - arg1: Reg, - arg2: Reg, - arg3: Type, - arg4: MemFlags, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - let pattern4_0 = arg4; - // Rule at src/isa/aarch64/inst.isle line 3065. - let expr0_0 = C::temp_writable_reg(ctx, pattern3_0); - let expr1_0 = MInst::AtomicCAS { - rd: expr0_0, - rs: pattern1_0, - rt: pattern2_0, - rn: pattern0_0, - ty: pattern3_0, - flags: pattern4_0, - }; - let expr2_0 = C::emit(ctx, &expr1_0); - let expr3_0 = C::writable_reg_to_reg(ctx, expr0_0); - return expr3_0; -} - -// Generated as internal constructor for term atomic_rmw_loop. -pub fn constructor_atomic_rmw_loop( - ctx: &mut C, - arg0: &AtomicRMWLoopOp, - arg1: Reg, - arg2: Reg, - arg3: Type, - arg4: MemFlags, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - let pattern4_0 = arg4; - // Rule at src/isa/aarch64/inst.isle line 3079. - let expr0_0: Type = I64; - let expr1_0 = C::temp_writable_reg(ctx, expr0_0); - let expr2_0: Type = I64; - let expr3_0 = C::temp_writable_reg(ctx, expr2_0); - let expr4_0: Type = I64; - let expr5_0 = C::temp_writable_reg(ctx, expr4_0); - let expr6_0 = MInst::AtomicRMWLoop { - ty: pattern3_0, - op: pattern0_0.clone(), - flags: pattern4_0, - addr: pattern1_0, - operand: pattern2_0, - oldval: expr1_0, - scratch1: expr3_0, - scratch2: expr5_0, - }; - let expr7_0 = C::emit(ctx, &expr6_0); - let expr8_0 = C::writable_reg_to_reg(ctx, expr1_0); - return expr8_0; -} - -// Generated as internal constructor for term atomic_cas_loop. -pub fn constructor_atomic_cas_loop( - ctx: &mut C, - arg0: Reg, - arg1: Reg, - arg2: Reg, - arg3: Type, - arg4: MemFlags, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - let pattern4_0 = arg4; - // Rule at src/isa/aarch64/inst.isle line 3093. - let expr0_0: Type = I64; - let expr1_0 = C::temp_writable_reg(ctx, expr0_0); - let expr2_0: Type = I64; - let expr3_0 = C::temp_writable_reg(ctx, expr2_0); - let expr4_0 = MInst::AtomicCASLoop { - ty: pattern3_0, - flags: pattern4_0, - addr: pattern0_0, - expected: pattern1_0, - replacement: pattern2_0, - oldval: expr1_0, - scratch: expr3_0, - }; - let expr5_0 = C::emit(ctx, &expr4_0); - let expr6_0 = C::writable_reg_to_reg(ctx, expr1_0); - return expr6_0; -} - -// Generated as internal constructor for term mov_from_preg. -pub fn constructor_mov_from_preg(ctx: &mut C, arg0: PReg) -> Reg { - let pattern0_0 = arg0; - // Rule at src/isa/aarch64/inst.isle line 3101. - let expr0_0: Type = I64; - let expr1_0 = C::temp_writable_reg(ctx, expr0_0); - let expr2_0 = MInst::MovFromPReg { - rd: expr1_0, - rm: pattern0_0, - }; - let expr3_0 = C::emit(ctx, &expr2_0); - let expr4_0 = C::writable_reg_to_reg(ctx, expr1_0); - return expr4_0; -} - -// Generated as internal constructor for term mov_to_preg. -pub fn constructor_mov_to_preg( - ctx: &mut C, - arg0: PReg, - arg1: Reg, -) -> SideEffectNoResult { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/aarch64/inst.isle line 3107. - let expr0_0 = MInst::MovToPReg { - rd: pattern0_0, - rm: pattern1_0, - }; - let expr1_0 = SideEffectNoResult::Inst { inst: expr0_0 }; - return expr1_0; -} - -// Generated as internal constructor for term aarch64_sp. -pub fn constructor_aarch64_sp(ctx: &mut C) -> Reg { - // Rule at src/isa/aarch64/inst.isle line 3123. - let expr0_0 = C::preg_sp(ctx); - let expr1_0 = constructor_mov_from_preg(ctx, expr0_0); - return expr1_0; -} - -// Generated as internal constructor for term aarch64_fp. -pub fn constructor_aarch64_fp(ctx: &mut C) -> Reg { - // Rule at src/isa/aarch64/inst.isle line 3127. - let expr0_0 = C::preg_fp(ctx); - let expr1_0 = constructor_mov_from_preg(ctx, expr0_0); - return expr1_0; -} - -// Generated as internal constructor for term aarch64_link. -pub fn constructor_aarch64_link(ctx: &mut C) -> Reg { - let mut closure0 = || { - let expr0_0 = C::preserve_frame_pointers(ctx)?; - return Some(expr0_0); - }; - if let Some(pattern0_0) = closure0() { - let mut closure1 = || { - let expr0_0 = C::sign_return_address_disabled(ctx)?; - return Some(expr0_0); - }; - if let Some(pattern1_0) = closure1() { - // Rule at src/isa/aarch64/inst.isle line 3131. - let expr0_0: Type = I64; - let expr1_0 = C::temp_writable_reg(ctx, expr0_0); - let expr2_0: i64 = 8i128 as i64; - let expr3_0: Type = I64; - let expr4_0 = AMode::FPOffset { - off: expr2_0, - ty: expr3_0, - }; - let expr5_0 = C::mem_flags_trusted(ctx); - let expr6_0 = MInst::ULoad64 { - rd: expr1_0, - mem: expr4_0, - flags: expr5_0, - }; - let expr7_0 = C::emit(ctx, &expr6_0); - let expr8_0 = C::writable_reg_to_reg(ctx, expr1_0); - return expr8_0; - } - } - let mut closure0 = || { - let expr0_0 = C::preserve_frame_pointers(ctx)?; - return Some(expr0_0); - }; - if let Some(pattern0_0) = closure0() { - // Rule at src/isa/aarch64/inst.isle line 3147. - let expr0_0: i64 = 8i128 as i64; - let expr1_0: Type = I64; - let expr2_0 = AMode::FPOffset { - off: expr0_0, - ty: expr1_0, - }; - let expr3_0 = C::writable_link_reg(ctx); - let expr4_0 = C::mem_flags_trusted(ctx); - let expr5_0 = MInst::ULoad64 { - rd: expr3_0, - mem: expr2_0, - flags: expr4_0, - }; - let expr6_0 = C::emit(ctx, &expr5_0); - let expr7_0 = MInst::Xpaclri; - let expr8_0 = C::emit(ctx, &expr7_0); - let expr9_0 = C::preg_link(ctx); - let expr10_0 = constructor_mov_from_preg(ctx, expr9_0); - return expr10_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "aarch64_link", "src/isa/aarch64/inst.isle line 3130" - ); -} - -// Generated as internal constructor for term max_shift. -pub fn constructor_max_shift(ctx: &mut C, arg0: Type) -> u8 { - let pattern0_0 = arg0; - if pattern0_0 == F32 { - // Rule at src/isa/aarch64/inst.isle line 3163. - let expr0_0: u8 = 31i128 as u8; - return expr0_0; - } - if pattern0_0 == F64 { - // Rule at src/isa/aarch64/inst.isle line 3162. - let expr0_0: u8 = 63i128 as u8; - return expr0_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "max_shift", "src/isa/aarch64/inst.isle line 3161" - ); -} - -// Generated as internal constructor for term fcopy_sign. -pub fn constructor_fcopy_sign(ctx: &mut C, arg0: Reg, arg1: Reg, arg2: Type) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - if let Some(pattern3_0) = C::ty_scalar_float(ctx, pattern2_0) { - // Rule at src/isa/aarch64/inst.isle line 3168. - let expr0_0: Type = F64; - let expr1_0 = C::temp_writable_reg(ctx, expr0_0); - let expr2_0 = C::ty_bits(ctx, pattern3_0); - let expr3_0 = constructor_max_shift(ctx, pattern3_0); - let expr4_0 = C::fpu_op_ri_ushr(ctx, expr2_0, expr3_0); - let expr5_0 = constructor_fpu_rri(ctx, &expr4_0, pattern1_0); - let expr6_0 = C::ty_bits(ctx, pattern3_0); - let expr7_0 = constructor_max_shift(ctx, pattern3_0); - let expr8_0 = C::fpu_op_ri_sli(ctx, expr6_0, expr7_0); - let expr9_0 = MInst::FpuRRIMod { - fpu_op: expr8_0, - rd: expr1_0, - ri: pattern0_0, - rn: expr5_0, - }; - let expr10_0 = C::emit(ctx, &expr9_0); - let expr11_0 = C::writable_reg_to_reg(ctx, expr1_0); - return expr11_0; - } - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - if let Some((pattern3_0, pattern3_1)) = C::multi_lane(ctx, pattern2_0) { - // Rule at src/isa/aarch64/inst.isle line 3173. - let expr0_0: Type = I8X16; - let expr1_0 = C::temp_writable_reg(ctx, expr0_0); - let expr2_0 = VecShiftImmOp::Ushr; - let expr3_0 = C::lane_type(ctx, pattern2_0); - let expr4_0 = constructor_max_shift(ctx, expr3_0); - let expr5_0 = constructor_vector_size(ctx, pattern2_0); - let expr6_0 = constructor_vec_shift_imm(ctx, &expr2_0, expr4_0, pattern1_0, &expr5_0); - let expr7_0 = VecShiftImmModOp::Sli; - let expr8_0 = constructor_vector_size(ctx, pattern2_0); - let expr9_0 = C::lane_type(ctx, pattern2_0); - let expr10_0 = constructor_max_shift(ctx, expr9_0); - let expr11_0 = MInst::VecShiftImmMod { - op: expr7_0, - rd: expr1_0, - ri: pattern0_0, - rn: expr6_0, - size: expr8_0, - imm: expr10_0, - }; - let expr12_0 = C::emit(ctx, &expr11_0); - let expr13_0 = C::writable_reg_to_reg(ctx, expr1_0); - return expr13_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "fcopy_sign", "src/isa/aarch64/inst.isle line 3167" - ); -} - -// Generated as internal constructor for term fpu_to_int_nan_check. -pub fn constructor_fpu_to_int_nan_check( - ctx: &mut C, - arg0: &ScalarSize, - arg1: Reg, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/aarch64/inst.isle line 3182. - let expr0_0 = constructor_fpu_cmp(ctx, pattern0_0, pattern1_0, pattern1_0); - let expr1_0 = Cond::Vs; - let expr2_0 = C::cond_br_cond(ctx, &expr1_0); - let expr3_0 = C::trap_code_bad_conversion_to_integer(ctx); - let expr4_0 = MInst::TrapIf { - kind: expr2_0, - trap_code: expr3_0, - }; - let expr5_0 = ConsumesFlags::ConsumesFlagsReturnsReg { - inst: expr4_0, - result: pattern1_0, - }; - let expr6_0 = constructor_with_flags(ctx, &expr0_0, &expr5_0); - let expr7_0: usize = 0i128 as usize; - let expr8_0 = C::value_regs_get(ctx, expr6_0, expr7_0); - return expr8_0; -} - -// Generated as internal constructor for term fpu_to_int_underflow_check. -pub fn constructor_fpu_to_int_underflow_check( - ctx: &mut C, - arg0: bool, - arg1: Type, - arg2: Type, - arg3: Reg, - arg4: Reg, -) -> Reg { - let pattern0_0 = arg0; - if pattern0_0 == true { - let pattern2_0 = arg1; - if pattern2_0 == F32 { - let pattern4_0 = arg2; - if let Some(pattern5_0) = C::fits_in_16(ctx, pattern4_0) { - let pattern6_0 = arg3; - let pattern7_0 = arg4; - // Rule at src/isa/aarch64/inst.isle line 3195. - let expr0_0 = ScalarSize::Size32; - let expr1_0 = constructor_fpu_cmp(ctx, &expr0_0, pattern6_0, pattern7_0); - let expr2_0 = Cond::Le; - let expr3_0 = C::cond_br_cond(ctx, &expr2_0); - let expr4_0 = C::trap_code_integer_overflow(ctx); - let expr5_0 = MInst::TrapIf { - kind: expr3_0, - trap_code: expr4_0, - }; - let expr6_0 = ConsumesFlags::ConsumesFlagsReturnsReg { - inst: expr5_0, - result: pattern6_0, - }; - let expr7_0 = constructor_with_flags(ctx, &expr1_0, &expr6_0); - let expr8_0: usize = 0i128 as usize; - let expr9_0 = C::value_regs_get(ctx, expr7_0, expr8_0); - return expr9_0; - } - } - if pattern2_0 == F64 { - let pattern4_0 = arg2; - if let Some(pattern5_0) = C::fits_in_32(ctx, pattern4_0) { - let pattern6_0 = arg3; - let pattern7_0 = arg4; - // Rule at src/isa/aarch64/inst.isle line 3203. - let expr0_0 = ScalarSize::Size64; - let expr1_0 = constructor_fpu_cmp(ctx, &expr0_0, pattern6_0, pattern7_0); - let expr2_0 = Cond::Le; - let expr3_0 = C::cond_br_cond(ctx, &expr2_0); - let expr4_0 = C::trap_code_integer_overflow(ctx); - let expr5_0 = MInst::TrapIf { - kind: expr3_0, - trap_code: expr4_0, - }; - let expr6_0 = ConsumesFlags::ConsumesFlagsReturnsReg { - inst: expr5_0, - result: pattern6_0, - }; - let expr7_0 = constructor_with_flags(ctx, &expr1_0, &expr6_0); - let expr8_0: usize = 0i128 as usize; - let expr9_0 = C::value_regs_get(ctx, expr7_0, expr8_0); - return expr9_0; - } - } - } - if pattern0_0 == false { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - let pattern4_0 = arg3; - let pattern5_0 = arg4; - // Rule at src/isa/aarch64/inst.isle line 3219. - let expr0_0 = constructor_scalar_size(ctx, pattern2_0); - let expr1_0 = constructor_fpu_cmp(ctx, &expr0_0, pattern4_0, pattern5_0); - let expr2_0 = Cond::Le; - let expr3_0 = C::cond_br_cond(ctx, &expr2_0); - let expr4_0 = C::trap_code_integer_overflow(ctx); - let expr5_0 = MInst::TrapIf { - kind: expr3_0, - trap_code: expr4_0, - }; - let expr6_0 = ConsumesFlags::ConsumesFlagsReturnsReg { - inst: expr5_0, - result: pattern4_0, - }; - let expr7_0 = constructor_with_flags(ctx, &expr1_0, &expr6_0); - let expr8_0: usize = 0i128 as usize; - let expr9_0 = C::value_regs_get(ctx, expr7_0, expr8_0); - return expr9_0; - } - let pattern0_0 = arg0; - if pattern0_0 == true { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - let pattern4_0 = arg3; - let pattern5_0 = arg4; - // Rule at src/isa/aarch64/inst.isle line 3211. - let expr0_0 = constructor_scalar_size(ctx, pattern2_0); - let expr1_0 = constructor_fpu_cmp(ctx, &expr0_0, pattern4_0, pattern5_0); - let expr2_0 = Cond::Lt; - let expr3_0 = C::cond_br_cond(ctx, &expr2_0); - let expr4_0 = C::trap_code_integer_overflow(ctx); - let expr5_0 = MInst::TrapIf { - kind: expr3_0, - trap_code: expr4_0, - }; - let expr6_0 = ConsumesFlags::ConsumesFlagsReturnsReg { - inst: expr5_0, - result: pattern4_0, - }; - let expr7_0 = constructor_with_flags(ctx, &expr1_0, &expr6_0); - let expr8_0: usize = 0i128 as usize; - let expr9_0 = C::value_regs_get(ctx, expr7_0, expr8_0); - return expr9_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "fpu_to_int_underflow_check", "src/isa/aarch64/inst.isle line 3194" - ); -} - -// Generated as internal constructor for term fpu_to_int_overflow_check. -pub fn constructor_fpu_to_int_overflow_check( - ctx: &mut C, - arg0: &ScalarSize, - arg1: Reg, - arg2: Reg, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/aarch64/inst.isle line 3229. - let expr0_0 = constructor_fpu_cmp(ctx, pattern0_0, pattern1_0, pattern2_0); - let expr1_0 = Cond::Ge; - let expr2_0 = C::cond_br_cond(ctx, &expr1_0); - let expr3_0 = C::trap_code_integer_overflow(ctx); - let expr4_0 = MInst::TrapIf { - kind: expr2_0, - trap_code: expr3_0, - }; - let expr5_0 = ConsumesFlags::ConsumesFlagsReturnsReg { - inst: expr4_0, - result: pattern1_0, - }; - let expr6_0 = constructor_with_flags(ctx, &expr0_0, &expr5_0); - let expr7_0: usize = 0i128 as usize; - let expr8_0 = C::value_regs_get(ctx, expr6_0, expr7_0); - return expr8_0; -} - -// Generated as internal constructor for term fpu_to_int_cvt. -pub fn constructor_fpu_to_int_cvt( - ctx: &mut C, - arg0: &FpuToIntOp, - arg1: Reg, - arg2: bool, - arg3: Type, - arg4: Type, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - let pattern4_0 = arg4; - // Rule at src/isa/aarch64/inst.isle line 3245. - let expr0_0 = constructor_scalar_size(ctx, pattern3_0); - let expr1_0 = C::ty_bits(ctx, pattern3_0); - let expr2_0 = C::ty_bits(ctx, pattern4_0); - let expr3_0 = constructor_fpu_to_int_nan_check(ctx, &expr0_0, pattern1_0); - let expr4_0 = C::min_fp_value(ctx, pattern2_0, expr1_0, expr2_0); - let expr5_0 = constructor_fpu_to_int_underflow_check( - ctx, pattern2_0, pattern3_0, pattern4_0, expr3_0, expr4_0, - ); - let expr6_0 = C::max_fp_value(ctx, pattern2_0, expr1_0, expr2_0); - let expr7_0 = constructor_fpu_to_int_overflow_check(ctx, &expr0_0, expr5_0, expr6_0); - let expr8_0 = constructor_fpu_to_int(ctx, pattern0_0, expr7_0); - return expr8_0; -} - -// Generated as internal constructor for term fpu_to_int_cvt_sat. -pub fn constructor_fpu_to_int_cvt_sat( - ctx: &mut C, - arg0: &FpuToIntOp, - arg1: Reg, - arg2: bool, - arg3: Type, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - if pattern3_0 == I32 { - // Rule at src/isa/aarch64/inst.isle line 3264. - let expr0_0 = constructor_fpu_to_int(ctx, pattern0_0, pattern1_0); - return expr0_0; - } - if pattern3_0 == I64 { - // Rule at src/isa/aarch64/inst.isle line 3262. - let expr0_0 = constructor_fpu_to_int(ctx, pattern0_0, pattern1_0); - return expr0_0; - } - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - if pattern2_0 == true { - let pattern4_0 = arg3; - if let Some(pattern5_0) = C::fits_in_16(ctx, pattern4_0) { - // Rule at src/isa/aarch64/inst.isle line 3272. - let expr0_0 = constructor_fpu_to_int(ctx, pattern0_0, pattern1_0); - let expr1_0 = constructor_signed_max(ctx, pattern5_0); - let expr2_0 = constructor_signed_min(ctx, pattern5_0); - let expr3_0 = constructor_operand_size(ctx, pattern5_0); - let expr4_0 = constructor_cmp(ctx, &expr3_0, expr0_0, expr1_0); - let expr5_0 = Cond::Gt; - let expr6_0 = constructor_csel(ctx, &expr5_0, expr1_0, expr0_0); - let expr7_0 = constructor_with_flags_reg(ctx, &expr4_0, &expr6_0); - let expr8_0 = constructor_operand_size(ctx, pattern5_0); - let expr9_0 = constructor_cmp(ctx, &expr8_0, expr7_0, expr2_0); - let expr10_0 = Cond::Lt; - let expr11_0 = constructor_csel(ctx, &expr10_0, expr2_0, expr7_0); - let expr12_0 = constructor_with_flags_reg(ctx, &expr9_0, &expr11_0); - return expr12_0; - } - } - if pattern2_0 == false { - let pattern4_0 = arg3; - if let Some(pattern5_0) = C::fits_in_16(ctx, pattern4_0) { - // Rule at src/isa/aarch64/inst.isle line 3266. - let expr0_0 = constructor_fpu_to_int(ctx, pattern0_0, pattern1_0); - let expr1_0 = ImmExtend::Zero; - let expr2_0 = C::ty_mask(ctx, pattern5_0); - let expr3_0 = constructor_imm(ctx, pattern5_0, &expr1_0, expr2_0); - let expr4_0 = OperandSize::Size32; - let expr5_0 = constructor_cmp(ctx, &expr4_0, expr0_0, expr3_0); - let expr6_0 = Cond::Hi; - let expr7_0 = constructor_csel(ctx, &expr6_0, expr3_0, expr0_0); - let expr8_0 = constructor_with_flags_reg(ctx, &expr5_0, &expr7_0); - return expr8_0; - } - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "fpu_to_int_cvt_sat", "src/isa/aarch64/inst.isle line 3261" - ); -} - -// Generated as internal constructor for term signed_min. -pub fn constructor_signed_min(ctx: &mut C, arg0: Type) -> Reg { - let pattern0_0 = arg0; - if pattern0_0 == I8 { - // Rule at src/isa/aarch64/inst.isle line 3285. - let expr0_0: Type = I8; - let expr1_0 = ImmExtend::Sign; - let expr2_0: u64 = 128i128 as u64; - let expr3_0 = constructor_imm(ctx, expr0_0, &expr1_0, expr2_0); - return expr3_0; - } - if pattern0_0 == I16 { - // Rule at src/isa/aarch64/inst.isle line 3286. - let expr0_0: Type = I16; - let expr1_0 = ImmExtend::Sign; - let expr2_0: u64 = 32768i128 as u64; - let expr3_0 = constructor_imm(ctx, expr0_0, &expr1_0, expr2_0); - return expr3_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "signed_min", "src/isa/aarch64/inst.isle line 3284" - ); -} - -// Generated as internal constructor for term signed_max. -pub fn constructor_signed_max(ctx: &mut C, arg0: Type) -> Reg { - let pattern0_0 = arg0; - if pattern0_0 == I8 { - // Rule at src/isa/aarch64/inst.isle line 3289. - let expr0_0: Type = I8; - let expr1_0 = ImmExtend::Sign; - let expr2_0: u64 = 127i128 as u64; - let expr3_0 = constructor_imm(ctx, expr0_0, &expr1_0, expr2_0); - return expr3_0; - } - if pattern0_0 == I16 { - // Rule at src/isa/aarch64/inst.isle line 3290. - let expr0_0: Type = I16; - let expr1_0 = ImmExtend::Sign; - let expr2_0: u64 = 32767i128 as u64; - let expr3_0 = constructor_imm(ctx, expr0_0, &expr1_0, expr2_0); - return expr3_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "signed_max", "src/isa/aarch64/inst.isle line 3288" - ); -} - -// Generated as internal constructor for term fpu_to_int. -pub fn constructor_fpu_to_int(ctx: &mut C, arg0: &FpuToIntOp, arg1: Reg) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/aarch64/inst.isle line 3293. - let expr0_0: Type = I64; - let expr1_0 = C::temp_writable_reg(ctx, expr0_0); - let expr2_0 = MInst::FpuToInt { - op: pattern0_0.clone(), - rd: expr1_0, - rn: pattern1_0, - }; - let expr3_0 = C::emit(ctx, &expr2_0); - let expr4_0 = C::writable_reg_to_reg(ctx, expr1_0); - return expr4_0; -} - -// Generated as internal constructor for term int_to_fpu. -pub fn constructor_int_to_fpu(ctx: &mut C, arg0: &IntToFpuOp, arg1: Reg) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/aarch64/inst.isle line 3301. - let expr0_0: Type = I8X16; - let expr1_0 = C::temp_writable_reg(ctx, expr0_0); - let expr2_0 = MInst::IntToFpu { - op: pattern0_0.clone(), - rd: expr1_0, - rn: pattern1_0, - }; - let expr3_0 = C::emit(ctx, &expr2_0); - let expr4_0 = C::writable_reg_to_reg(ctx, expr1_0); - return expr4_0; -} - -// Generated as internal constructor for term write_pinned_reg. -pub fn constructor_write_pinned_reg(ctx: &mut C, arg0: Reg) -> SideEffectNoResult { - let pattern0_0 = arg0; - // Rule at src/isa/aarch64/inst.isle line 3317. - let expr0_0 = C::preg_pinned(ctx); - let expr1_0 = constructor_mov_to_preg(ctx, expr0_0, pattern0_0); - return expr1_0; -} - -// Generated as internal constructor for term compute_stack_addr. -pub fn constructor_compute_stack_addr( - ctx: &mut C, - arg0: StackSlot, - arg1: Offset32, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/aarch64/inst.isle line 3323. - let expr0_0: Type = I64; - let expr1_0 = C::temp_writable_reg(ctx, expr0_0); - let expr2_0 = C::abi_stackslot_addr(ctx, expr1_0, pattern0_0, pattern1_0); - let expr3_0 = C::emit(ctx, &expr2_0); - let expr4_0 = C::writable_reg_to_reg(ctx, expr1_0); - return expr4_0; -} - -// Generated as internal constructor for term vec_cmp_vc. -pub fn constructor_vec_cmp_vc( - ctx: &mut C, - arg0: Reg, - arg1: Reg, - arg2: &VectorSize, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/aarch64/inst.isle line 3331. - let expr0_0 = VecALUOp::Fcmeq; - let expr1_0 = constructor_vec_rrr(ctx, &expr0_0, pattern0_0, pattern0_0, pattern2_0); - let expr2_0 = VecALUOp::Fcmeq; - let expr3_0 = constructor_vec_rrr(ctx, &expr2_0, pattern1_0, pattern1_0, pattern2_0); - let expr4_0 = VecALUOp::And; - let expr5_0 = constructor_vec_rrr(ctx, &expr4_0, expr1_0, expr3_0, pattern2_0); - return expr5_0; -} - -// Generated as internal constructor for term vec_cmp. -pub fn constructor_vec_cmp( - ctx: &mut C, - arg0: Reg, - arg1: Reg, - arg2: Type, - arg3: &Cond, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - match pattern3_0 { - &Cond::Eq => { - let mut closure5 = || { - let expr0_0 = C::ty_vector_not_float(ctx, pattern2_0)?; - return Some(expr0_0); - }; - if let Some(pattern5_0) = closure5() { - // Rule at src/isa/aarch64/inst.isle line 3375. - let expr0_0 = VecALUOp::Cmeq; - let expr1_0 = constructor_vector_size(ctx, pattern2_0); - let expr2_0 = constructor_vec_rrr(ctx, &expr0_0, pattern0_0, pattern1_0, &expr1_0); - return expr2_0; - } - } - &Cond::Ne => { - let mut closure5 = || { - let expr0_0 = C::ty_vector_not_float(ctx, pattern2_0)?; - return Some(expr0_0); - }; - if let Some(pattern5_0) = closure5() { - // Rule at src/isa/aarch64/inst.isle line 3378. - let expr0_0 = VecALUOp::Cmeq; - let expr1_0 = constructor_vector_size(ctx, pattern2_0); - let expr2_0 = constructor_vec_rrr(ctx, &expr0_0, pattern0_0, pattern1_0, &expr1_0); - let expr3_0 = VecMisc2::Not; - let expr4_0 = constructor_vector_size(ctx, pattern2_0); - let expr5_0 = constructor_vec_misc(ctx, &expr3_0, expr2_0, &expr4_0); - return expr5_0; - } - } - &Cond::Ls => { - let mut closure5 = || { - let expr0_0 = C::ty_vector_not_float(ctx, pattern2_0)?; - return Some(expr0_0); - }; - if let Some(pattern5_0) = closure5() { - // Rule at src/isa/aarch64/inst.isle line 3401. - let expr0_0 = VecALUOp::Cmhs; - let expr1_0 = constructor_vector_size(ctx, pattern2_0); - let expr2_0 = constructor_vec_rrr(ctx, &expr0_0, pattern1_0, pattern0_0, &expr1_0); - return expr2_0; - } - } - &Cond::Ge => { - let mut closure5 = || { - let expr0_0 = C::ty_vector_not_float(ctx, pattern2_0)?; - return Some(expr0_0); - }; - if let Some(pattern5_0) = closure5() { - // Rule at src/isa/aarch64/inst.isle line 3382. - let expr0_0 = VecALUOp::Cmge; - let expr1_0 = constructor_vector_size(ctx, pattern2_0); - let expr2_0 = constructor_vec_rrr(ctx, &expr0_0, pattern0_0, pattern1_0, &expr1_0); - return expr2_0; - } - } - &Cond::Gt => { - let mut closure5 = || { - let expr0_0 = C::ty_vector_not_float(ctx, pattern2_0)?; - return Some(expr0_0); - }; - if let Some(pattern5_0) = closure5() { - // Rule at src/isa/aarch64/inst.isle line 3385. - let expr0_0 = VecALUOp::Cmgt; - let expr1_0 = constructor_vector_size(ctx, pattern2_0); - let expr2_0 = constructor_vec_rrr(ctx, &expr0_0, pattern0_0, pattern1_0, &expr1_0); - return expr2_0; - } - } - _ => {} - } - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - match pattern3_0 { - &Cond::Eq => { - let mut closure5 = || { - let expr0_0 = C::ty_vector_float(ctx, pattern2_0)?; - return Some(expr0_0); - }; - if let Some(pattern5_0) = closure5() { - // Rule at src/isa/aarch64/inst.isle line 3353. - let expr0_0 = VecALUOp::Fcmeq; - let expr1_0 = constructor_vector_size(ctx, pattern2_0); - let expr2_0 = constructor_vec_rrr(ctx, &expr0_0, pattern0_0, pattern1_0, &expr1_0); - return expr2_0; - } - } - &Cond::Ne => { - let mut closure5 = || { - let expr0_0 = C::ty_vector_float(ctx, pattern2_0)?; - return Some(expr0_0); - }; - if let Some(pattern5_0) = closure5() { - // Rule at src/isa/aarch64/inst.isle line 3356. - let expr0_0 = VecALUOp::Fcmeq; - let expr1_0 = constructor_vector_size(ctx, pattern2_0); - let expr2_0 = constructor_vec_rrr(ctx, &expr0_0, pattern0_0, pattern1_0, &expr1_0); - let expr3_0 = VecMisc2::Not; - let expr4_0 = constructor_vector_size(ctx, pattern2_0); - let expr5_0 = constructor_vec_misc(ctx, &expr3_0, expr2_0, &expr4_0); - return expr5_0; - } - } - &Cond::Hs => { - let mut closure5 = || { - let expr0_0 = C::ty_vector_not_float(ctx, pattern2_0)?; - return Some(expr0_0); - }; - if let Some(pattern5_0) = closure5() { - // Rule at src/isa/aarch64/inst.isle line 3388. - let expr0_0 = VecALUOp::Cmhs; - let expr1_0 = constructor_vector_size(ctx, pattern2_0); - let expr2_0 = constructor_vec_rrr(ctx, &expr0_0, pattern0_0, pattern1_0, &expr1_0); - return expr2_0; - } - } - &Cond::Lo => { - let mut closure5 = || { - let expr0_0 = C::ty_vector_not_float(ctx, pattern2_0)?; - return Some(expr0_0); - }; - if let Some(pattern5_0) = closure5() { - // Rule at src/isa/aarch64/inst.isle line 3404. - let expr0_0 = VecALUOp::Cmhi; - let expr1_0 = constructor_vector_size(ctx, pattern2_0); - let expr2_0 = constructor_vec_rrr(ctx, &expr0_0, pattern1_0, pattern0_0, &expr1_0); - return expr2_0; - } - } - &Cond::Mi => { - let mut closure5 = || { - let expr0_0 = C::ty_vector_float(ctx, pattern2_0)?; - return Some(expr0_0); - }; - if let Some(pattern5_0) = closure5() { - // Rule at src/isa/aarch64/inst.isle line 3367. - let expr0_0 = VecALUOp::Fcmgt; - let expr1_0 = constructor_vector_size(ctx, pattern2_0); - let expr2_0 = constructor_vec_rrr(ctx, &expr0_0, pattern1_0, pattern0_0, &expr1_0); - return expr2_0; - } - } - &Cond::Vs => { - let mut closure5 = || { - let expr0_0 = C::ty_vector_float(ctx, pattern2_0)?; - return Some(expr0_0); - }; - if let Some(pattern5_0) = closure5() { - // Rule at src/isa/aarch64/inst.isle line 3343. - let expr0_0 = constructor_vector_size(ctx, pattern2_0); - let expr1_0 = constructor_vec_cmp_vc(ctx, pattern0_0, pattern1_0, &expr0_0); - let expr2_0 = VecMisc2::Not; - let expr3_0 = constructor_vector_size(ctx, pattern2_0); - let expr4_0 = constructor_vec_misc(ctx, &expr2_0, expr1_0, &expr3_0); - return expr4_0; - } - } - &Cond::Vc => { - let mut closure5 = || { - let expr0_0 = C::ty_vector_float(ctx, pattern2_0)?; - return Some(expr0_0); - }; - if let Some(pattern5_0) = closure5() { - // Rule at src/isa/aarch64/inst.isle line 3340. - let expr0_0 = constructor_vector_size(ctx, pattern2_0); - let expr1_0 = constructor_vec_cmp_vc(ctx, pattern0_0, pattern1_0, &expr0_0); - return expr1_0; - } - } - &Cond::Hi => { - let mut closure5 = || { - let expr0_0 = C::ty_vector_not_float(ctx, pattern2_0)?; - return Some(expr0_0); - }; - if let Some(pattern5_0) = closure5() { - // Rule at src/isa/aarch64/inst.isle line 3391. - let expr0_0 = VecALUOp::Cmhi; - let expr1_0 = constructor_vector_size(ctx, pattern2_0); - let expr2_0 = constructor_vec_rrr(ctx, &expr0_0, pattern0_0, pattern1_0, &expr1_0); - return expr2_0; - } - } - &Cond::Ls => { - let mut closure5 = || { - let expr0_0 = C::ty_vector_float(ctx, pattern2_0)?; - return Some(expr0_0); - }; - if let Some(pattern5_0) = closure5() { - // Rule at src/isa/aarch64/inst.isle line 3370. - let expr0_0 = VecALUOp::Fcmge; - let expr1_0 = constructor_vector_size(ctx, pattern2_0); - let expr2_0 = constructor_vec_rrr(ctx, &expr0_0, pattern1_0, pattern0_0, &expr1_0); - return expr2_0; - } - } - &Cond::Ge => { - let mut closure5 = || { - let expr0_0 = C::ty_vector_float(ctx, pattern2_0)?; - return Some(expr0_0); - }; - if let Some(pattern5_0) = closure5() { - // Rule at src/isa/aarch64/inst.isle line 3360. - let expr0_0 = VecALUOp::Fcmge; - let expr1_0 = constructor_vector_size(ctx, pattern2_0); - let expr2_0 = constructor_vec_rrr(ctx, &expr0_0, pattern0_0, pattern1_0, &expr1_0); - return expr2_0; - } - } - &Cond::Lt => { - let mut closure5 = || { - let expr0_0 = C::ty_vector_not_float(ctx, pattern2_0)?; - return Some(expr0_0); - }; - if let Some(pattern5_0) = closure5() { - // Rule at src/isa/aarch64/inst.isle line 3398. - let expr0_0 = VecALUOp::Cmgt; - let expr1_0 = constructor_vector_size(ctx, pattern2_0); - let expr2_0 = constructor_vec_rrr(ctx, &expr0_0, pattern1_0, pattern0_0, &expr1_0); - return expr2_0; - } - } - &Cond::Gt => { - let mut closure5 = || { - let expr0_0 = C::ty_vector_float(ctx, pattern2_0)?; - return Some(expr0_0); - }; - if let Some(pattern5_0) = closure5() { - // Rule at src/isa/aarch64/inst.isle line 3363. - let expr0_0 = VecALUOp::Fcmgt; - let expr1_0 = constructor_vector_size(ctx, pattern2_0); - let expr2_0 = constructor_vec_rrr(ctx, &expr0_0, pattern0_0, pattern1_0, &expr1_0); - return expr2_0; - } - } - &Cond::Le => { - let mut closure5 = || { - let expr0_0 = C::ty_vector_not_float(ctx, pattern2_0)?; - return Some(expr0_0); - }; - if let Some(pattern5_0) = closure5() { - // Rule at src/isa/aarch64/inst.isle line 3395. - let expr0_0 = VecALUOp::Cmge; - let expr1_0 = constructor_vector_size(ctx, pattern2_0); - let expr2_0 = constructor_vec_rrr(ctx, &expr0_0, pattern1_0, pattern0_0, &expr1_0); - return expr2_0; - } - } - _ => {} - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "vec_cmp", "src/isa/aarch64/inst.isle line 3337" - ); -} - -// Generated as internal constructor for term vanytrue. -pub fn constructor_vanytrue(ctx: &mut C, arg0: Reg, arg1: Type) -> ProducesFlags { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - if let Some(pattern2_0) = C::ty_vec128(ctx, pattern1_0) { - // Rule at src/isa/aarch64/inst.isle line 3416. - let expr0_0 = VecALUOp::Umaxp; - let expr1_0 = VectorSize::Size32x4; - let expr2_0 = constructor_vec_rrr(ctx, &expr0_0, pattern0_0, pattern0_0, &expr1_0); - let expr3_0: u8 = 0i128 as u8; - let expr4_0 = ScalarSize::Size64; - let expr5_0 = constructor_mov_from_vec(ctx, expr2_0, expr3_0, &expr4_0); - let expr6_0 = OperandSize::Size64; - let expr7_0: u8 = 0i128 as u8; - let expr8_0 = C::u8_into_imm12(ctx, expr7_0); - let expr9_0 = constructor_cmp_imm(ctx, &expr6_0, expr5_0, expr8_0); - return expr9_0; - } - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let mut closure2 = || { - let expr0_0 = C::ty_vec64_ctor(ctx, pattern1_0)?; - return Some(expr0_0); - }; - if let Some(pattern2_0) = closure2() { - // Rule at src/isa/aarch64/inst.isle line 3420. - let expr0_0: u8 = 0i128 as u8; - let expr1_0 = ScalarSize::Size64; - let expr2_0 = constructor_mov_from_vec(ctx, pattern0_0, expr0_0, &expr1_0); - let expr3_0 = OperandSize::Size64; - let expr4_0: u8 = 0i128 as u8; - let expr5_0 = C::u8_into_imm12(ctx, expr4_0); - let expr6_0 = constructor_cmp_imm(ctx, &expr3_0, expr2_0, expr5_0); - return expr6_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "vanytrue", "src/isa/aarch64/inst.isle line 3415" - ); -} - -// Generated as internal constructor for term elf_tls_get_addr. -pub fn constructor_elf_tls_get_addr(ctx: &mut C, arg0: ExternalName) -> Reg { - let pattern0_0 = arg0; - // Rule at src/isa/aarch64/inst.isle line 3429. - let expr0_0: Type = I64; - let expr1_0 = C::temp_writable_reg(ctx, expr0_0); - let expr2_0 = MInst::ElfTlsGetAddr { - symbol: pattern0_0, - rd: expr1_0, - }; - let expr3_0 = C::emit(ctx, &expr2_0); - let expr4_0 = C::writable_reg_to_reg(ctx, expr1_0); - return expr4_0; -} - -// Generated as internal constructor for term flags_and_cc. -pub fn constructor_flags_and_cc( - ctx: &mut C, - arg0: &ProducesFlags, - arg1: &IntCC, -) -> FlagsAndCC { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/aarch64/inst.isle line 3440. - let expr0_0 = FlagsAndCC::FlagsAndCC { - flags: pattern0_0.clone(), - cc: pattern1_0.clone(), - }; - return expr0_0; -} - -// Generated as internal constructor for term flags_and_cc_to_bool. -pub fn constructor_flags_and_cc_to_bool(ctx: &mut C, arg0: &FlagsAndCC) -> ValueRegs { - let pattern0_0 = arg0; - if let &FlagsAndCC::FlagsAndCC { - flags: ref pattern1_0, - cc: ref pattern1_1, - } = pattern0_0 - { - // Rule at src/isa/aarch64/inst.isle line 3444. - let expr0_0 = C::cond_code(ctx, pattern1_1); - let expr1_0 = constructor_materialize_bool_result(ctx, &expr0_0); - let expr2_0 = constructor_with_flags(ctx, pattern1_0, &expr1_0); - return expr2_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "flags_and_cc_to_bool", "src/isa/aarch64/inst.isle line 3443" - ); -} - -// Generated as internal constructor for term flags_and_cc_flags. -pub fn constructor_flags_and_cc_flags(ctx: &mut C, arg0: &FlagsAndCC) -> ProducesFlags { - let pattern0_0 = arg0; - if let &FlagsAndCC::FlagsAndCC { - flags: ref pattern1_0, - cc: ref pattern1_1, - } = pattern0_0 - { - // Rule at src/isa/aarch64/inst.isle line 3449. - return pattern1_0.clone(); - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "flags_and_cc_flags", "src/isa/aarch64/inst.isle line 3448" - ); -} - -// Generated as internal constructor for term flags_and_cc_cc. -pub fn constructor_flags_and_cc_cc(ctx: &mut C, arg0: &FlagsAndCC) -> IntCC { - let pattern0_0 = arg0; - if let &FlagsAndCC::FlagsAndCC { - flags: ref pattern1_0, - cc: ref pattern1_1, - } = pattern0_0 - { - // Rule at src/isa/aarch64/inst.isle line 3453. - return pattern1_1.clone(); - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "flags_and_cc_cc", "src/isa/aarch64/inst.isle line 3452" - ); -} - -// Generated as internal constructor for term lower_icmp. -pub fn constructor_lower_icmp( - ctx: &mut C, - arg0: &IntCC, - arg1: Value, - arg2: Value, - arg3: Type, -) -> FlagsAndCC { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - if let Some(pattern4_0) = C::fits_in_16(ctx, pattern3_0) { - let mut closure5 = || { - let expr0_0 = C::signed_cond_code(ctx, pattern0_0)?; - return Some(expr0_0); - }; - if let Some(pattern5_0) = closure5() { - // Rule at src/isa/aarch64/inst.isle line 3487. - let expr0_0 = constructor_put_in_reg_sext32(ctx, pattern1_0); - let expr1_0 = constructor_operand_size(ctx, pattern4_0); - let expr2_0 = C::put_in_reg(ctx, pattern2_0); - let expr3_0: bool = true; - let expr4_0 = constructor_lower_extend_op(ctx, pattern4_0, expr3_0); - let expr5_0 = constructor_cmp_extend(ctx, &expr1_0, expr0_0, expr2_0, &expr4_0); - let expr6_0 = constructor_flags_and_cc(ctx, &expr5_0, pattern0_0); - return expr6_0; - } - } - let pattern0_0 = arg0; - match pattern0_0 { - &IntCC::Equal => { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - let pattern4_0 = arg3; - if pattern4_0 == I128 { - // Rule at src/isa/aarch64/inst.isle line 3553. - let expr0_0 = constructor_lower_icmp_i128_eq_ne(ctx, pattern2_0, pattern3_0); - let expr1_0 = IntCC::Equal; - let expr2_0 = constructor_flags_and_cc(ctx, &expr0_0, &expr1_0); - return expr2_0; - } - } - &IntCC::NotEqual => { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - let pattern4_0 = arg3; - if pattern4_0 == I128 { - // Rule at src/isa/aarch64/inst.isle line 3555. - let expr0_0 = constructor_lower_icmp_i128_eq_ne(ctx, pattern2_0, pattern3_0); - let expr1_0 = IntCC::NotEqual; - let expr2_0 = constructor_flags_and_cc(ctx, &expr0_0, &expr1_0); - return expr2_0; - } - } - _ => {} - } - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - if let Some(pattern3_0) = C::def_inst(ctx, pattern2_0) { - let pattern4_0 = C::inst_data(ctx, pattern3_0); - if let &InstructionData::UnaryImm { - opcode: ref pattern5_0, - imm: pattern5_1, - } = &pattern4_0 - { - if let &Opcode::Iconst = pattern5_0 { - let pattern7_0 = C::u64_from_imm64(ctx, pattern5_1); - if let Some(pattern8_0) = C::imm12_from_u64(ctx, pattern7_0) { - let pattern9_0 = arg3; - if let Some(pattern10_0) = C::fits_in_16(ctx, pattern9_0) { - // Rule at src/isa/aarch64/inst.isle line 3491. - let expr0_0 = constructor_put_in_reg_zext32(ctx, pattern1_0); - let expr1_0 = constructor_operand_size(ctx, pattern10_0); - let expr2_0 = constructor_cmp_imm(ctx, &expr1_0, expr0_0, pattern8_0); - let expr3_0 = constructor_flags_and_cc(ctx, &expr2_0, pattern0_0); - return expr3_0; - } - } - } - } - } - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - if let Some(pattern4_0) = C::fits_in_16(ctx, pattern3_0) { - // Rule at src/isa/aarch64/inst.isle line 3494. - let expr0_0 = constructor_put_in_reg_zext32(ctx, pattern1_0); - let expr1_0 = constructor_operand_size(ctx, pattern4_0); - let expr2_0 = C::put_in_reg(ctx, pattern2_0); - let expr3_0: bool = false; - let expr4_0 = constructor_lower_extend_op(ctx, pattern4_0, expr3_0); - let expr5_0 = constructor_cmp_extend(ctx, &expr1_0, expr0_0, expr2_0, &expr4_0); - let expr6_0 = constructor_flags_and_cc(ctx, &expr5_0, pattern0_0); - return expr6_0; - } - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - if let Some(pattern3_0) = C::def_inst(ctx, pattern2_0) { - let pattern4_0 = C::inst_data(ctx, pattern3_0); - if let &InstructionData::UnaryImm { - opcode: ref pattern5_0, - imm: pattern5_1, - } = &pattern4_0 - { - if let &Opcode::Iconst = pattern5_0 { - let pattern7_0 = C::u64_from_imm64(ctx, pattern5_1); - let pattern8_0 = arg3; - let mut closure9 = || { - let expr0_0 = C::ty_int_ref_scalar_64(ctx, pattern8_0)?; - return Some(expr0_0); - }; - if let Some(pattern9_0) = closure9() { - // Rule at src/isa/aarch64/inst.isle line 3497. - let expr0_0 = constructor_lower_icmp_const( - ctx, pattern0_0, pattern1_0, pattern7_0, pattern8_0, - ); - return expr0_0; - } - } - } - } - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - let mut closure4 = || { - let expr0_0 = C::ty_int_ref_scalar_64(ctx, pattern3_0)?; - return Some(expr0_0); - }; - if let Some(pattern4_0) = closure4() { - // Rule at src/isa/aarch64/inst.isle line 3500. - let expr0_0 = constructor_operand_size(ctx, pattern3_0); - let expr1_0 = C::put_in_reg(ctx, pattern1_0); - let expr2_0 = C::put_in_reg(ctx, pattern2_0); - let expr3_0 = constructor_cmp(ctx, &expr0_0, expr1_0, expr2_0); - let expr4_0 = constructor_flags_and_cc(ctx, &expr3_0, pattern0_0); - return expr4_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "lower_icmp", "src/isa/aarch64/inst.isle line 3458" - ); -} - -// Generated as internal constructor for term lower_icmp_into_reg. -pub fn constructor_lower_icmp_into_reg( - ctx: &mut C, - arg0: &IntCC, - arg1: Value, - arg2: Value, - arg3: Type, - arg4: Type, -) -> ValueRegs { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - if let Some((pattern4_0, pattern4_1)) = C::multi_lane(ctx, pattern3_0) { - let pattern5_0 = arg4; - // Rule at src/isa/aarch64/inst.isle line 3468. - let expr0_0 = C::cond_code(ctx, pattern0_0); - let expr1_0 = C::put_in_reg(ctx, pattern1_0); - let expr2_0 = C::put_in_reg(ctx, pattern2_0); - let expr3_0 = constructor_vec_cmp(ctx, expr1_0, expr2_0, pattern3_0, &expr0_0); - let expr4_0 = C::value_reg(ctx, expr3_0); - return expr4_0; - } - let pattern0_0 = arg0; - match pattern0_0 { - &IntCC::Equal => { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - let pattern4_0 = arg3; - if pattern4_0 == I128 { - let pattern6_0 = arg4; - if pattern6_0 == I8 { - // Rule at src/isa/aarch64/inst.isle line 3530. - let expr0_0 = C::cond_code(ctx, pattern0_0); - let expr1_0: Type = I128; - let expr2_0 = - constructor_lower_icmp(ctx, pattern0_0, pattern2_0, pattern3_0, expr1_0); - let expr3_0 = constructor_flags_and_cc_to_bool(ctx, &expr2_0); - return expr3_0; - } - } - } - &IntCC::NotEqual => { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - let pattern4_0 = arg3; - if pattern4_0 == I128 { - let pattern6_0 = arg4; - if pattern6_0 == I8 { - // Rule at src/isa/aarch64/inst.isle line 3534. - let expr0_0 = C::cond_code(ctx, pattern0_0); - let expr1_0: Type = I128; - let expr2_0 = - constructor_lower_icmp(ctx, pattern0_0, pattern2_0, pattern3_0, expr1_0); - let expr3_0 = constructor_flags_and_cc_to_bool(ctx, &expr2_0); - return expr3_0; - } - } - } - _ => {} - } - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - if pattern3_0 == I128 { - let pattern5_0 = arg4; - if pattern5_0 == I8 { - // Rule at src/isa/aarch64/inst.isle line 3563. - let expr0_0 = C::intcc_unsigned(ctx, pattern0_0); - let expr1_0 = C::cond_code(ctx, &expr0_0); - let expr2_0 = C::cond_code(ctx, pattern0_0); - let expr3_0 = C::put_in_regs(ctx, pattern1_0); - let expr4_0 = C::put_in_regs(ctx, pattern2_0); - let expr5_0: usize = 0i128 as usize; - let expr6_0 = C::value_regs_get(ctx, expr3_0, expr5_0); - let expr7_0: usize = 1i128 as usize; - let expr8_0 = C::value_regs_get(ctx, expr3_0, expr7_0); - let expr9_0: usize = 0i128 as usize; - let expr10_0 = C::value_regs_get(ctx, expr4_0, expr9_0); - let expr11_0: usize = 1i128 as usize; - let expr12_0 = C::value_regs_get(ctx, expr4_0, expr11_0); - let expr13_0 = OperandSize::Size64; - let expr14_0 = constructor_cmp(ctx, &expr13_0, expr6_0, expr10_0); - let expr15_0 = constructor_materialize_bool_result(ctx, &expr1_0); - let expr16_0 = constructor_with_flags_reg(ctx, &expr14_0, &expr15_0); - let expr17_0 = OperandSize::Size64; - let expr18_0 = constructor_cmp(ctx, &expr17_0, expr8_0, expr12_0); - let expr19_0 = constructor_lower_icmp_i128_consumer(ctx, &expr2_0, expr16_0); - let expr20_0 = constructor_with_flags(ctx, &expr18_0, &expr19_0); - return expr20_0; - } - } - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - let pattern4_0 = arg4; - let mut closure5 = || { - let expr0_0 = C::ty_int_ref_scalar_64(ctx, pattern3_0)?; - return Some(expr0_0); - }; - if let Some(pattern5_0) = closure5() { - // Rule at src/isa/aarch64/inst.isle line 3482. - let expr0_0 = C::cond_code(ctx, pattern0_0); - let expr1_0 = constructor_lower_icmp(ctx, pattern0_0, pattern1_0, pattern2_0, pattern3_0); - let expr2_0 = constructor_flags_and_cc_to_bool(ctx, &expr1_0); - return expr2_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "lower_icmp_into_reg", "src/isa/aarch64/inst.isle line 3459" - ); -} - -// Generated as internal constructor for term lower_icmp_into_flags. -pub fn constructor_lower_icmp_into_flags( - ctx: &mut C, - arg0: &IntCC, - arg1: Value, - arg2: Value, - arg3: Type, -) -> FlagsAndCC { - let pattern0_0 = arg0; - match pattern0_0 { - &IntCC::SignedGreaterThan => { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - let pattern4_0 = arg3; - if pattern4_0 == I128 { - // Rule at src/isa/aarch64/inst.isle line 3658. - let expr0_0: Type = I128; - let expr1_0: Type = I8; - let expr2_0 = constructor_lower_icmp_into_reg( - ctx, pattern0_0, pattern2_0, pattern3_0, expr0_0, expr1_0, - ); - let expr3_0: usize = 0i128 as usize; - let expr4_0 = C::value_regs_get(ctx, expr2_0, expr3_0); - let expr5_0 = OperandSize::Size64; - let expr6_0 = C::zero_reg(ctx); - let expr7_0 = constructor_cmp(ctx, &expr5_0, expr4_0, expr6_0); - let expr8_0 = constructor_flags_and_cc(ctx, &expr7_0, pattern0_0); - return expr8_0; - } - } - &IntCC::SignedGreaterThanOrEqual => { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - let pattern4_0 = arg3; - if pattern4_0 == I128 { - // Rule at src/isa/aarch64/inst.isle line 3637. - let expr0_0: Type = I128; - let expr1_0: Type = I8; - let expr2_0 = constructor_lower_icmp_into_reg( - ctx, pattern0_0, pattern2_0, pattern3_0, expr0_0, expr1_0, - ); - let expr3_0: usize = 0i128 as usize; - let expr4_0 = C::value_regs_get(ctx, expr2_0, expr3_0); - let expr5_0: Type = I64; - let expr6_0 = ImmExtend::Sign; - let expr7_0: u64 = 1i128 as u64; - let expr8_0 = constructor_imm(ctx, expr5_0, &expr6_0, expr7_0); - let expr9_0 = OperandSize::Size64; - let expr10_0 = constructor_cmp(ctx, &expr9_0, expr4_0, expr8_0); - let expr11_0 = constructor_flags_and_cc(ctx, &expr10_0, pattern0_0); - return expr11_0; - } - } - &IntCC::SignedLessThan => { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - let pattern4_0 = arg3; - if pattern4_0 == I128 { - // Rule at src/isa/aarch64/inst.isle line 3666. - let expr0_0: Type = I128; - let expr1_0: Type = I8; - let expr2_0 = constructor_lower_icmp_into_reg( - ctx, pattern0_0, pattern2_0, pattern3_0, expr0_0, expr1_0, - ); - let expr3_0: usize = 0i128 as usize; - let expr4_0 = C::value_regs_get(ctx, expr2_0, expr3_0); - let expr5_0 = OperandSize::Size64; - let expr6_0 = C::zero_reg(ctx); - let expr7_0 = constructor_cmp(ctx, &expr5_0, expr6_0, expr4_0); - let expr8_0 = constructor_flags_and_cc(ctx, &expr7_0, pattern0_0); - return expr8_0; - } - } - &IntCC::SignedLessThanOrEqual => { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - let pattern4_0 = arg3; - if pattern4_0 == I128 { - // Rule at src/isa/aarch64/inst.isle line 3647. - let expr0_0: Type = I128; - let expr1_0: Type = I8; - let expr2_0 = constructor_lower_icmp_into_reg( - ctx, pattern0_0, pattern2_0, pattern3_0, expr0_0, expr1_0, - ); - let expr3_0: usize = 0i128 as usize; - let expr4_0 = C::value_regs_get(ctx, expr2_0, expr3_0); - let expr5_0: Type = I64; - let expr6_0 = ImmExtend::Sign; - let expr7_0: u64 = 1i128 as u64; - let expr8_0 = constructor_imm(ctx, expr5_0, &expr6_0, expr7_0); - let expr9_0 = OperandSize::Size64; - let expr10_0 = constructor_cmp(ctx, &expr9_0, expr8_0, expr4_0); - let expr11_0 = constructor_flags_and_cc(ctx, &expr10_0, pattern0_0); - return expr11_0; - } - } - &IntCC::UnsignedGreaterThan => { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - let pattern4_0 = arg3; - if pattern4_0 == I128 { - // Rule at src/isa/aarch64/inst.isle line 3662. - let expr0_0: Type = I128; - let expr1_0: Type = I8; - let expr2_0 = constructor_lower_icmp_into_reg( - ctx, pattern0_0, pattern2_0, pattern3_0, expr0_0, expr1_0, - ); - let expr3_0: usize = 0i128 as usize; - let expr4_0 = C::value_regs_get(ctx, expr2_0, expr3_0); - let expr5_0 = OperandSize::Size64; - let expr6_0 = C::zero_reg(ctx); - let expr7_0 = constructor_cmp(ctx, &expr5_0, expr4_0, expr6_0); - let expr8_0 = constructor_flags_and_cc(ctx, &expr7_0, pattern0_0); - return expr8_0; - } - } - &IntCC::UnsignedGreaterThanOrEqual => { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - let pattern4_0 = arg3; - if pattern4_0 == I128 { - // Rule at src/isa/aarch64/inst.isle line 3642. - let expr0_0: Type = I128; - let expr1_0: Type = I8; - let expr2_0 = constructor_lower_icmp_into_reg( - ctx, pattern0_0, pattern2_0, pattern3_0, expr0_0, expr1_0, - ); - let expr3_0: usize = 0i128 as usize; - let expr4_0 = C::value_regs_get(ctx, expr2_0, expr3_0); - let expr5_0: Type = I64; - let expr6_0 = ImmExtend::Zero; - let expr7_0: u64 = 1i128 as u64; - let expr8_0 = constructor_imm(ctx, expr5_0, &expr6_0, expr7_0); - let expr9_0 = OperandSize::Size64; - let expr10_0 = constructor_cmp(ctx, &expr9_0, expr4_0, expr8_0); - let expr11_0 = constructor_flags_and_cc(ctx, &expr10_0, pattern0_0); - return expr11_0; - } - } - &IntCC::UnsignedLessThan => { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - let pattern4_0 = arg3; - if pattern4_0 == I128 { - // Rule at src/isa/aarch64/inst.isle line 3670. - let expr0_0: Type = I128; - let expr1_0: Type = I8; - let expr2_0 = constructor_lower_icmp_into_reg( - ctx, pattern0_0, pattern2_0, pattern3_0, expr0_0, expr1_0, - ); - let expr3_0: usize = 0i128 as usize; - let expr4_0 = C::value_regs_get(ctx, expr2_0, expr3_0); - let expr5_0 = OperandSize::Size64; - let expr6_0 = C::zero_reg(ctx); - let expr7_0 = constructor_cmp(ctx, &expr5_0, expr6_0, expr4_0); - let expr8_0 = constructor_flags_and_cc(ctx, &expr7_0, pattern0_0); - return expr8_0; - } - } - &IntCC::UnsignedLessThanOrEqual => { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - let pattern4_0 = arg3; - if pattern4_0 == I128 { - // Rule at src/isa/aarch64/inst.isle line 3652. - let expr0_0: Type = I128; - let expr1_0: Type = I8; - let expr2_0 = constructor_lower_icmp_into_reg( - ctx, pattern0_0, pattern2_0, pattern3_0, expr0_0, expr1_0, - ); - let expr3_0: usize = 0i128 as usize; - let expr4_0 = C::value_regs_get(ctx, expr2_0, expr3_0); - let expr5_0: Type = I64; - let expr6_0 = ImmExtend::Zero; - let expr7_0: u64 = 1i128 as u64; - let expr8_0 = constructor_imm(ctx, expr5_0, &expr6_0, expr7_0); - let expr9_0 = OperandSize::Size64; - let expr10_0 = constructor_cmp(ctx, &expr9_0, expr8_0, expr4_0); - let expr11_0 = constructor_flags_and_cc(ctx, &expr10_0, pattern0_0); - return expr11_0; - } - } - _ => {} - } - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - // Rule at src/isa/aarch64/inst.isle line 3464. - let expr0_0 = constructor_lower_icmp(ctx, pattern0_0, pattern1_0, pattern2_0, pattern3_0); - return expr0_0; -} - -// Generated as internal constructor for term lower_icmp_const. -pub fn constructor_lower_icmp_const( - ctx: &mut C, - arg0: &IntCC, - arg1: Value, - arg2: u64, - arg3: Type, -) -> FlagsAndCC { - let pattern0_0 = arg0; - match pattern0_0 { - &IntCC::SignedGreaterThanOrEqual => { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - let pattern4_0 = arg3; - let mut closure5 = || { - let expr0_0 = C::ty_int_ref_scalar_64(ctx, pattern4_0)?; - return Some(expr0_0); - }; - if let Some(pattern5_0) = closure5() { - let mut closure6 = || { - let expr0_0 = C::u64_is_odd(ctx, pattern3_0); - return Some(expr0_0); - }; - if let Some(pattern6_0) = closure6() { - if pattern6_0 == true { - let mut closure8 = || { - let expr0_0: u64 = 1i128 as u64; - let expr1_0 = C::u64_sub(ctx, pattern3_0, expr0_0); - return Some(expr1_0); - }; - if let Some(pattern8_0) = closure8() { - if let Some(pattern9_0) = C::imm12_from_u64(ctx, pattern8_0) { - // Rule at src/isa/aarch64/inst.isle line 3515. - let expr0_0 = constructor_operand_size(ctx, pattern4_0); - let expr1_0 = C::put_in_reg(ctx, pattern2_0); - let expr2_0 = - constructor_cmp_imm(ctx, &expr0_0, expr1_0, pattern9_0); - let expr3_0 = IntCC::SignedGreaterThan; - let expr4_0 = constructor_flags_and_cc(ctx, &expr2_0, &expr3_0); - return expr4_0; - } - } - } - } - } - } - &IntCC::UnsignedGreaterThanOrEqual => { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - let pattern4_0 = arg3; - let mut closure5 = || { - let expr0_0 = C::ty_int_ref_scalar_64(ctx, pattern4_0)?; - return Some(expr0_0); - }; - if let Some(pattern5_0) = closure5() { - let mut closure6 = || { - let expr0_0 = C::u64_is_odd(ctx, pattern3_0); - return Some(expr0_0); - }; - if let Some(pattern6_0) = closure6() { - if pattern6_0 == true { - let mut closure8 = || { - let expr0_0: u64 = 1i128 as u64; - let expr1_0 = C::u64_sub(ctx, pattern3_0, expr0_0); - return Some(expr1_0); - }; - if let Some(pattern8_0) = closure8() { - if let Some(pattern9_0) = C::imm12_from_u64(ctx, pattern8_0) { - // Rule at src/isa/aarch64/inst.isle line 3510. - let expr0_0 = constructor_operand_size(ctx, pattern4_0); - let expr1_0 = C::put_in_reg(ctx, pattern2_0); - let expr2_0 = - constructor_cmp_imm(ctx, &expr0_0, expr1_0, pattern9_0); - let expr3_0 = IntCC::UnsignedGreaterThan; - let expr4_0 = constructor_flags_and_cc(ctx, &expr2_0, &expr3_0); - return expr4_0; - } - } - } - } - } - } - _ => {} - } - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - if let Some(pattern3_0) = C::imm12_from_u64(ctx, pattern2_0) { - let pattern4_0 = arg3; - let mut closure5 = || { - let expr0_0 = C::ty_int_ref_scalar_64(ctx, pattern4_0)?; - return Some(expr0_0); - }; - if let Some(pattern5_0) = closure5() { - // Rule at src/isa/aarch64/inst.isle line 3521. - let expr0_0 = constructor_operand_size(ctx, pattern4_0); - let expr1_0 = C::put_in_reg(ctx, pattern1_0); - let expr2_0 = constructor_cmp_imm(ctx, &expr0_0, expr1_0, pattern3_0); - let expr3_0 = constructor_flags_and_cc(ctx, &expr2_0, pattern0_0); - return expr3_0; - } - } - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - let mut closure4 = || { - let expr0_0 = C::ty_int_ref_scalar_64(ctx, pattern3_0)?; - return Some(expr0_0); - }; - if let Some(pattern4_0) = closure4() { - // Rule at src/isa/aarch64/inst.isle line 3524. - let expr0_0 = constructor_operand_size(ctx, pattern3_0); - let expr1_0 = C::put_in_reg(ctx, pattern1_0); - let expr2_0 = ImmExtend::Zero; - let expr3_0 = constructor_imm(ctx, pattern3_0, &expr2_0, pattern2_0); - let expr4_0 = constructor_cmp(ctx, &expr0_0, expr1_0, expr3_0); - let expr5_0 = constructor_flags_and_cc(ctx, &expr4_0, pattern0_0); - return expr5_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "lower_icmp_const", "src/isa/aarch64/inst.isle line 3461" - ); -} - -// Generated as internal constructor for term lower_extend_op. -pub fn constructor_lower_extend_op(ctx: &mut C, arg0: Type, arg1: bool) -> ExtendOp { - let pattern0_0 = arg0; - if pattern0_0 == I8 { - let pattern2_0 = arg1; - if pattern2_0 == true { - // Rule at src/isa/aarch64/inst.isle line 3476. - let expr0_0 = ExtendOp::SXTB; - return expr0_0; - } - if pattern2_0 == false { - // Rule at src/isa/aarch64/inst.isle line 3478. - let expr0_0 = ExtendOp::UXTB; - return expr0_0; - } - } - if pattern0_0 == I16 { - let pattern2_0 = arg1; - if pattern2_0 == true { - // Rule at src/isa/aarch64/inst.isle line 3477. - let expr0_0 = ExtendOp::SXTH; - return expr0_0; - } - if pattern2_0 == false { - // Rule at src/isa/aarch64/inst.isle line 3479. - let expr0_0 = ExtendOp::UXTH; - return expr0_0; - } - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "lower_extend_op", "src/isa/aarch64/inst.isle line 3475" - ); -} - -// Generated as internal constructor for term lower_icmp_i128_eq_ne. -pub fn constructor_lower_icmp_i128_eq_ne( - ctx: &mut C, - arg0: Value, - arg1: Value, -) -> ProducesFlags { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/aarch64/inst.isle line 3542. - let expr0_0 = C::put_in_regs(ctx, pattern0_0); - let expr1_0 = C::put_in_regs(ctx, pattern1_0); - let expr2_0: usize = 0i128 as usize; - let expr3_0 = C::value_regs_get(ctx, expr0_0, expr2_0); - let expr4_0: usize = 1i128 as usize; - let expr5_0 = C::value_regs_get(ctx, expr0_0, expr4_0); - let expr6_0: usize = 0i128 as usize; - let expr7_0 = C::value_regs_get(ctx, expr1_0, expr6_0); - let expr8_0: usize = 1i128 as usize; - let expr9_0 = C::value_regs_get(ctx, expr1_0, expr8_0); - let expr10_0 = OperandSize::Size64; - let expr11_0 = constructor_cmp(ctx, &expr10_0, expr3_0, expr7_0); - let expr12_0 = OperandSize::Size64; - let expr13_0: bool = false; - let expr14_0: bool = false; - let expr15_0: bool = false; - let expr16_0: bool = false; - let expr17_0 = C::nzcv(ctx, expr13_0, expr14_0, expr15_0, expr16_0); - let expr18_0 = Cond::Eq; - let expr19_0 = constructor_ccmp( - ctx, &expr12_0, expr5_0, expr9_0, expr17_0, &expr18_0, &expr11_0, - ); - return expr19_0; -} - -// Generated as internal constructor for term lower_icmp_i128_consumer. -pub fn constructor_lower_icmp_i128_consumer( - ctx: &mut C, - arg0: &Cond, - arg1: Reg, -) -> ConsumesFlags { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/aarch64/inst.isle line 3578. - let expr0_0: Type = I64; - let expr1_0 = C::temp_writable_reg(ctx, expr0_0); - let expr2_0: Type = I64; - let expr3_0 = C::temp_writable_reg(ctx, expr2_0); - let expr4_0 = MInst::CSet { - rd: expr1_0, - cond: pattern0_0.clone(), - }; - let expr5_0 = Cond::Eq; - let expr6_0 = C::writable_reg_to_reg(ctx, expr1_0); - let expr7_0 = MInst::CSel { - rd: expr3_0, - cond: expr5_0, - rn: pattern1_0, - rm: expr6_0, - }; - let expr8_0 = C::writable_reg_to_reg(ctx, expr3_0); - let expr9_0 = C::value_reg(ctx, expr8_0); - let expr10_0 = ConsumesFlags::ConsumesFlagsTwiceReturnsValueRegs { - inst1: expr4_0, - inst2: expr7_0, - result: expr9_0, - }; - return expr10_0; -} - -// Generated as internal constructor for term lower_bmask. -pub fn constructor_lower_bmask( - ctx: &mut C, - arg0: Type, - arg1: Type, - arg2: ValueRegs, -) -> ValueRegs { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - if let Some(pattern2_0) = C::fits_in_16(ctx, pattern1_0) { - let pattern3_0 = arg2; - let mut closure4 = || { - let expr0_0: Type = I32; - let expr1_0 = C::ty_mask(ctx, pattern2_0); - let expr2_0 = C::imm_logic_from_u64(ctx, expr0_0, expr1_0)?; - return Some(expr2_0); - }; - if let Some(pattern4_0) = closure4() { - // Rule at src/isa/aarch64/inst.isle line 3627. - let expr0_0: Type = I32; - let expr1_0: usize = 0i128 as usize; - let expr2_0 = C::value_regs_get(ctx, pattern3_0, expr1_0); - let expr3_0 = constructor_and_imm(ctx, expr0_0, expr2_0, pattern4_0); - let expr4_0: Type = I32; - let expr5_0 = C::value_reg(ctx, expr3_0); - let expr6_0 = constructor_lower_bmask(ctx, pattern0_0, expr4_0, expr5_0); - return expr6_0; - } - } - let pattern0_0 = arg0; - if pattern0_0 == I128 { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - // Rule at src/isa/aarch64/inst.isle line 3615. - let expr0_0: Type = I64; - let expr1_0 = constructor_lower_bmask(ctx, expr0_0, pattern2_0, pattern3_0); - let expr2_0: usize = 0i128 as usize; - let expr3_0 = C::value_regs_get(ctx, expr1_0, expr2_0); - let expr4_0 = C::value_regs(ctx, expr3_0, expr3_0); - return expr4_0; - } - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::fits_in_64(ctx, pattern0_0) { - let pattern2_0 = arg1; - if pattern2_0 == I128 { - let pattern4_0 = arg2; - // Rule at src/isa/aarch64/inst.isle line 3606. - let expr0_0: usize = 0i128 as usize; - let expr1_0 = C::value_regs_get(ctx, pattern4_0, expr0_0); - let expr2_0: usize = 1i128 as usize; - let expr3_0 = C::value_regs_get(ctx, pattern4_0, expr2_0); - let expr4_0: Type = I64; - let expr5_0 = constructor_orr(ctx, expr4_0, expr1_0, expr3_0); - let expr6_0: Type = I64; - let expr7_0 = C::value_reg(ctx, expr5_0); - let expr8_0 = constructor_lower_bmask(ctx, pattern1_0, expr6_0, expr7_0); - return expr8_0; - } - } - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::fits_in_64(ctx, pattern0_0) { - let pattern2_0 = arg1; - if let Some(pattern3_0) = C::ty_32_or_64(ctx, pattern2_0) { - let pattern4_0 = arg2; - // Rule at src/isa/aarch64/inst.isle line 3593. - let expr0_0 = constructor_operand_size(ctx, pattern3_0); - let expr1_0: usize = 0i128 as usize; - let expr2_0 = C::value_regs_get(ctx, pattern4_0, expr1_0); - let expr3_0: u8 = 0i128 as u8; - let expr4_0 = C::u8_into_imm12(ctx, expr3_0); - let expr5_0 = constructor_cmp_imm(ctx, &expr0_0, expr2_0, expr4_0); - let expr6_0 = Cond::Ne; - let expr7_0 = constructor_csetm(ctx, &expr6_0); - let expr8_0 = constructor_with_flags_reg(ctx, &expr5_0, &expr7_0); - let expr9_0 = C::value_reg(ctx, expr8_0); - return expr9_0; - } - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "lower_bmask", "src/isa/aarch64/inst.isle line 3586" - ); -} - -// Generated as internal constructor for term lower_select. -pub fn constructor_lower_select( - ctx: &mut C, - arg0: &ProducesFlags, - arg1: &Cond, - arg2: Type, - arg3: Value, - arg4: Value, -) -> ValueRegs { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - if pattern2_0 == I128 { - let pattern4_0 = arg3; - let pattern5_0 = arg4; - // Rule at src/isa/aarch64/inst.isle line 3684. - let expr0_0: Type = I64; - let expr1_0 = C::temp_writable_reg(ctx, expr0_0); - let expr2_0: Type = I64; - let expr3_0 = C::temp_writable_reg(ctx, expr2_0); - let expr4_0 = C::put_in_regs(ctx, pattern4_0); - let expr5_0 = C::put_in_regs(ctx, pattern5_0); - let expr6_0: usize = 0i128 as usize; - let expr7_0 = C::value_regs_get(ctx, expr4_0, expr6_0); - let expr8_0: usize = 1i128 as usize; - let expr9_0 = C::value_regs_get(ctx, expr4_0, expr8_0); - let expr10_0: usize = 0i128 as usize; - let expr11_0 = C::value_regs_get(ctx, expr5_0, expr10_0); - let expr12_0: usize = 1i128 as usize; - let expr13_0 = C::value_regs_get(ctx, expr5_0, expr12_0); - let expr14_0 = MInst::CSel { - rd: expr1_0, - cond: pattern1_0.clone(), - rn: expr7_0, - rm: expr11_0, - }; - let expr15_0 = MInst::CSel { - rd: expr3_0, - cond: pattern1_0.clone(), - rn: expr9_0, - rm: expr13_0, - }; - let expr16_0 = C::writable_reg_to_reg(ctx, expr1_0); - let expr17_0 = C::writable_reg_to_reg(ctx, expr3_0); - let expr18_0 = C::value_regs(ctx, expr16_0, expr17_0); - let expr19_0 = ConsumesFlags::ConsumesFlagsTwiceReturnsValueRegs { - inst1: expr14_0, - inst2: expr15_0, - result: expr18_0, - }; - let expr20_0 = constructor_with_flags(ctx, pattern0_0, &expr19_0); - return expr20_0; - } - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - if let Some(pattern3_0) = C::ty_vec128(ctx, pattern2_0) { - let pattern4_0 = arg3; - let pattern5_0 = arg4; - // Rule at src/isa/aarch64/inst.isle line 3679. - let expr0_0 = C::put_in_reg(ctx, pattern4_0); - let expr1_0 = C::put_in_reg(ctx, pattern5_0); - let expr2_0 = constructor_vec_csel(ctx, pattern1_0, expr0_0, expr1_0); - let expr3_0 = constructor_with_flags(ctx, pattern0_0, &expr2_0); - return expr3_0; - } - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - if let Some(pattern3_0) = C::ty_scalar_float(ctx, pattern2_0) { - let pattern4_0 = arg3; - let pattern5_0 = arg4; - // Rule at src/isa/aarch64/inst.isle line 3677. - let expr0_0 = C::put_in_reg(ctx, pattern4_0); - let expr1_0 = C::put_in_reg(ctx, pattern5_0); - let expr2_0 = constructor_fpu_csel(ctx, pattern3_0, pattern1_0, expr0_0, expr1_0); - let expr3_0 = constructor_with_flags(ctx, pattern0_0, &expr2_0); - return expr3_0; - } - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - let pattern4_0 = arg4; - let mut closure5 = || { - let expr0_0 = C::ty_int_ref_scalar_64(ctx, pattern2_0)?; - return Some(expr0_0); - }; - if let Some(pattern5_0) = closure5() { - // Rule at src/isa/aarch64/inst.isle line 3698. - let expr0_0 = C::put_in_reg(ctx, pattern3_0); - let expr1_0 = C::put_in_reg(ctx, pattern4_0); - let expr2_0 = constructor_csel(ctx, pattern1_0, expr0_0, expr1_0); - let expr3_0 = constructor_with_flags(ctx, pattern0_0, &expr2_0); - return expr3_0; - } - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - let pattern4_0 = arg4; - let mut closure5 = || { - let expr0_0 = C::ty_vec64_ctor(ctx, pattern2_0)?; - return Some(expr0_0); - }; - if let Some(pattern5_0) = closure5() { - // Rule at src/isa/aarch64/inst.isle line 3681. - let expr0_0: Type = F64; - let expr1_0 = C::put_in_reg(ctx, pattern3_0); - let expr2_0 = C::put_in_reg(ctx, pattern4_0); - let expr3_0 = constructor_fpu_csel(ctx, expr0_0, pattern1_0, expr1_0, expr2_0); - let expr4_0 = constructor_with_flags(ctx, pattern0_0, &expr3_0); - return expr4_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "lower_select", "src/isa/aarch64/inst.isle line 3676" - ); -} - -// Generated as internal constructor for term aarch64_jump. -pub fn constructor_aarch64_jump(ctx: &mut C, arg0: BranchTarget) -> SideEffectNoResult { - let pattern0_0 = arg0; - // Rule at src/isa/aarch64/inst.isle line 3704. - let expr0_0 = MInst::Jump { dest: pattern0_0 }; - let expr1_0 = SideEffectNoResult::Inst { inst: expr0_0 }; - return expr1_0; -} - -// Generated as internal constructor for term jt_sequence. -pub fn constructor_jt_sequence( - ctx: &mut C, - arg0: Reg, - arg1: BoxJTSequenceInfo, -) -> ConsumesFlags { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/aarch64/inst.isle line 3726. - let expr0_0: Type = I64; - let expr1_0 = C::temp_writable_reg(ctx, expr0_0); - let expr2_0: Type = I64; - let expr3_0 = C::temp_writable_reg(ctx, expr2_0); - let expr4_0 = MInst::JTSequence { - info: pattern1_0, - ridx: pattern0_0, - rtmp1: expr1_0, - rtmp2: expr3_0, - }; - let expr5_0 = ConsumesFlags::ConsumesFlagsSideEffect { inst: expr4_0 }; - return expr5_0; -} - -// Generated as internal constructor for term cond_br. -pub fn constructor_cond_br( - ctx: &mut C, - arg0: BranchTarget, - arg1: BranchTarget, - arg2: CondBrKind, -) -> ConsumesFlags { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/aarch64/inst.isle line 3734. - let expr0_0 = MInst::CondBr { - taken: pattern0_0, - not_taken: pattern1_0, - kind: pattern2_0, - }; - let expr1_0 = ConsumesFlags::ConsumesFlagsSideEffect { inst: expr0_0 }; - return expr1_0; -} - -// Generated as internal constructor for term mov_to_nzcv. -pub fn constructor_mov_to_nzcv(ctx: &mut C, arg0: Reg) -> ProducesFlags { - let pattern0_0 = arg0; - // Rule at src/isa/aarch64/inst.isle line 3740. - let expr0_0 = MInst::MovToNZCV { rn: pattern0_0 }; - let expr1_0 = ProducesFlags::ProducesFlagsSideEffect { inst: expr0_0 }; - return expr1_0; -} - -// Generated as internal constructor for term emit_island. -pub fn constructor_emit_island(ctx: &mut C, arg0: CodeOffset) -> SideEffectNoResult { - let pattern0_0 = arg0; - // Rule at src/isa/aarch64/inst.isle line 3746. - let expr0_0 = MInst::EmitIsland { - needed_space: pattern0_0, - }; - let expr1_0 = SideEffectNoResult::Inst { inst: expr0_0 }; - return expr1_0; -} - -// Generated as internal constructor for term br_table_impl. -pub fn constructor_br_table_impl( - ctx: &mut C, - arg0: u64, - arg1: Reg, - arg2: &VecMachLabel, -) -> Unit { - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::imm12_from_u64(ctx, pattern0_0) { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - // Rule at src/isa/aarch64/inst.isle line 3752. - let expr0_0 = C::targets_jt_info(ctx, pattern3_0); - let expr1_0 = OperandSize::Size32; - let expr2_0 = constructor_cmp_imm(ctx, &expr1_0, pattern2_0, pattern1_0); - let expr3_0 = constructor_jt_sequence(ctx, pattern2_0, expr0_0); - let expr4_0 = constructor_with_flags_side_effect(ctx, &expr2_0, &expr3_0); - let expr5_0 = constructor_emit_side_effect(ctx, &expr4_0); - return expr5_0; - } - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/aarch64/inst.isle line 3757. - let expr0_0: Type = I64; - let expr1_0 = ImmExtend::Zero; - let expr2_0 = constructor_imm(ctx, expr0_0, &expr1_0, pattern0_0); - let expr3_0 = C::targets_jt_info(ctx, pattern2_0); - let expr4_0 = OperandSize::Size32; - let expr5_0 = constructor_cmp(ctx, &expr4_0, pattern1_0, expr2_0); - let expr6_0 = constructor_jt_sequence(ctx, pattern1_0, expr3_0); - let expr7_0 = constructor_with_flags_side_effect(ctx, &expr5_0, &expr6_0); - let expr8_0 = constructor_emit_side_effect(ctx, &expr7_0); - return expr8_0; -} - -// Generated as internal constructor for term fpu_move_128. -pub fn constructor_fpu_move_128(ctx: &mut C, arg0: Reg) -> Reg { - let pattern0_0 = arg0; - // Rule at src/isa/aarch64/inst_neon.isle line 4. - let expr0_0: Type = I8X16; - let expr1_0 = C::temp_writable_reg(ctx, expr0_0); - let expr2_0 = MInst::FpuMove128 { - rd: expr1_0, - rn: pattern0_0, - }; - let expr3_0 = C::emit(ctx, &expr2_0); - let expr4_0 = C::writable_reg_to_reg(ctx, expr1_0); - return expr4_0; -} - -// Generated as internal constructor for term lower. -pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::first_result(ctx, pattern0_0) { - let pattern2_0 = C::value_type(ctx, pattern1_0); - if let Some(pattern3_0) = C::fits_in_64(ctx, pattern2_0) { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Binary { - opcode: ref pattern5_0, - args: ref pattern5_1, - } = &pattern4_0 - { - if let &Opcode::Iadd = pattern5_0 { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - if let Some(pattern8_0) = C::def_inst(ctx, pattern7_1) { - let pattern9_0 = C::inst_data(ctx, pattern8_0); - if let &InstructionData::Binary { - opcode: ref pattern10_0, - args: ref pattern10_1, - } = &pattern9_0 - { - match pattern10_0 { - &Opcode::Imul => { - let (pattern12_0, pattern12_1) = - C::unpack_value_array_2(ctx, pattern10_1); - // Rule at src/isa/aarch64/lower.isle line 86. - let expr0_0 = C::put_in_reg(ctx, pattern12_0); - let expr1_0 = C::put_in_reg(ctx, pattern12_1); - let expr2_0 = C::put_in_reg(ctx, pattern7_0); - let expr3_0 = constructor_madd( - ctx, pattern3_0, expr0_0, expr1_0, expr2_0, - ); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - &Opcode::Ishl => { - let (pattern12_0, pattern12_1) = - C::unpack_value_array_2(ctx, pattern10_1); - if let Some(pattern13_0) = C::def_inst(ctx, pattern12_1) { - let pattern14_0 = C::inst_data(ctx, pattern13_0); - if let &InstructionData::UnaryImm { - opcode: ref pattern15_0, - imm: pattern15_1, - } = &pattern14_0 - { - if let &Opcode::Iconst = pattern15_0 { - let mut closure17 = || { - let expr0_0 = C::lshl_from_imm64( - ctx, - pattern3_0, - pattern15_1, - )?; - return Some(expr0_0); - }; - if let Some(pattern17_0) = closure17() { - // Rule at src/isa/aarch64/lower.isle line 75. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = C::put_in_reg(ctx, pattern12_0); - let expr2_0 = constructor_add_shift( - ctx, - pattern3_0, - expr0_0, - expr1_0, - pattern17_0, - ); - let expr3_0 = - constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - } - } - } - } - _ => {} - } - } - } - } - } - } - } - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::first_result(ctx, pattern0_0) { - let pattern2_0 = C::value_type(ctx, pattern1_0); - if let Some(pattern3_0) = C::fits_in_64(ctx, pattern2_0) { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Binary { - opcode: ref pattern5_0, - args: ref pattern5_1, - } = &pattern4_0 - { - if let &Opcode::Iadd = pattern5_0 { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - if let Some(pattern8_0) = C::def_inst(ctx, pattern7_0) { - let pattern9_0 = C::inst_data(ctx, pattern8_0); - if let &InstructionData::Binary { - opcode: ref pattern10_0, - args: ref pattern10_1, - } = &pattern9_0 - { - match pattern10_0 { - &Opcode::Imul => { - let (pattern12_0, pattern12_1) = - C::unpack_value_array_2(ctx, pattern10_1); - // Rule at src/isa/aarch64/lower.isle line 89. - let expr0_0 = C::put_in_reg(ctx, pattern12_0); - let expr1_0 = C::put_in_reg(ctx, pattern12_1); - let expr2_0 = C::put_in_reg(ctx, pattern7_1); - let expr3_0 = constructor_madd( - ctx, pattern3_0, expr0_0, expr1_0, expr2_0, - ); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - &Opcode::Ishl => { - let (pattern12_0, pattern12_1) = - C::unpack_value_array_2(ctx, pattern10_1); - if let Some(pattern13_0) = C::def_inst(ctx, pattern12_1) { - let pattern14_0 = C::inst_data(ctx, pattern13_0); - if let &InstructionData::UnaryImm { - opcode: ref pattern15_0, - imm: pattern15_1, - } = &pattern14_0 - { - if let &Opcode::Iconst = pattern15_0 { - let mut closure17 = || { - let expr0_0 = C::lshl_from_imm64( - ctx, - pattern3_0, - pattern15_1, - )?; - return Some(expr0_0); - }; - if let Some(pattern17_0) = closure17() { - // Rule at src/isa/aarch64/lower.isle line 80. - let expr0_0 = C::put_in_reg(ctx, pattern7_1); - let expr1_0 = C::put_in_reg(ctx, pattern12_0); - let expr2_0 = constructor_add_shift( - ctx, - pattern3_0, - expr0_0, - expr1_0, - pattern17_0, - ); - let expr3_0 = - constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - } - } - } - } - _ => {} - } - } - } - } - } - } - } - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::first_result(ctx, pattern0_0) { - let pattern2_0 = C::value_type(ctx, pattern1_0); - if let Some(pattern3_0) = C::fits_in_64(ctx, pattern2_0) { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Binary { - opcode: ref pattern5_0, - args: ref pattern5_1, - } = &pattern4_0 - { - if let &Opcode::Iadd = pattern5_0 { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - if let Some(pattern8_0) = C::def_inst(ctx, pattern7_0) { - let pattern9_0 = C::inst_data(ctx, pattern8_0); - if let &InstructionData::UnaryImm { - opcode: ref pattern10_0, - imm: pattern10_1, - } = &pattern9_0 - { - if let &Opcode::Iconst = pattern10_0 { - let pattern12_0 = C::u64_from_imm64(ctx, pattern10_1); - if let Some(pattern13_0) = C::imm12_from_u64(ctx, pattern12_0) { - // Rule at src/isa/aarch64/lower.isle line 54. - let expr0_0 = C::put_in_reg(ctx, pattern7_1); - let expr1_0 = - constructor_add_imm(ctx, pattern3_0, expr0_0, pattern13_0); - let expr2_0 = constructor_output_reg(ctx, expr1_0); - return Some(expr2_0); - } - } - } - } - } - } - } - if let Some(pattern3_0) = C::ty_float_or_vec(ctx, pattern2_0) { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::LoadNoOffset { - opcode: ref pattern5_0, - arg: pattern5_1, - flags: pattern5_2, - } = &pattern4_0 - { - if let &Opcode::Bitcast = pattern5_0 { - let pattern7_0 = C::value_type(ctx, pattern5_1); - if let Some(pattern8_0) = C::ty_float_or_vec(ctx, pattern7_0) { - // Rule at src/isa/aarch64/lower.isle line 2281. - let expr0_0 = constructor_output_value(ctx, pattern5_1); - return Some(expr0_0); - } - } - } - } - } - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::first_result(ctx, pattern0_0) { - let pattern2_0 = C::value_type(ctx, pattern1_0); - if let Some((pattern3_0, pattern3_1)) = C::multi_lane(ctx, pattern2_0) { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::FloatCompare { - opcode: ref pattern5_0, - args: ref pattern5_1, - cond: ref pattern5_2, - } = &pattern4_0 - { - if let &Opcode::Fcmp = pattern5_0 { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - if let Some(pattern8_0) = C::fcmp_zero_cond_not_eq(ctx, pattern5_2) { - let mut closure9 = || { - let expr0_0 = C::zero_value(ctx, pattern7_1)?; - return Some(expr0_0); - }; - if let Some(pattern9_0) = closure9() { - // Rule at src/isa/aarch64/lower.isle line 1668. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = constructor_vector_size(ctx, pattern2_0); - let expr2_0 = constructor_fcmeq0(ctx, expr0_0, &expr1_0); - let expr3_0 = constructor_not(ctx, expr2_0, &expr1_0); - let expr4_0 = C::value_reg(ctx, expr3_0); - let expr5_0 = C::output(ctx, expr4_0); - return Some(expr5_0); - } - } - } - } - } - if let Some(pattern3_0) = C::fits_in_64(ctx, pattern2_0) { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Binary { - opcode: ref pattern5_0, - args: ref pattern5_1, - } = &pattern4_0 - { - if let &Opcode::Iadd = pattern5_0 { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - if let Some(pattern8_0) = C::def_inst(ctx, pattern7_1) { - let pattern9_0 = C::inst_data(ctx, pattern8_0); - if let &InstructionData::UnaryImm { - opcode: ref pattern10_0, - imm: pattern10_1, - } = &pattern9_0 - { - if let &Opcode::Iconst = pattern10_0 { - let pattern12_0 = C::u64_from_imm64(ctx, pattern10_1); - if let Some(pattern13_0) = C::imm12_from_u64(ctx, pattern12_0) { - // Rule at src/isa/aarch64/lower.isle line 51. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = - constructor_add_imm(ctx, pattern3_0, expr0_0, pattern13_0); - let expr2_0 = constructor_output_reg(ctx, expr1_0); - return Some(expr2_0); - } - } - } - } - } - } - } - if let Some(pattern3_0) = C::ty_float_or_vec(ctx, pattern2_0) { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::LoadNoOffset { - opcode: ref pattern5_0, - arg: pattern5_1, - flags: pattern5_2, - } = &pattern4_0 - { - if let &Opcode::Bitcast = pattern5_0 { - let pattern7_0 = C::value_type(ctx, pattern5_1); - let mut closure8 = || { - let expr0_0 = C::ty_int_ref_scalar_64(ctx, pattern7_0)?; - return Some(expr0_0); - }; - if let Some(pattern8_0) = closure8() { - // Rule at src/isa/aarch64/lower.isle line 2285. - let expr0_0 = C::put_in_reg(ctx, pattern5_1); - let expr1_0 = constructor_scalar_size(ctx, pattern7_0); - let expr2_0 = constructor_mov_to_fpu(ctx, expr0_0, &expr1_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - } - } - } - } - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::first_result(ctx, pattern0_0) { - let pattern2_0 = C::value_type(ctx, pattern1_0); - if let Some((pattern3_0, pattern3_1)) = C::multi_lane(ctx, pattern2_0) { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - match &pattern4_0 { - &InstructionData::FloatCompare { - opcode: ref pattern5_0, - args: ref pattern5_1, - cond: ref pattern5_2, - } => { - if let &Opcode::Fcmp = pattern5_0 { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - if let Some(pattern8_0) = C::fcmp_zero_cond(ctx, pattern5_2) { - let mut closure9 = || { - let expr0_0 = C::zero_value(ctx, pattern7_1)?; - return Some(expr0_0); - }; - if let Some(pattern9_0) = closure9() { - // Rule at src/isa/aarch64/lower.isle line 1674. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = constructor_vector_size(ctx, pattern2_0); - let expr2_0 = - constructor_float_cmp_zero(ctx, &pattern8_0, expr0_0, &expr1_0); - let expr3_0 = C::value_reg(ctx, expr2_0); - let expr4_0 = C::output(ctx, expr3_0); - return Some(expr4_0); - } - } - } - } - &InstructionData::IntCompare { - opcode: ref pattern5_0, - args: ref pattern5_1, - cond: ref pattern5_2, - } => { - if let &Opcode::Icmp = pattern5_0 { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - if let Some(pattern8_0) = C::icmp_zero_cond_not_eq(ctx, pattern5_2) { - let mut closure9 = || { - let expr0_0 = C::zero_value(ctx, pattern7_1)?; - return Some(expr0_0); - }; - if let Some(pattern9_0) = closure9() { - // Rule at src/isa/aarch64/lower.isle line 1703. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = constructor_vector_size(ctx, pattern2_0); - let expr2_0 = constructor_cmeq0(ctx, expr0_0, &expr1_0); - let expr3_0 = constructor_not(ctx, expr2_0, &expr1_0); - let expr4_0 = C::value_reg(ctx, expr3_0); - let expr5_0 = C::output(ctx, expr4_0); - return Some(expr5_0); - } - } - } - } - _ => {} - } - } - if let Some(pattern3_0) = C::fits_in_64(ctx, pattern2_0) { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Binary { - opcode: ref pattern5_0, - args: ref pattern5_1, - } = &pattern4_0 - { - if let &Opcode::Iadd = pattern5_0 { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - if let Some(pattern8_0) = C::def_inst(ctx, pattern7_0) { - let pattern9_0 = C::inst_data(ctx, pattern8_0); - if let &InstructionData::UnaryImm { - opcode: ref pattern10_0, - imm: pattern10_1, - } = &pattern9_0 - { - if let &Opcode::Iconst = pattern10_0 { - let pattern12_0 = C::u64_from_imm64(ctx, pattern10_1); - if let Some(pattern13_0) = - C::imm12_from_negated_u64(ctx, pattern12_0) - { - // Rule at src/isa/aarch64/lower.isle line 62. - let expr0_0 = C::put_in_reg(ctx, pattern7_1); - let expr1_0 = - constructor_sub_imm(ctx, pattern3_0, expr0_0, pattern13_0); - let expr2_0 = constructor_output_reg(ctx, expr1_0); - return Some(expr2_0); - } - } - } - } - } - } - } - let pattern3_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::LoadNoOffset { - opcode: ref pattern4_0, - arg: pattern4_1, - flags: pattern4_2, - } = &pattern3_0 - { - if let &Opcode::Bitcast = pattern4_0 { - let pattern6_0 = C::value_type(ctx, pattern4_1); - if let Some(pattern7_0) = C::fits_in_64(ctx, pattern6_0) { - if let Some(pattern8_0) = C::ty_float_or_vec(ctx, pattern7_0) { - let mut closure9 = || { - let expr0_0 = C::ty_int_ref_scalar_64(ctx, pattern2_0)?; - return Some(expr0_0); - }; - if let Some(pattern9_0) = closure9() { - // Rule at src/isa/aarch64/lower.isle line 2290. - let expr0_0 = C::put_in_reg(ctx, pattern4_1); - let expr1_0: u8 = 0i128 as u8; - let expr2_0 = constructor_scalar_size(ctx, pattern2_0); - let expr3_0 = constructor_mov_from_vec(ctx, expr0_0, expr1_0, &expr2_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - } - } - } - } - } - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::first_result(ctx, pattern0_0) { - let pattern2_0 = C::value_type(ctx, pattern1_0); - if pattern2_0 == I64 { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Unary { - opcode: ref pattern5_0, - arg: pattern5_1, - } = &pattern4_0 - { - if let &Opcode::Iabs = pattern5_0 { - // Rule at src/isa/aarch64/lower.isle line 227. - let expr0_0 = OperandSize::Size64; - let expr1_0 = C::put_in_reg(ctx, pattern5_1); - let expr2_0 = constructor_abs(ctx, &expr0_0, expr1_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - } - } - if pattern2_0 == I128 { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Unary { - opcode: ref pattern5_0, - arg: pattern5_1, - } = &pattern4_0 - { - if let &Opcode::Ineg = pattern5_0 { - // Rule at src/isa/aarch64/lower.isle line 583. - let expr0_0 = constructor_value_regs_zero(ctx); - let expr1_0 = C::put_in_regs(ctx, pattern5_1); - let expr2_0 = constructor_sub_i128(ctx, expr0_0, expr1_0); - let expr3_0 = C::output(ctx, expr2_0); - return Some(expr3_0); - } - } - } - if let Some((pattern3_0, pattern3_1)) = C::multi_lane(ctx, pattern2_0) { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - match &pattern4_0 { - &InstructionData::FloatCompare { - opcode: ref pattern5_0, - args: ref pattern5_1, - cond: ref pattern5_2, - } => { - if let &Opcode::Fcmp = pattern5_0 { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - if let Some(pattern8_0) = C::fcmp_zero_cond_not_eq(ctx, pattern5_2) { - let mut closure9 = || { - let expr0_0 = C::zero_value(ctx, pattern7_0)?; - return Some(expr0_0); - }; - if let Some(pattern9_0) = closure9() { - // Rule at src/isa/aarch64/lower.isle line 1680. - let expr0_0 = C::put_in_reg(ctx, pattern7_1); - let expr1_0 = constructor_vector_size(ctx, pattern2_0); - let expr2_0 = constructor_fcmeq0(ctx, expr0_0, &expr1_0); - let expr3_0 = constructor_not(ctx, expr2_0, &expr1_0); - let expr4_0 = C::value_reg(ctx, expr3_0); - let expr5_0 = C::output(ctx, expr4_0); - return Some(expr5_0); - } - } - } - } - &InstructionData::IntCompare { - opcode: ref pattern5_0, - args: ref pattern5_1, - cond: ref pattern5_2, - } => { - if let &Opcode::Icmp = pattern5_0 { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - if let Some(pattern8_0) = C::icmp_zero_cond(ctx, pattern5_2) { - let mut closure9 = || { - let expr0_0 = C::zero_value(ctx, pattern7_1)?; - return Some(expr0_0); - }; - if let Some(pattern9_0) = closure9() { - // Rule at src/isa/aarch64/lower.isle line 1709. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = constructor_vector_size(ctx, pattern2_0); - let expr2_0 = - constructor_int_cmp_zero(ctx, &pattern8_0, expr0_0, &expr1_0); - let expr3_0 = C::value_reg(ctx, expr2_0); - let expr4_0 = C::output(ctx, expr3_0); - return Some(expr4_0); - } - } - } - } - _ => {} - } - } - if let Some(pattern3_0) = C::fits_in_64(ctx, pattern2_0) { - if let Some(pattern4_0) = C::ty_int(ctx, pattern2_0) { - let pattern5_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Binary { - opcode: ref pattern6_0, - args: ref pattern6_1, - } = &pattern5_0 - { - match pattern6_0 { - &Opcode::Smin => { - let (pattern8_0, pattern8_1) = C::unpack_value_array_2(ctx, pattern6_1); - // Rule at src/isa/aarch64/lower.isle line 911. - let expr0_0 = Cond::Lt; - let expr1_0: bool = true; - let expr2_0 = constructor_cmp_and_choose( - ctx, pattern3_0, &expr0_0, expr1_0, pattern8_0, pattern8_1, - ); - let expr3_0 = C::output(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::Umin => { - let (pattern8_0, pattern8_1) = C::unpack_value_array_2(ctx, pattern6_1); - // Rule at src/isa/aarch64/lower.isle line 909. - let expr0_0 = Cond::Lo; - let expr1_0: bool = false; - let expr2_0 = constructor_cmp_and_choose( - ctx, pattern3_0, &expr0_0, expr1_0, pattern8_0, pattern8_1, - ); - let expr3_0 = C::output(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::Smax => { - let (pattern8_0, pattern8_1) = C::unpack_value_array_2(ctx, pattern6_1); - // Rule at src/isa/aarch64/lower.isle line 915. - let expr0_0 = Cond::Gt; - let expr1_0: bool = true; - let expr2_0 = constructor_cmp_and_choose( - ctx, pattern3_0, &expr0_0, expr1_0, pattern8_0, pattern8_1, - ); - let expr3_0 = C::output(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::Umax => { - let (pattern8_0, pattern8_1) = C::unpack_value_array_2(ctx, pattern6_1); - // Rule at src/isa/aarch64/lower.isle line 913. - let expr0_0 = Cond::Hi; - let expr1_0: bool = false; - let expr2_0 = constructor_cmp_and_choose( - ctx, pattern3_0, &expr0_0, expr1_0, pattern8_0, pattern8_1, - ); - let expr3_0 = C::output(ctx, expr2_0); - return Some(expr3_0); - } - _ => {} - } - } - } - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Binary { - opcode: ref pattern5_0, - args: ref pattern5_1, - } = &pattern4_0 - { - match pattern5_0 { - &Opcode::Iadd => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - if let Some(pattern8_0) = C::def_inst(ctx, pattern7_1) { - let pattern9_0 = C::inst_data(ctx, pattern8_0); - if let &InstructionData::UnaryImm { - opcode: ref pattern10_0, - imm: pattern10_1, - } = &pattern9_0 - { - if let &Opcode::Iconst = pattern10_0 { - let pattern12_0 = C::u64_from_imm64(ctx, pattern10_1); - if let Some(pattern13_0) = - C::imm12_from_negated_u64(ctx, pattern12_0) - { - // Rule at src/isa/aarch64/lower.isle line 59. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = constructor_sub_imm( - ctx, - pattern3_0, - expr0_0, - pattern13_0, - ); - let expr2_0 = constructor_output_reg(ctx, expr1_0); - return Some(expr2_0); - } - } - } - } - } - &Opcode::Isub => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - if let Some(pattern8_0) = C::def_inst(ctx, pattern7_1) { - let pattern9_0 = C::inst_data(ctx, pattern8_0); - if let &InstructionData::UnaryImm { - opcode: ref pattern10_0, - imm: pattern10_1, - } = &pattern9_0 - { - if let &Opcode::Iconst = pattern10_0 { - let pattern12_0 = C::u64_from_imm64(ctx, pattern10_1); - if let Some(pattern13_0) = - C::imm12_from_negated_u64(ctx, pattern12_0) - { - // Rule at src/isa/aarch64/lower.isle line 533. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = constructor_add_imm( - ctx, - pattern3_0, - expr0_0, - pattern13_0, - ); - let expr2_0 = constructor_output_reg(ctx, expr1_0); - return Some(expr2_0); - } - } - } - } - } - _ => {} - } - } - } - if let Some(pattern3_0) = C::ty_scalar_float(ctx, pattern2_0) { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::BinaryImm8 { - opcode: ref pattern5_0, - arg: pattern5_1, - imm: pattern5_2, - } = &pattern4_0 - { - if let &Opcode::Extractlane = pattern5_0 { - let pattern7_0 = C::u8_from_uimm8(ctx, pattern5_2); - if pattern7_0 == 0i128 as u8 { - // Rule at src/isa/aarch64/lower.isle line 2305. - let expr0_0 = constructor_output_value(ctx, pattern5_1); - return Some(expr0_0); - } - } - } - } - if let Some(pattern3_0) = C::ty_vec64_int(ctx, pattern2_0) { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Binary { - opcode: ref pattern5_0, - args: ref pattern5_1, - } = &pattern4_0 - { - match pattern5_0 { - &Opcode::Snarrow => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 1963. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = C::put_in_reg(ctx, pattern7_1); - let expr2_0: u8 = 1i128 as u8; - let expr3_0: u8 = 0i128 as u8; - let expr4_0 = VectorSize::Size64x2; - let expr5_0 = constructor_mov_vec_elem( - ctx, expr0_0, expr1_0, expr2_0, expr3_0, &expr4_0, - ); - let expr6_0 = constructor_lane_size(ctx, pattern3_0); - let expr7_0 = constructor_sqxtn(ctx, expr5_0, &expr6_0); - let expr8_0 = constructor_output_reg(ctx, expr7_0); - return Some(expr8_0); - } - &Opcode::Unarrow => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 1978. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = C::put_in_reg(ctx, pattern7_1); - let expr2_0: u8 = 1i128 as u8; - let expr3_0: u8 = 0i128 as u8; - let expr4_0 = VectorSize::Size64x2; - let expr5_0 = constructor_mov_vec_elem( - ctx, expr0_0, expr1_0, expr2_0, expr3_0, &expr4_0, - ); - let expr6_0 = constructor_lane_size(ctx, pattern3_0); - let expr7_0 = constructor_sqxtun(ctx, expr5_0, &expr6_0); - let expr8_0 = constructor_output_reg(ctx, expr7_0); - return Some(expr8_0); - } - &Opcode::Uunarrow => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 1994. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = C::put_in_reg(ctx, pattern7_1); - let expr2_0: u8 = 1i128 as u8; - let expr3_0: u8 = 0i128 as u8; - let expr4_0 = VectorSize::Size64x2; - let expr5_0 = constructor_mov_vec_elem( - ctx, expr0_0, expr1_0, expr2_0, expr3_0, &expr4_0, - ); - let expr6_0 = constructor_lane_size(ctx, pattern3_0); - let expr7_0 = constructor_uqxtn(ctx, expr5_0, &expr6_0); - let expr8_0 = constructor_output_reg(ctx, expr7_0); - return Some(expr8_0); - } - _ => {} - } - } - } - let pattern3_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::LoadNoOffset { - opcode: ref pattern4_0, - arg: pattern4_1, - flags: pattern4_2, - } = &pattern3_0 - { - if let &Opcode::Bitcast = pattern4_0 { - let pattern6_0 = C::value_type(ctx, pattern4_1); - let mut closure7 = || { - let expr0_0 = C::ty_int_ref_scalar_64(ctx, pattern2_0)?; - return Some(expr0_0); - }; - if let Some(pattern7_0) = closure7() { - let mut closure8 = || { - let expr0_0 = C::ty_int_ref_scalar_64(ctx, pattern6_0)?; - return Some(expr0_0); - }; - if let Some(pattern8_0) = closure8() { - // Rule at src/isa/aarch64/lower.isle line 2295. - let expr0_0 = constructor_output_value(ctx, pattern4_1); - return Some(expr0_0); - } - } - } - } - } - let pattern0_0 = arg0; - if let Some(()) = C::use_lse(ctx, pattern0_0) { - if let Some(pattern2_0) = C::first_result(ctx, pattern0_0) { - let pattern3_0 = C::value_type(ctx, pattern2_0); - if let Some(pattern4_0) = C::valid_atomic_transaction(ctx, pattern3_0) { - let pattern5_0 = C::inst_data(ctx, pattern0_0); - match &pattern5_0 { - &InstructionData::AtomicRmw { - opcode: ref pattern6_0, - args: ref pattern6_1, - flags: pattern6_2, - op: ref pattern6_3, - } => { - if let &Opcode::AtomicRmw = pattern6_0 { - let (pattern8_0, pattern8_1) = C::unpack_value_array_2(ctx, pattern6_1); - match pattern6_3 { - &AtomicRmwOp::Add => { - // Rule at src/isa/aarch64/lower.isle line 1871. - let expr0_0 = AtomicRMWOp::Add; - let expr1_0 = C::put_in_reg(ctx, pattern8_1); - let expr2_0 = constructor_lse_atomic_rmw( - ctx, &expr0_0, pattern8_0, expr1_0, pattern4_0, pattern6_2, - ); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - &AtomicRmwOp::And => { - // Rule at src/isa/aarch64/lower.isle line 1903. - let expr0_0 = AtomicRMWOp::Clr; - let expr1_0 = C::put_in_reg(ctx, pattern8_1); - let expr2_0 = C::zero_reg(ctx); - let expr3_0 = - constructor_eon(ctx, pattern4_0, expr1_0, expr2_0); - let expr4_0 = constructor_lse_atomic_rmw( - ctx, &expr0_0, pattern8_0, expr3_0, pattern4_0, pattern6_2, - ); - let expr5_0 = constructor_output_reg(ctx, expr4_0); - return Some(expr5_0); - } - &AtomicRmwOp::Or => { - // Rule at src/isa/aarch64/lower.isle line 1879. - let expr0_0 = AtomicRMWOp::Set; - let expr1_0 = C::put_in_reg(ctx, pattern8_1); - let expr2_0 = constructor_lse_atomic_rmw( - ctx, &expr0_0, pattern8_0, expr1_0, pattern4_0, pattern6_2, - ); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - &AtomicRmwOp::Smax => { - // Rule at src/isa/aarch64/lower.isle line 1883. - let expr0_0 = AtomicRMWOp::Smax; - let expr1_0 = C::put_in_reg(ctx, pattern8_1); - let expr2_0 = constructor_lse_atomic_rmw( - ctx, &expr0_0, pattern8_0, expr1_0, pattern4_0, pattern6_2, - ); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - &AtomicRmwOp::Smin => { - // Rule at src/isa/aarch64/lower.isle line 1887. - let expr0_0 = AtomicRMWOp::Smin; - let expr1_0 = C::put_in_reg(ctx, pattern8_1); - let expr2_0 = constructor_lse_atomic_rmw( - ctx, &expr0_0, pattern8_0, expr1_0, pattern4_0, pattern6_2, - ); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - &AtomicRmwOp::Sub => { - // Rule at src/isa/aarch64/lower.isle line 1899. - let expr0_0 = AtomicRMWOp::Add; - let expr1_0 = C::zero_reg(ctx); - let expr2_0 = C::put_in_reg(ctx, pattern8_1); - let expr3_0 = - constructor_sub(ctx, pattern4_0, expr1_0, expr2_0); - let expr4_0 = constructor_lse_atomic_rmw( - ctx, &expr0_0, pattern8_0, expr3_0, pattern4_0, pattern6_2, - ); - let expr5_0 = constructor_output_reg(ctx, expr4_0); - return Some(expr5_0); - } - &AtomicRmwOp::Umax => { - // Rule at src/isa/aarch64/lower.isle line 1891. - let expr0_0 = AtomicRMWOp::Umax; - let expr1_0 = C::put_in_reg(ctx, pattern8_1); - let expr2_0 = constructor_lse_atomic_rmw( - ctx, &expr0_0, pattern8_0, expr1_0, pattern4_0, pattern6_2, - ); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - &AtomicRmwOp::Umin => { - // Rule at src/isa/aarch64/lower.isle line 1895. - let expr0_0 = AtomicRMWOp::Umin; - let expr1_0 = C::put_in_reg(ctx, pattern8_1); - let expr2_0 = constructor_lse_atomic_rmw( - ctx, &expr0_0, pattern8_0, expr1_0, pattern4_0, pattern6_2, - ); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - &AtomicRmwOp::Xor => { - // Rule at src/isa/aarch64/lower.isle line 1875. - let expr0_0 = AtomicRMWOp::Eor; - let expr1_0 = C::put_in_reg(ctx, pattern8_1); - let expr2_0 = constructor_lse_atomic_rmw( - ctx, &expr0_0, pattern8_0, expr1_0, pattern4_0, pattern6_2, - ); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - _ => {} - } - } - } - &InstructionData::AtomicCas { - opcode: ref pattern6_0, - args: ref pattern6_1, - flags: pattern6_2, - } => { - if let &Opcode::AtomicCas = pattern6_0 { - let (pattern8_0, pattern8_1, pattern8_2) = - C::unpack_value_array_3(ctx, pattern6_1); - // Rule at src/isa/aarch64/lower.isle line 1944. - let expr0_0 = C::put_in_reg(ctx, pattern8_0); - let expr1_0 = C::put_in_reg(ctx, pattern8_1); - let expr2_0 = C::put_in_reg(ctx, pattern8_2); - let expr3_0 = constructor_lse_atomic_cas( - ctx, expr0_0, expr1_0, expr2_0, pattern4_0, pattern6_2, - ); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - } - _ => {} - } - } - } - } - if let Some(pattern1_0) = C::first_result(ctx, pattern0_0) { - let pattern2_0 = C::value_type(ctx, pattern1_0); - if pattern2_0 == I32 { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Binary { - opcode: ref pattern5_0, - args: ref pattern5_1, - } = &pattern4_0 - { - if let &Opcode::Rotl = pattern5_0 { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - if let Some(pattern8_0) = C::def_inst(ctx, pattern7_1) { - let pattern9_0 = C::inst_data(ctx, pattern8_0); - if let &InstructionData::UnaryImm { - opcode: ref pattern10_0, - imm: pattern10_1, - } = &pattern9_0 - { - if let &Opcode::Iconst = pattern10_0 { - let mut closure12 = || { - let expr0_0: Type = I32; - let expr1_0 = - C::imm_shift_from_imm64(ctx, expr0_0, pattern10_1)?; - return Some(expr1_0); - }; - if let Some(pattern12_0) = closure12() { - // Rule at src/isa/aarch64/lower.isle line 1347. - let expr0_0: Type = I32; - let expr1_0 = C::put_in_reg(ctx, pattern7_0); - let expr2_0: Type = I32; - let expr3_0 = C::negate_imm_shift(ctx, expr2_0, pattern12_0); - let expr4_0 = - constructor_a64_rotr_imm(ctx, expr0_0, expr1_0, expr3_0); - let expr5_0 = constructor_output_reg(ctx, expr4_0); - return Some(expr5_0); - } - } - } - } - } - } - } - if pattern2_0 == I64 { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - match &pattern4_0 { - &InstructionData::Unary { - opcode: ref pattern5_0, - arg: pattern5_1, - } => { - match pattern5_0 { - &Opcode::FcvtToUint => { - let pattern7_0 = C::value_type(ctx, pattern5_1); - if pattern7_0 == F32 { - // Rule at src/isa/aarch64/lower.isle line 416. - let expr0_0 = FpuToIntOp::F32ToU64; - let expr1_0 = C::put_in_reg(ctx, pattern5_1); - let expr2_0: bool = false; - let expr3_0: Type = F32; - let expr4_0: Type = I64; - let expr5_0 = constructor_fpu_to_int_cvt( - ctx, &expr0_0, expr1_0, expr2_0, expr3_0, expr4_0, - ); - let expr6_0 = constructor_output_reg(ctx, expr5_0); - return Some(expr6_0); - } - if pattern7_0 == F64 { - // Rule at src/isa/aarch64/lower.isle line 422. - let expr0_0 = FpuToIntOp::F64ToU64; - let expr1_0 = C::put_in_reg(ctx, pattern5_1); - let expr2_0: bool = false; - let expr3_0: Type = F64; - let expr4_0: Type = I64; - let expr5_0 = constructor_fpu_to_int_cvt( - ctx, &expr0_0, expr1_0, expr2_0, expr3_0, expr4_0, - ); - let expr6_0 = constructor_output_reg(ctx, expr5_0); - return Some(expr6_0); - } - } - &Opcode::FcvtToSint => { - let pattern7_0 = C::value_type(ctx, pattern5_1); - if pattern7_0 == F32 { - // Rule at src/isa/aarch64/lower.isle line 430. - let expr0_0 = FpuToIntOp::F32ToI64; - let expr1_0 = C::put_in_reg(ctx, pattern5_1); - let expr2_0: bool = true; - let expr3_0: Type = F32; - let expr4_0: Type = I64; - let expr5_0 = constructor_fpu_to_int_cvt( - ctx, &expr0_0, expr1_0, expr2_0, expr3_0, expr4_0, - ); - let expr6_0 = constructor_output_reg(ctx, expr5_0); - return Some(expr6_0); - } - if pattern7_0 == F64 { - // Rule at src/isa/aarch64/lower.isle line 436. - let expr0_0 = FpuToIntOp::F64ToI64; - let expr1_0 = C::put_in_reg(ctx, pattern5_1); - let expr2_0: bool = true; - let expr3_0: Type = F64; - let expr4_0: Type = I64; - let expr5_0 = constructor_fpu_to_int_cvt( - ctx, &expr0_0, expr1_0, expr2_0, expr3_0, expr4_0, - ); - let expr6_0 = constructor_output_reg(ctx, expr5_0); - return Some(expr6_0); - } - } - &Opcode::FcvtToUintSat => { - let pattern7_0 = C::value_type(ctx, pattern5_1); - if pattern7_0 == F32 { - // Rule at src/isa/aarch64/lower.isle line 490. - let expr0_0 = FpuToIntOp::F32ToU64; - let expr1_0 = C::put_in_reg(ctx, pattern5_1); - let expr2_0: bool = false; - let expr3_0: Type = I64; - let expr4_0 = constructor_fpu_to_int_cvt_sat( - ctx, &expr0_0, expr1_0, expr2_0, expr3_0, - ); - let expr5_0 = constructor_output_reg(ctx, expr4_0); - return Some(expr5_0); - } - if pattern7_0 == F64 { - // Rule at src/isa/aarch64/lower.isle line 496. - let expr0_0 = FpuToIntOp::F64ToU64; - let expr1_0 = C::put_in_reg(ctx, pattern5_1); - let expr2_0: bool = false; - let expr3_0: Type = I64; - let expr4_0 = constructor_fpu_to_int_cvt_sat( - ctx, &expr0_0, expr1_0, expr2_0, expr3_0, - ); - let expr5_0 = constructor_output_reg(ctx, expr4_0); - return Some(expr5_0); - } - } - &Opcode::FcvtToSintSat => { - let pattern7_0 = C::value_type(ctx, pattern5_1); - if pattern7_0 == F32 { - // Rule at src/isa/aarch64/lower.isle line 510. - let expr0_0 = FpuToIntOp::F32ToI64; - let expr1_0 = C::put_in_reg(ctx, pattern5_1); - let expr2_0: bool = true; - let expr3_0: Type = I64; - let expr4_0 = constructor_fpu_to_int_cvt_sat( - ctx, &expr0_0, expr1_0, expr2_0, expr3_0, - ); - let expr5_0 = constructor_output_reg(ctx, expr4_0); - return Some(expr5_0); - } - if pattern7_0 == F64 { - // Rule at src/isa/aarch64/lower.isle line 516. - let expr0_0 = FpuToIntOp::F64ToI64; - let expr1_0 = C::put_in_reg(ctx, pattern5_1); - let expr2_0: bool = true; - let expr3_0: Type = I64; - let expr4_0 = constructor_fpu_to_int_cvt_sat( - ctx, &expr0_0, expr1_0, expr2_0, expr3_0, - ); - let expr5_0 = constructor_output_reg(ctx, expr4_0); - return Some(expr5_0); - } - } - _ => {} - } - } - &InstructionData::Binary { - opcode: ref pattern5_0, - args: ref pattern5_1, - } => { - match pattern5_0 { - &Opcode::Umulhi => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 781. - let expr0_0: Type = I64; - let expr1_0 = C::put_in_reg(ctx, pattern7_0); - let expr2_0 = C::put_in_reg(ctx, pattern7_1); - let expr3_0 = constructor_umulh(ctx, expr0_0, expr1_0, expr2_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - &Opcode::Smulhi => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 769. - let expr0_0: Type = I64; - let expr1_0 = C::put_in_reg(ctx, pattern7_0); - let expr2_0 = C::put_in_reg(ctx, pattern7_1); - let expr3_0 = constructor_smulh(ctx, expr0_0, expr1_0, expr2_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - &Opcode::Rotl => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - if let Some(pattern8_0) = C::def_inst(ctx, pattern7_1) { - let pattern9_0 = C::inst_data(ctx, pattern8_0); - if let &InstructionData::UnaryImm { - opcode: ref pattern10_0, - imm: pattern10_1, - } = &pattern9_0 - { - if let &Opcode::Iconst = pattern10_0 { - let mut closure12 = || { - let expr0_0: Type = I64; - let expr1_0 = - C::imm_shift_from_imm64(ctx, expr0_0, pattern10_1)?; - return Some(expr1_0); - }; - if let Some(pattern12_0) = closure12() { - // Rule at src/isa/aarch64/lower.isle line 1352. - let expr0_0: Type = I64; - let expr1_0 = C::put_in_reg(ctx, pattern7_0); - let expr2_0: Type = I64; - let expr3_0 = - C::negate_imm_shift(ctx, expr2_0, pattern12_0); - let expr4_0 = constructor_a64_rotr_imm( - ctx, expr0_0, expr1_0, expr3_0, - ); - let expr5_0 = constructor_output_reg(ctx, expr4_0); - return Some(expr5_0); - } - } - } - } - } - _ => {} - } - } - _ => {} - } - } - if pattern2_0 == I128 { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::LoadNoOffset { - opcode: ref pattern5_0, - arg: pattern5_1, - flags: pattern5_2, - } = &pattern4_0 - { - if let &Opcode::Bitcast = pattern5_0 { - let pattern7_0 = C::value_type(ctx, pattern5_1); - if pattern7_0 == I128 { - // Rule at src/isa/aarch64/lower.isle line 2299. - let expr0_0 = constructor_output_value(ctx, pattern5_1); - return Some(expr0_0); - } - } - } - } - if pattern2_0 == F32 { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Unary { - opcode: ref pattern5_0, - arg: pattern5_1, - } = &pattern4_0 - { - match pattern5_0 { - &Opcode::FcvtFromUint => { - let pattern7_0 = C::value_type(ctx, pattern5_1); - if pattern7_0 == I64 { - // Rule at src/isa/aarch64/lower.isle line 453. - let expr0_0 = IntToFpuOp::U64ToF32; - let expr1_0 = C::put_in_reg(ctx, pattern5_1); - let expr2_0 = constructor_int_to_fpu(ctx, &expr0_0, expr1_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - } - &Opcode::FcvtFromSint => { - let pattern7_0 = C::value_type(ctx, pattern5_1); - if pattern7_0 == I64 { - // Rule at src/isa/aarch64/lower.isle line 473. - let expr0_0 = IntToFpuOp::I64ToF32; - let expr1_0 = C::put_in_reg(ctx, pattern5_1); - let expr2_0 = constructor_int_to_fpu(ctx, &expr0_0, expr1_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - } - _ => {} - } - } - } - if pattern2_0 == F64 { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Unary { - opcode: ref pattern5_0, - arg: pattern5_1, - } = &pattern4_0 - { - match pattern5_0 { - &Opcode::FcvtFromUint => { - let pattern7_0 = C::value_type(ctx, pattern5_1); - if pattern7_0 == I64 { - // Rule at src/isa/aarch64/lower.isle line 456. - let expr0_0 = IntToFpuOp::U64ToF64; - let expr1_0 = C::put_in_reg(ctx, pattern5_1); - let expr2_0 = constructor_int_to_fpu(ctx, &expr0_0, expr1_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - } - &Opcode::FcvtFromSint => { - let pattern7_0 = C::value_type(ctx, pattern5_1); - if pattern7_0 == I64 { - // Rule at src/isa/aarch64/lower.isle line 476. - let expr0_0 = IntToFpuOp::I64ToF64; - let expr1_0 = C::put_in_reg(ctx, pattern5_1); - let expr2_0 = constructor_int_to_fpu(ctx, &expr0_0, expr1_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - } - _ => {} - } - } - } - if pattern2_0 == I64X2 { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Binary { - opcode: ref pattern5_0, - args: ref pattern5_1, - } = &pattern4_0 - { - match pattern5_0 { - &Opcode::Smin => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 923. - let expr0_0: Type = I64X2; - let expr1_0 = VecALUOp::Cmgt; - let expr2_0 = C::put_in_reg(ctx, pattern7_1); - let expr3_0 = C::put_in_reg(ctx, pattern7_0); - let expr4_0 = VectorSize::Size64x2; - let expr5_0 = - constructor_vec_rrr(ctx, &expr1_0, expr2_0, expr3_0, &expr4_0); - let expr6_0 = C::put_in_reg(ctx, pattern7_0); - let expr7_0 = C::put_in_reg(ctx, pattern7_1); - let expr8_0 = constructor_bsl(ctx, expr0_0, expr5_0, expr6_0, expr7_0); - let expr9_0 = constructor_output_reg(ctx, expr8_0); - return Some(expr9_0); - } - &Opcode::Umin => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 929. - let expr0_0: Type = I64X2; - let expr1_0 = VecALUOp::Cmhi; - let expr2_0 = C::put_in_reg(ctx, pattern7_1); - let expr3_0 = C::put_in_reg(ctx, pattern7_0); - let expr4_0 = VectorSize::Size64x2; - let expr5_0 = - constructor_vec_rrr(ctx, &expr1_0, expr2_0, expr3_0, &expr4_0); - let expr6_0 = C::put_in_reg(ctx, pattern7_0); - let expr7_0 = C::put_in_reg(ctx, pattern7_1); - let expr8_0 = constructor_bsl(ctx, expr0_0, expr5_0, expr6_0, expr7_0); - let expr9_0 = constructor_output_reg(ctx, expr8_0); - return Some(expr9_0); - } - &Opcode::Smax => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 935. - let expr0_0: Type = I64X2; - let expr1_0 = VecALUOp::Cmgt; - let expr2_0 = C::put_in_reg(ctx, pattern7_0); - let expr3_0 = C::put_in_reg(ctx, pattern7_1); - let expr4_0 = VectorSize::Size64x2; - let expr5_0 = - constructor_vec_rrr(ctx, &expr1_0, expr2_0, expr3_0, &expr4_0); - let expr6_0 = C::put_in_reg(ctx, pattern7_0); - let expr7_0 = C::put_in_reg(ctx, pattern7_1); - let expr8_0 = constructor_bsl(ctx, expr0_0, expr5_0, expr6_0, expr7_0); - let expr9_0 = constructor_output_reg(ctx, expr8_0); - return Some(expr9_0); - } - &Opcode::Umax => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 941. - let expr0_0: Type = I64X2; - let expr1_0 = VecALUOp::Cmhi; - let expr2_0 = C::put_in_reg(ctx, pattern7_0); - let expr3_0 = C::put_in_reg(ctx, pattern7_1); - let expr4_0 = VectorSize::Size64x2; - let expr5_0 = - constructor_vec_rrr(ctx, &expr1_0, expr2_0, expr3_0, &expr4_0); - let expr6_0 = C::put_in_reg(ctx, pattern7_0); - let expr7_0 = C::put_in_reg(ctx, pattern7_1); - let expr8_0 = constructor_bsl(ctx, expr0_0, expr5_0, expr6_0, expr7_0); - let expr9_0 = constructor_output_reg(ctx, expr8_0); - return Some(expr9_0); - } - _ => {} - } - } - } - if let Some((pattern3_0, pattern3_1)) = C::multi_lane(ctx, pattern2_0) { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - match &pattern4_0 { - &InstructionData::FloatCompare { - opcode: ref pattern5_0, - args: ref pattern5_1, - cond: ref pattern5_2, - } => { - if let &Opcode::Fcmp = pattern5_0 { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - if let Some(pattern8_0) = C::fcmp_zero_cond(ctx, pattern5_2) { - let mut closure9 = || { - let expr0_0 = C::zero_value(ctx, pattern7_0)?; - return Some(expr0_0); - }; - if let Some(pattern9_0) = closure9() { - // Rule at src/isa/aarch64/lower.isle line 1686. - let expr0_0 = C::put_in_reg(ctx, pattern7_1); - let expr1_0 = constructor_vector_size(ctx, pattern2_0); - let expr2_0 = constructor_float_cmp_zero_swap( - ctx, - &pattern8_0, - expr0_0, - &expr1_0, - ); - let expr3_0 = C::value_reg(ctx, expr2_0); - let expr4_0 = C::output(ctx, expr3_0); - return Some(expr4_0); - } - } - } - } - &InstructionData::IntCompare { - opcode: ref pattern5_0, - args: ref pattern5_1, - cond: ref pattern5_2, - } => { - if let &Opcode::Icmp = pattern5_0 { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - if let Some(pattern8_0) = C::icmp_zero_cond_not_eq(ctx, pattern5_2) { - let mut closure9 = || { - let expr0_0 = C::zero_value(ctx, pattern7_0)?; - return Some(expr0_0); - }; - if let Some(pattern9_0) = closure9() { - // Rule at src/isa/aarch64/lower.isle line 1715. - let expr0_0 = C::put_in_reg(ctx, pattern7_1); - let expr1_0 = constructor_vector_size(ctx, pattern2_0); - let expr2_0 = constructor_cmeq0(ctx, expr0_0, &expr1_0); - let expr3_0 = constructor_not(ctx, expr2_0, &expr1_0); - let expr4_0 = C::value_reg(ctx, expr3_0); - let expr5_0 = C::output(ctx, expr4_0); - return Some(expr5_0); - } - } - } - } - _ => {} - } - } - if let Some(pattern3_0) = C::fits_in_32(ctx, pattern2_0) { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Unary { - opcode: ref pattern5_0, - arg: pattern5_1, - } = &pattern4_0 - { - if let &Opcode::Iabs = pattern5_0 { - // Rule at src/isa/aarch64/lower.isle line 230. - let expr0_0 = OperandSize::Size32; - let expr1_0 = constructor_put_in_reg_sext32(ctx, pattern5_1); - let expr2_0 = constructor_abs(ctx, &expr0_0, expr1_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - } - } - if let Some(pattern3_0) = C::fits_in_64(ctx, pattern2_0) { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - match &pattern4_0 { - &InstructionData::Unary { - opcode: ref pattern5_0, - arg: pattern5_1, - } => { - match pattern5_0 { - &Opcode::Ineg => { - // Rule at src/isa/aarch64/lower.isle line 579. - let expr0_0 = C::zero_reg(ctx); - let expr1_0 = C::put_in_reg(ctx, pattern5_1); - let expr2_0 = constructor_sub(ctx, pattern3_0, expr0_0, expr1_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::Bnot => { - if let Some(pattern7_0) = C::def_inst(ctx, pattern5_1) { - let pattern8_0 = C::inst_data(ctx, pattern7_0); - if let &InstructionData::Binary { - opcode: ref pattern9_0, - args: ref pattern9_1, - } = &pattern8_0 - { - if let &Opcode::Ishl = pattern9_0 { - let (pattern11_0, pattern11_1) = - C::unpack_value_array_2(ctx, pattern9_1); - if let Some(pattern12_0) = C::def_inst(ctx, pattern11_1) { - let pattern13_0 = C::inst_data(ctx, pattern12_0); - if let &InstructionData::UnaryImm { - opcode: ref pattern14_0, - imm: pattern14_1, - } = &pattern13_0 - { - if let &Opcode::Iconst = pattern14_0 { - let mut closure16 = || { - let expr0_0 = C::lshl_from_imm64( - ctx, - pattern3_0, - pattern14_1, - )?; - return Some(expr0_0); - }; - if let Some(pattern16_0) = closure16() { - // Rule at src/isa/aarch64/lower.isle line 1037. - let expr0_0 = C::zero_reg(ctx); - let expr1_0 = - C::put_in_reg(ctx, pattern11_0); - let expr2_0 = constructor_orr_not_shift( - ctx, - pattern3_0, - expr0_0, - expr1_0, - pattern16_0, - ); - let expr3_0 = - constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - } - } - } - } - } - } - } - &Opcode::Uextend => { - if let Some(pattern7_0) = C::def_inst(ctx, pattern5_1) { - let pattern8_0 = C::inst_data(ctx, pattern7_0); - if let &InstructionData::BinaryImm8 { - opcode: ref pattern9_0, - arg: pattern9_1, - imm: pattern9_2, - } = &pattern8_0 - { - if let &Opcode::Extractlane = pattern9_0 { - let pattern11_0 = C::value_type(ctx, pattern9_1); - let pattern12_0 = C::u8_from_uimm8(ctx, pattern9_2); - // Rule at src/isa/aarch64/lower.isle line 953. - let expr0_0 = C::put_in_reg(ctx, pattern9_1); - let expr1_0 = constructor_lane_size(ctx, pattern11_0); - let expr2_0 = constructor_mov_from_vec( - ctx, - expr0_0, - pattern12_0, - &expr1_0, - ); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - } - } - let pattern7_0 = C::value_type(ctx, pattern5_1); - if let Some(pattern8_0) = C::def_inst(ctx, pattern5_1) { - let pattern9_0 = C::inst_data(ctx, pattern8_0); - if let &InstructionData::LoadNoOffset { - opcode: ref pattern10_0, - arg: pattern10_1, - flags: pattern10_2, - } = &pattern9_0 - { - if let &Opcode::AtomicLoad = pattern10_0 { - let mut closure12 = || { - let expr0_0 = C::is_sinkable_inst(ctx, pattern5_1)?; - return Some(expr0_0); - }; - if let Some(pattern12_0) = closure12() { - // Rule at src/isa/aarch64/lower.isle line 960. - let expr0_0 = - constructor_sink_atomic_load(ctx, pattern12_0); - let expr1_0 = constructor_load_acquire( - ctx, - pattern7_0, - pattern10_2, - expr0_0, - ); - let expr2_0 = constructor_output_reg(ctx, expr1_0); - return Some(expr2_0); - } - } - } - } - } - _ => {} - } - } - &InstructionData::Binary { - opcode: ref pattern5_0, - args: ref pattern5_1, - } => { - match pattern5_0 { - &Opcode::Iadd => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - if let Some(pattern8_0) = C::extended_value_from_value(ctx, pattern7_0) - { - // Rule at src/isa/aarch64/lower.isle line 70. - let expr0_0 = C::put_in_reg(ctx, pattern7_1); - let expr1_0 = - constructor_add_extend(ctx, pattern3_0, expr0_0, &pattern8_0); - let expr2_0 = constructor_output_reg(ctx, expr1_0); - return Some(expr2_0); - } - } - &Opcode::Isub => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - if let Some(pattern8_0) = C::extended_value_from_value(ctx, pattern7_1) - { - // Rule at src/isa/aarch64/lower.isle line 538. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = - constructor_sub_extend(ctx, pattern3_0, expr0_0, &pattern8_0); - let expr2_0 = constructor_output_reg(ctx, expr1_0); - return Some(expr2_0); - } - } - &Opcode::Sdiv => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - if let Some(pattern8_0) = C::def_inst(ctx, pattern7_1) { - let pattern9_0 = C::inst_data(ctx, pattern8_0); - if let &InstructionData::UnaryImm { - opcode: ref pattern10_0, - imm: pattern10_1, - } = &pattern9_0 - { - if let &Opcode::Iconst = pattern10_0 { - if let Some(pattern12_0) = - C::safe_divisor_from_imm64(ctx, pattern10_1) - { - // Rule at src/isa/aarch64/lower.isle line 846. - let expr0_0: Type = I64; - let expr1_0 = - constructor_put_in_reg_sext64(ctx, pattern7_0); - let expr2_0 = ImmExtend::Sign; - let expr3_0 = constructor_imm( - ctx, - pattern3_0, - &expr2_0, - pattern12_0, - ); - let expr4_0 = constructor_a64_sdiv( - ctx, expr0_0, expr1_0, expr3_0, - ); - let expr5_0 = constructor_output_reg(ctx, expr4_0); - return Some(expr5_0); - } - } - } - } - } - _ => {} - } - } - _ => {} - } - } - if let Some(pattern3_0) = C::ty_32_or_64(ctx, pattern2_0) { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Binary { - opcode: ref pattern5_0, - args: ref pattern5_1, - } = &pattern4_0 - { - if let &Opcode::IaddCout = pattern5_0 { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 2436. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = C::put_in_reg(ctx, pattern7_1); - let expr2_0 = - constructor_add_with_flags_paired(ctx, pattern3_0, expr0_0, expr1_0); - let expr3_0 = Cond::Vs; - let expr4_0 = constructor_cset_paired(ctx, &expr3_0); - let expr5_0 = constructor_with_flags(ctx, &expr2_0, &expr4_0); - let expr6_0: usize = 0i128 as usize; - let expr7_0 = C::value_regs_get(ctx, expr5_0, expr6_0); - let expr8_0 = C::value_reg(ctx, expr7_0); - let expr9_0: usize = 1i128 as usize; - let expr10_0 = C::value_regs_get(ctx, expr5_0, expr9_0); - let expr11_0 = C::value_reg(ctx, expr10_0); - let expr12_0 = C::output_pair(ctx, expr8_0, expr11_0); - return Some(expr12_0); - } - } - } - if let Some(pattern3_0) = C::ty_scalar_float(ctx, pattern2_0) { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - match &pattern4_0 { - &InstructionData::BinaryImm8 { - opcode: ref pattern5_0, - arg: pattern5_1, - imm: pattern5_2, - } => { - if let &Opcode::Extractlane = pattern5_0 { - let pattern7_0 = C::value_type(ctx, pattern5_1); - let pattern8_0 = C::u8_from_uimm8(ctx, pattern5_2); - // Rule at src/isa/aarch64/lower.isle line 2313. - let expr0_0 = C::put_in_reg(ctx, pattern5_1); - let expr1_0 = constructor_vector_size(ctx, pattern7_0); - let expr2_0 = - constructor_fpu_move_from_vec(ctx, expr0_0, pattern8_0, &expr1_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - } - &InstructionData::Ternary { - opcode: ref pattern5_0, - args: ref pattern5_1, - } => { - if let &Opcode::Fma = pattern5_0 { - let (pattern7_0, pattern7_1, pattern7_2) = - C::unpack_value_array_3(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 403. - let expr0_0 = FPUOp3::MAdd; - let expr1_0 = constructor_scalar_size(ctx, pattern3_0); - let expr2_0 = C::put_in_reg(ctx, pattern7_0); - let expr3_0 = C::put_in_reg(ctx, pattern7_1); - let expr4_0 = C::put_in_reg(ctx, pattern7_2); - let expr5_0 = constructor_fpu_rrrr( - ctx, &expr0_0, &expr1_0, expr2_0, expr3_0, expr4_0, - ); - let expr6_0 = constructor_output_reg(ctx, expr5_0); - return Some(expr6_0); - } - } - _ => {} - } - } - if let Some(pattern3_0) = C::ty_vec128(ctx, pattern2_0) { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - match &pattern4_0 { - &InstructionData::Unary { - opcode: ref pattern5_0, - arg: pattern5_1, - } => { - match pattern5_0 { - &Opcode::SwidenHigh => { - // Rule at src/isa/aarch64/lower.isle line 2010. - let expr0_0 = VecExtendOp::Sxtl; - let expr1_0 = C::put_in_reg(ctx, pattern5_1); - let expr2_0: bool = true; - let expr3_0 = constructor_lane_size(ctx, pattern3_0); - let expr4_0 = - constructor_vec_extend(ctx, &expr0_0, expr1_0, expr2_0, &expr3_0); - let expr5_0 = constructor_output_reg(ctx, expr4_0); - return Some(expr5_0); - } - &Opcode::UwidenHigh => { - // Rule at src/isa/aarch64/lower.isle line 2025. - let expr0_0 = VecExtendOp::Uxtl; - let expr1_0 = C::put_in_reg(ctx, pattern5_1); - let expr2_0: bool = true; - let expr3_0 = constructor_lane_size(ctx, pattern3_0); - let expr4_0 = - constructor_vec_extend(ctx, &expr0_0, expr1_0, expr2_0, &expr3_0); - let expr5_0 = constructor_output_reg(ctx, expr4_0); - return Some(expr5_0); - } - _ => {} - } - } - &InstructionData::Ternary { - opcode: ref pattern5_0, - args: ref pattern5_1, - } => { - if let &Opcode::Bitselect = pattern5_0 { - let (pattern7_0, pattern7_1, pattern7_2) = - C::unpack_value_array_3(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 1649. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = C::put_in_reg(ctx, pattern7_1); - let expr2_0 = C::put_in_reg(ctx, pattern7_2); - let expr3_0 = constructor_bsl(ctx, pattern3_0, expr0_0, expr1_0, expr2_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - } - _ => {} - } - } - if let Some(pattern3_0) = C::ty_vec128_int(ctx, pattern2_0) { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Binary { - opcode: ref pattern5_0, - args: ref pattern5_1, - } = &pattern4_0 - { - match pattern5_0 { - &Opcode::Snarrow => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - let mut closure8 = || { - let expr0_0 = C::zero_value(ctx, pattern7_1)?; - return Some(expr0_0); - }; - if let Some(pattern8_0) = closure8() { - // Rule at src/isa/aarch64/lower.isle line 1959. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = constructor_lane_size(ctx, pattern3_0); - let expr2_0 = constructor_sqxtn(ctx, expr0_0, &expr1_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - } - &Opcode::Unarrow => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - let mut closure8 = || { - let expr0_0 = C::zero_value(ctx, pattern7_1)?; - return Some(expr0_0); - }; - if let Some(pattern8_0) = closure8() { - // Rule at src/isa/aarch64/lower.isle line 1974. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = constructor_lane_size(ctx, pattern3_0); - let expr2_0 = constructor_sqxtun(ctx, expr0_0, &expr1_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - } - &Opcode::Uunarrow => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - let mut closure8 = || { - let expr0_0 = C::zero_value(ctx, pattern7_1)?; - return Some(expr0_0); - }; - if let Some(pattern8_0) = closure8() { - // Rule at src/isa/aarch64/lower.isle line 1990. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = constructor_lane_size(ctx, pattern3_0); - let expr2_0 = constructor_uqxtn(ctx, expr0_0, &expr1_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - } - _ => {} - } - } - } - let pattern3_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::UnaryConst { - opcode: ref pattern4_0, - constant_handle: pattern4_1, - } = &pattern3_0 - { - if let &Opcode::Vconst = pattern4_0 { - if let Some(pattern6_0) = C::u64_from_constant(ctx, pattern4_1) { - let mut closure7 = || { - let expr0_0 = C::ty_vec64_ctor(ctx, pattern2_0)?; - return Some(expr0_0); - }; - if let Some(pattern7_0) = closure7() { - // Rule at src/isa/aarch64/lower.isle line 1827. - let expr0_0 = C::constant_f64(ctx, pattern6_0); - let expr1_0 = constructor_output_reg(ctx, expr0_0); - return Some(expr1_0); - } - } - } - } - } - let pattern1_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::TernaryImm8 { - opcode: ref pattern2_0, - args: ref pattern2_1, - imm: pattern2_2, - } = &pattern1_0 - { - if let &Opcode::Insertlane = pattern2_0 { - let (pattern4_0, pattern4_1) = C::unpack_value_array_2(ctx, pattern2_1); - let pattern5_0 = C::value_type(ctx, pattern4_0); - let pattern6_0 = C::value_type(ctx, pattern4_1); - if let Some(pattern7_0) = C::ty_int(ctx, pattern6_0) { - let pattern8_0 = C::u8_from_uimm8(ctx, pattern2_2); - // Rule at src/isa/aarch64/lower.isle line 2320. - let expr0_0 = C::put_in_reg(ctx, pattern4_0); - let expr1_0 = C::put_in_reg(ctx, pattern4_1); - let expr2_0 = constructor_vector_size(ctx, pattern5_0); - let expr3_0 = constructor_mov_to_vec(ctx, expr0_0, expr1_0, pattern8_0, &expr2_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - } - } - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::first_result(ctx, pattern0_0) { - let pattern2_0 = C::value_type(ctx, pattern1_0); - if pattern2_0 == I8 { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - match &pattern4_0 { - &InstructionData::Unary { - opcode: ref pattern5_0, - arg: pattern5_1, - } => { - match pattern5_0 { - &Opcode::Bitrev => { - // Rule at src/isa/aarch64/lower.isle line 1465. - let expr0_0: Type = I32; - let expr1_0: Type = I32; - let expr2_0 = C::put_in_reg(ctx, pattern5_1); - let expr3_0 = constructor_rbit(ctx, expr1_0, expr2_0); - let expr4_0: u8 = 24i128 as u8; - let expr5_0 = C::imm_shift_from_u8(ctx, expr4_0); - let expr6_0 = constructor_lsr_imm(ctx, expr0_0, expr3_0, expr5_0); - let expr7_0 = constructor_output_reg(ctx, expr6_0); - return Some(expr7_0); - } - &Opcode::Clz => { - // Rule at src/isa/aarch64/lower.isle line 1486. - let expr0_0: Type = I32; - let expr1_0: Type = I32; - let expr2_0 = constructor_put_in_reg_zext32(ctx, pattern5_1); - let expr3_0 = constructor_a64_clz(ctx, expr1_0, expr2_0); - let expr4_0: u8 = 24i128 as u8; - let expr5_0 = C::u8_into_imm12(ctx, expr4_0); - let expr6_0 = constructor_sub_imm(ctx, expr0_0, expr3_0, expr5_0); - let expr7_0 = constructor_output_reg(ctx, expr6_0); - return Some(expr7_0); - } - &Opcode::Cls => { - // Rule at src/isa/aarch64/lower.isle line 1533. - let expr0_0: Type = I32; - let expr1_0: Type = I32; - let expr2_0 = constructor_put_in_reg_sext32(ctx, pattern5_1); - let expr3_0 = constructor_a64_cls(ctx, expr1_0, expr2_0); - let expr4_0: u8 = 24i128 as u8; - let expr5_0 = C::u8_into_imm12(ctx, expr4_0); - let expr6_0 = constructor_sub_imm(ctx, expr0_0, expr3_0, expr5_0); - let expr7_0 = constructor_output_reg(ctx, expr6_0); - return Some(expr7_0); - } - &Opcode::Ctz => { - // Rule at src/isa/aarch64/lower.isle line 1516. - let expr0_0: Type = I32; - let expr1_0: Type = I32; - let expr2_0: Type = I32; - let expr3_0 = C::put_in_reg(ctx, pattern5_1); - let expr4_0 = constructor_rbit(ctx, expr2_0, expr3_0); - let expr5_0: Type = I32; - let expr6_0: u64 = 8388608i128 as u64; - let expr7_0 = C::u64_into_imm_logic(ctx, expr5_0, expr6_0); - let expr8_0 = constructor_orr_imm(ctx, expr1_0, expr4_0, expr7_0); - let expr9_0 = constructor_a64_clz(ctx, expr0_0, expr8_0); - let expr10_0 = constructor_output_reg(ctx, expr9_0); - return Some(expr10_0); - } - &Opcode::Popcnt => { - // Rule at src/isa/aarch64/lower.isle line 1606. - let expr0_0 = C::put_in_reg(ctx, pattern5_1); - let expr1_0 = ScalarSize::Size32; - let expr2_0 = constructor_mov_to_fpu(ctx, expr0_0, &expr1_0); - let expr3_0 = VectorSize::Size8x8; - let expr4_0 = constructor_vec_cnt(ctx, expr2_0, &expr3_0); - let expr5_0: u8 = 0i128 as u8; - let expr6_0 = ScalarSize::Size8; - let expr7_0 = constructor_mov_from_vec(ctx, expr4_0, expr5_0, &expr6_0); - let expr8_0 = constructor_output_reg(ctx, expr7_0); - return Some(expr8_0); - } - _ => {} - } - } - &InstructionData::Load { - opcode: ref pattern5_0, - arg: pattern5_1, - flags: pattern5_2, - offset: pattern5_3, - } => { - if let &Opcode::Load = pattern5_0 { - // Rule at src/isa/aarch64/lower.isle line 2104. - let expr0_0: Type = I8; - let expr1_0 = C::offset32_to_u32(ctx, pattern5_3); - let expr2_0 = C::amode(ctx, expr0_0, pattern5_1, expr1_0); - let expr3_0 = constructor_aarch64_uload8(ctx, &expr2_0, pattern5_2); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - } - _ => {} - } - } - if pattern2_0 == I16 { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - match &pattern4_0 { - &InstructionData::Unary { - opcode: ref pattern5_0, - arg: pattern5_1, - } => { - match pattern5_0 { - &Opcode::Bitrev => { - // Rule at src/isa/aarch64/lower.isle line 1471. - let expr0_0: Type = I32; - let expr1_0: Type = I32; - let expr2_0 = C::put_in_reg(ctx, pattern5_1); - let expr3_0 = constructor_rbit(ctx, expr1_0, expr2_0); - let expr4_0: u8 = 16i128 as u8; - let expr5_0 = C::imm_shift_from_u8(ctx, expr4_0); - let expr6_0 = constructor_lsr_imm(ctx, expr0_0, expr3_0, expr5_0); - let expr7_0 = constructor_output_reg(ctx, expr6_0); - return Some(expr7_0); - } - &Opcode::Clz => { - // Rule at src/isa/aarch64/lower.isle line 1489. - let expr0_0: Type = I32; - let expr1_0: Type = I32; - let expr2_0 = constructor_put_in_reg_zext32(ctx, pattern5_1); - let expr3_0 = constructor_a64_clz(ctx, expr1_0, expr2_0); - let expr4_0: u8 = 16i128 as u8; - let expr5_0 = C::u8_into_imm12(ctx, expr4_0); - let expr6_0 = constructor_sub_imm(ctx, expr0_0, expr3_0, expr5_0); - let expr7_0 = constructor_output_reg(ctx, expr6_0); - return Some(expr7_0); - } - &Opcode::Cls => { - // Rule at src/isa/aarch64/lower.isle line 1536. - let expr0_0: Type = I32; - let expr1_0: Type = I32; - let expr2_0 = constructor_put_in_reg_sext32(ctx, pattern5_1); - let expr3_0 = constructor_a64_cls(ctx, expr1_0, expr2_0); - let expr4_0: u8 = 16i128 as u8; - let expr5_0 = C::u8_into_imm12(ctx, expr4_0); - let expr6_0 = constructor_sub_imm(ctx, expr0_0, expr3_0, expr5_0); - let expr7_0 = constructor_output_reg(ctx, expr6_0); - return Some(expr7_0); - } - &Opcode::Ctz => { - // Rule at src/isa/aarch64/lower.isle line 1519. - let expr0_0: Type = I32; - let expr1_0: Type = I32; - let expr2_0: Type = I32; - let expr3_0 = C::put_in_reg(ctx, pattern5_1); - let expr4_0 = constructor_rbit(ctx, expr2_0, expr3_0); - let expr5_0: Type = I32; - let expr6_0: u64 = 32768i128 as u64; - let expr7_0 = C::u64_into_imm_logic(ctx, expr5_0, expr6_0); - let expr8_0 = constructor_orr_imm(ctx, expr1_0, expr4_0, expr7_0); - let expr9_0 = constructor_a64_clz(ctx, expr0_0, expr8_0); - let expr10_0 = constructor_output_reg(ctx, expr9_0); - return Some(expr10_0); - } - &Opcode::Bswap => { - // Rule at src/isa/aarch64/lower.isle line 1567. - let expr0_0: Type = I16; - let expr1_0 = C::put_in_reg(ctx, pattern5_1); - let expr2_0 = constructor_a64_rev16(ctx, expr0_0, expr1_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::Popcnt => { - // Rule at src/isa/aarch64/lower.isle line 1612. - let expr0_0 = C::put_in_reg(ctx, pattern5_1); - let expr1_0 = ScalarSize::Size32; - let expr2_0 = constructor_mov_to_fpu(ctx, expr0_0, &expr1_0); - let expr3_0 = VectorSize::Size8x8; - let expr4_0 = constructor_vec_cnt(ctx, expr2_0, &expr3_0); - let expr5_0 = VectorSize::Size8x8; - let expr6_0 = constructor_addp(ctx, expr4_0, expr4_0, &expr5_0); - let expr7_0: u8 = 0i128 as u8; - let expr8_0 = ScalarSize::Size8; - let expr9_0 = constructor_mov_from_vec(ctx, expr6_0, expr7_0, &expr8_0); - let expr10_0 = constructor_output_reg(ctx, expr9_0); - return Some(expr10_0); - } - _ => {} - } - } - &InstructionData::Load { - opcode: ref pattern5_0, - arg: pattern5_1, - flags: pattern5_2, - offset: pattern5_3, - } => { - if let &Opcode::Load = pattern5_0 { - // Rule at src/isa/aarch64/lower.isle line 2107. - let expr0_0: Type = I16; - let expr1_0 = C::offset32_to_u32(ctx, pattern5_3); - let expr2_0 = C::amode(ctx, expr0_0, pattern5_1, expr1_0); - let expr3_0 = constructor_aarch64_uload16(ctx, &expr2_0, pattern5_2); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - } - _ => {} - } - } - if pattern2_0 == I32 { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - match &pattern4_0 { - &InstructionData::Unary { - opcode: ref pattern5_0, - arg: pattern5_1, - } => { - match pattern5_0 { - &Opcode::Bswap => { - // Rule at src/isa/aarch64/lower.isle line 1570. - let expr0_0: Type = I32; - let expr1_0 = C::put_in_reg(ctx, pattern5_1); - let expr2_0 = constructor_a64_rev32(ctx, expr0_0, expr1_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::Popcnt => { - // Rule at src/isa/aarch64/lower.isle line 1618. - let expr0_0 = C::put_in_reg(ctx, pattern5_1); - let expr1_0 = ScalarSize::Size32; - let expr2_0 = constructor_mov_to_fpu(ctx, expr0_0, &expr1_0); - let expr3_0 = VectorSize::Size8x8; - let expr4_0 = constructor_vec_cnt(ctx, expr2_0, &expr3_0); - let expr5_0 = VectorSize::Size8x8; - let expr6_0 = constructor_addv(ctx, expr4_0, &expr5_0); - let expr7_0: u8 = 0i128 as u8; - let expr8_0 = ScalarSize::Size8; - let expr9_0 = constructor_mov_from_vec(ctx, expr6_0, expr7_0, &expr8_0); - let expr10_0 = constructor_output_reg(ctx, expr9_0); - return Some(expr10_0); - } - _ => {} - } - } - &InstructionData::Load { - opcode: ref pattern5_0, - arg: pattern5_1, - flags: pattern5_2, - offset: pattern5_3, - } => { - if let &Opcode::Load = pattern5_0 { - // Rule at src/isa/aarch64/lower.isle line 2110. - let expr0_0: Type = I32; - let expr1_0 = C::offset32_to_u32(ctx, pattern5_3); - let expr2_0 = C::amode(ctx, expr0_0, pattern5_1, expr1_0); - let expr3_0 = constructor_aarch64_uload32(ctx, &expr2_0, pattern5_2); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - } - &InstructionData::Binary { - opcode: ref pattern5_0, - args: ref pattern5_1, - } => { - match pattern5_0 { - &Opcode::Rotl => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 1335. - let expr0_0 = C::put_in_regs(ctx, pattern7_1); - let expr1_0: usize = 0i128 as usize; - let expr2_0 = C::value_regs_get(ctx, expr0_0, expr1_0); - let expr3_0: Type = I32; - let expr4_0 = C::zero_reg(ctx); - let expr5_0 = constructor_sub(ctx, expr3_0, expr4_0, expr2_0); - let expr6_0: Type = I32; - let expr7_0 = C::put_in_reg(ctx, pattern7_0); - let expr8_0 = constructor_a64_rotr(ctx, expr6_0, expr7_0, expr5_0); - let expr9_0 = constructor_output_reg(ctx, expr8_0); - return Some(expr9_0); - } - &Opcode::Rotr => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - if let Some(pattern8_0) = C::def_inst(ctx, pattern7_1) { - let pattern9_0 = C::inst_data(ctx, pattern8_0); - if let &InstructionData::UnaryImm { - opcode: ref pattern10_0, - imm: pattern10_1, - } = &pattern9_0 - { - if let &Opcode::Iconst = pattern10_0 { - let mut closure12 = || { - let expr0_0: Type = I32; - let expr1_0 = - C::imm_shift_from_imm64(ctx, expr0_0, pattern10_1)?; - return Some(expr1_0); - }; - if let Some(pattern12_0) = closure12() { - // Rule at src/isa/aarch64/lower.isle line 1392. - let expr0_0: Type = I32; - let expr1_0 = C::put_in_reg(ctx, pattern7_0); - let expr2_0 = constructor_a64_rotr_imm( - ctx, - expr0_0, - expr1_0, - pattern12_0, - ); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - } - } - } - } - _ => {} - } - } - _ => {} - } - } - if pattern2_0 == I64 { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - match &pattern4_0 { - &InstructionData::Unary { - opcode: ref pattern5_0, - arg: pattern5_1, - } => { - match pattern5_0 { - &Opcode::Bswap => { - // Rule at src/isa/aarch64/lower.isle line 1573. - let expr0_0: Type = I64; - let expr1_0 = C::put_in_reg(ctx, pattern5_1); - let expr2_0 = constructor_a64_rev64(ctx, expr0_0, expr1_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::Popcnt => { - // Rule at src/isa/aarch64/lower.isle line 1624. - let expr0_0 = C::put_in_reg(ctx, pattern5_1); - let expr1_0 = ScalarSize::Size64; - let expr2_0 = constructor_mov_to_fpu(ctx, expr0_0, &expr1_0); - let expr3_0 = VectorSize::Size8x8; - let expr4_0 = constructor_vec_cnt(ctx, expr2_0, &expr3_0); - let expr5_0 = VectorSize::Size8x8; - let expr6_0 = constructor_addv(ctx, expr4_0, &expr5_0); - let expr7_0: u8 = 0i128 as u8; - let expr8_0 = ScalarSize::Size8; - let expr9_0 = constructor_mov_from_vec(ctx, expr6_0, expr7_0, &expr8_0); - let expr10_0 = constructor_output_reg(ctx, expr9_0); - return Some(expr10_0); - } - _ => {} - } - } - &InstructionData::Load { - opcode: ref pattern5_0, - arg: pattern5_1, - flags: pattern5_2, - offset: pattern5_3, - } => { - if let &Opcode::Load = pattern5_0 { - // Rule at src/isa/aarch64/lower.isle line 2113. - let expr0_0: Type = I64; - let expr1_0 = C::offset32_to_u32(ctx, pattern5_3); - let expr2_0 = C::amode(ctx, expr0_0, pattern5_1, expr1_0); - let expr3_0 = constructor_aarch64_uload64(ctx, &expr2_0, pattern5_2); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - } - &InstructionData::Binary { - opcode: ref pattern5_0, - args: ref pattern5_1, - } => { - match pattern5_0 { - &Opcode::Band => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 1060. - let expr0_0 = ALUOp::And; - let expr1_0: Type = I64; - let expr2_0 = constructor_alu_rs_imm_logic_commutative( - ctx, &expr0_0, expr1_0, pattern7_0, pattern7_1, - ); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::Bor => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 1073. - let expr0_0 = ALUOp::Orr; - let expr1_0: Type = I64; - let expr2_0 = constructor_alu_rs_imm_logic_commutative( - ctx, &expr0_0, expr1_0, pattern7_0, pattern7_1, - ); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::Bxor => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 1086. - let expr0_0 = ALUOp::Eor; - let expr1_0: Type = I64; - let expr2_0 = constructor_alu_rs_imm_logic_commutative( - ctx, &expr0_0, expr1_0, pattern7_0, pattern7_1, - ); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::BandNot => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 1099. - let expr0_0 = ALUOp::AndNot; - let expr1_0: Type = I64; - let expr2_0 = constructor_alu_rs_imm_logic( - ctx, &expr0_0, expr1_0, pattern7_0, pattern7_1, - ); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::BorNot => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 1112. - let expr0_0 = ALUOp::OrrNot; - let expr1_0: Type = I64; - let expr2_0 = constructor_alu_rs_imm_logic( - ctx, &expr0_0, expr1_0, pattern7_0, pattern7_1, - ); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::BxorNot => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 1122. - let expr0_0 = ALUOp::EorNot; - let expr1_0: Type = I64; - let expr2_0 = constructor_alu_rs_imm_logic( - ctx, &expr0_0, expr1_0, pattern7_0, pattern7_1, - ); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::Rotl => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 1341. - let expr0_0 = C::put_in_regs(ctx, pattern7_1); - let expr1_0: usize = 0i128 as usize; - let expr2_0 = C::value_regs_get(ctx, expr0_0, expr1_0); - let expr3_0: Type = I64; - let expr4_0 = C::zero_reg(ctx); - let expr5_0 = constructor_sub(ctx, expr3_0, expr4_0, expr2_0); - let expr6_0: Type = I64; - let expr7_0 = C::put_in_reg(ctx, pattern7_0); - let expr8_0 = constructor_a64_rotr(ctx, expr6_0, expr7_0, expr5_0); - let expr9_0 = constructor_output_reg(ctx, expr8_0); - return Some(expr9_0); - } - &Opcode::Rotr => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - if let Some(pattern8_0) = C::def_inst(ctx, pattern7_1) { - let pattern9_0 = C::inst_data(ctx, pattern8_0); - if let &InstructionData::UnaryImm { - opcode: ref pattern10_0, - imm: pattern10_1, - } = &pattern9_0 - { - if let &Opcode::Iconst = pattern10_0 { - let mut closure12 = || { - let expr0_0: Type = I64; - let expr1_0 = - C::imm_shift_from_imm64(ctx, expr0_0, pattern10_1)?; - return Some(expr1_0); - }; - if let Some(pattern12_0) = closure12() { - // Rule at src/isa/aarch64/lower.isle line 1397. - let expr0_0: Type = I64; - let expr1_0 = C::put_in_reg(ctx, pattern7_0); - let expr2_0 = constructor_a64_rotr_imm( - ctx, - expr0_0, - expr1_0, - pattern12_0, - ); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - } - } - } - } - &Opcode::Ishl => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 1134. - let expr0_0 = ALUOp::Lsl; - let expr1_0: Type = I64; - let expr2_0 = C::put_in_reg(ctx, pattern7_0); - let expr3_0 = - constructor_do_shift(ctx, &expr0_0, expr1_0, expr2_0, pattern7_1); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - &Opcode::Ushr => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 1220. - let expr0_0 = ALUOp::Lsr; - let expr1_0: Type = I64; - let expr2_0 = constructor_put_in_reg_zext64(ctx, pattern7_0); - let expr3_0 = - constructor_do_shift(ctx, &expr0_0, expr1_0, expr2_0, pattern7_1); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - &Opcode::Sshr => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 1268. - let expr0_0 = ALUOp::Asr; - let expr1_0: Type = I64; - let expr2_0 = constructor_put_in_reg_sext64(ctx, pattern7_0); - let expr3_0 = - constructor_do_shift(ctx, &expr0_0, expr1_0, expr2_0, pattern7_1); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - _ => {} - } - } - _ => {} - } - } - if pattern2_0 == I128 { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - match &pattern4_0 { - &InstructionData::Unary { - opcode: ref pattern5_0, - arg: pattern5_1, - } => { - match pattern5_0 { - &Opcode::Bnot => { - // Rule at src/isa/aarch64/lower.isle line 1043. - let expr0_0 = C::put_in_regs(ctx, pattern5_1); - let expr1_0: usize = 0i128 as usize; - let expr2_0 = C::value_regs_get(ctx, expr0_0, expr1_0); - let expr3_0: usize = 1i128 as usize; - let expr4_0 = C::value_regs_get(ctx, expr0_0, expr3_0); - let expr5_0: Type = I64; - let expr6_0 = C::zero_reg(ctx); - let expr7_0 = constructor_orr_not(ctx, expr5_0, expr6_0, expr2_0); - let expr8_0: Type = I64; - let expr9_0 = C::zero_reg(ctx); - let expr10_0 = constructor_orr_not(ctx, expr8_0, expr9_0, expr4_0); - let expr11_0 = C::value_regs(ctx, expr7_0, expr10_0); - let expr12_0 = C::output(ctx, expr11_0); - return Some(expr12_0); - } - &Opcode::Bitrev => { - // Rule at src/isa/aarch64/lower.isle line 1474. - let expr0_0 = C::put_in_regs(ctx, pattern5_1); - let expr1_0: Type = I64; - let expr2_0: usize = 0i128 as usize; - let expr3_0 = C::value_regs_get(ctx, expr0_0, expr2_0); - let expr4_0 = constructor_rbit(ctx, expr1_0, expr3_0); - let expr5_0: Type = I64; - let expr6_0: usize = 1i128 as usize; - let expr7_0 = C::value_regs_get(ctx, expr0_0, expr6_0); - let expr8_0 = constructor_rbit(ctx, expr5_0, expr7_0); - let expr9_0 = C::value_regs(ctx, expr8_0, expr4_0); - let expr10_0 = C::output(ctx, expr9_0); - return Some(expr10_0); - } - &Opcode::Clz => { - // Rule at src/isa/aarch64/lower.isle line 1492. - let expr0_0 = C::put_in_regs(ctx, pattern5_1); - let expr1_0 = constructor_lower_clz128(ctx, expr0_0); - let expr2_0 = C::output(ctx, expr1_0); - return Some(expr2_0); - } - &Opcode::Cls => { - // Rule at src/isa/aarch64/lower.isle line 1548. - let expr0_0 = C::put_in_regs(ctx, pattern5_1); - let expr1_0: usize = 0i128 as usize; - let expr2_0 = C::value_regs_get(ctx, expr0_0, expr1_0); - let expr3_0: usize = 1i128 as usize; - let expr4_0 = C::value_regs_get(ctx, expr0_0, expr3_0); - let expr5_0: Type = I64; - let expr6_0 = constructor_a64_cls(ctx, expr5_0, expr2_0); - let expr7_0: Type = I64; - let expr8_0 = constructor_a64_cls(ctx, expr7_0, expr4_0); - let expr9_0: Type = I64; - let expr10_0 = constructor_eon(ctx, expr9_0, expr4_0, expr2_0); - let expr11_0: Type = I64; - let expr12_0: u8 = 63i128 as u8; - let expr13_0 = C::imm_shift_from_u8(ctx, expr12_0); - let expr14_0 = constructor_lsr_imm(ctx, expr11_0, expr10_0, expr13_0); - let expr15_0: Type = I64; - let expr16_0 = - constructor_madd(ctx, expr15_0, expr6_0, expr14_0, expr14_0); - let expr17_0: u8 = 63i128 as u8; - let expr18_0 = C::u8_into_imm12(ctx, expr17_0); - let expr19_0 = constructor_cmp64_imm(ctx, expr8_0, expr18_0); - let expr20_0 = Cond::Eq; - let expr21_0 = C::zero_reg(ctx); - let expr22_0 = constructor_csel(ctx, &expr20_0, expr16_0, expr21_0); - let expr23_0 = constructor_with_flags_reg(ctx, &expr19_0, &expr22_0); - let expr24_0: Type = I64; - let expr25_0 = constructor_add(ctx, expr24_0, expr23_0, expr8_0); - let expr26_0: Type = I64; - let expr27_0 = ImmExtend::Zero; - let expr28_0: u64 = 0i128 as u64; - let expr29_0 = constructor_imm(ctx, expr26_0, &expr27_0, expr28_0); - let expr30_0 = C::value_regs(ctx, expr25_0, expr29_0); - let expr31_0 = C::output(ctx, expr30_0); - return Some(expr31_0); - } - &Opcode::Ctz => { - // Rule at src/isa/aarch64/lower.isle line 1522. - let expr0_0 = C::put_in_regs(ctx, pattern5_1); - let expr1_0: Type = I64; - let expr2_0: usize = 0i128 as usize; - let expr3_0 = C::value_regs_get(ctx, expr0_0, expr2_0); - let expr4_0 = constructor_rbit(ctx, expr1_0, expr3_0); - let expr5_0: Type = I64; - let expr6_0: usize = 1i128 as usize; - let expr7_0 = C::value_regs_get(ctx, expr0_0, expr6_0); - let expr8_0 = constructor_rbit(ctx, expr5_0, expr7_0); - let expr9_0 = C::value_regs(ctx, expr8_0, expr4_0); - let expr10_0 = constructor_lower_clz128(ctx, expr9_0); - let expr11_0 = C::output(ctx, expr10_0); - return Some(expr11_0); - } - &Opcode::Bswap => { - // Rule at src/isa/aarch64/lower.isle line 1576. - let expr0_0: Type = I64; - let expr1_0 = C::put_in_regs(ctx, pattern5_1); - let expr2_0: usize = 1i128 as usize; - let expr3_0 = C::value_regs_get(ctx, expr1_0, expr2_0); - let expr4_0 = constructor_a64_rev64(ctx, expr0_0, expr3_0); - let expr5_0: Type = I64; - let expr6_0 = C::put_in_regs(ctx, pattern5_1); - let expr7_0: usize = 0i128 as usize; - let expr8_0 = C::value_regs_get(ctx, expr6_0, expr7_0); - let expr9_0 = constructor_a64_rev64(ctx, expr5_0, expr8_0); - let expr10_0 = C::value_regs(ctx, expr4_0, expr9_0); - let expr11_0 = C::output(ctx, expr10_0); - return Some(expr11_0); - } - &Opcode::Popcnt => { - // Rule at src/isa/aarch64/lower.isle line 1630. - let expr0_0 = C::put_in_regs(ctx, pattern5_1); - let expr1_0: usize = 0i128 as usize; - let expr2_0 = C::value_regs_get(ctx, expr0_0, expr1_0); - let expr3_0 = ScalarSize::Size64; - let expr4_0 = constructor_mov_to_fpu(ctx, expr2_0, &expr3_0); - let expr5_0: usize = 1i128 as usize; - let expr6_0 = C::value_regs_get(ctx, expr0_0, expr5_0); - let expr7_0: u8 = 1i128 as u8; - let expr8_0 = VectorSize::Size64x2; - let expr9_0 = - constructor_mov_to_vec(ctx, expr4_0, expr6_0, expr7_0, &expr8_0); - let expr10_0 = VectorSize::Size8x16; - let expr11_0 = constructor_vec_cnt(ctx, expr9_0, &expr10_0); - let expr12_0 = VectorSize::Size8x16; - let expr13_0 = constructor_addv(ctx, expr11_0, &expr12_0); - let expr14_0: u8 = 0i128 as u8; - let expr15_0 = ScalarSize::Size8; - let expr16_0 = - constructor_mov_from_vec(ctx, expr13_0, expr14_0, &expr15_0); - let expr17_0: Type = I64; - let expr18_0 = ImmExtend::Zero; - let expr19_0: u64 = 0i128 as u64; - let expr20_0 = constructor_imm(ctx, expr17_0, &expr18_0, expr19_0); - let expr21_0 = C::value_regs(ctx, expr16_0, expr20_0); - let expr22_0 = C::output(ctx, expr21_0); - return Some(expr22_0); - } - &Opcode::Uextend => { - if let Some(pattern7_0) = C::def_inst(ctx, pattern5_1) { - let pattern8_0 = C::inst_data(ctx, pattern7_0); - if let &InstructionData::BinaryImm8 { - opcode: ref pattern9_0, - arg: pattern9_1, - imm: pattern9_2, - } = &pattern8_0 - { - if let &Opcode::Extractlane = pattern9_0 { - let pattern11_0 = C::value_type(ctx, pattern9_1); - let pattern12_0 = C::u8_from_uimm8(ctx, pattern9_2); - // Rule at src/isa/aarch64/lower.isle line 972. - let expr0_0 = C::put_in_reg(ctx, pattern9_1); - let expr1_0 = constructor_lane_size(ctx, pattern11_0); - let expr2_0 = constructor_mov_from_vec( - ctx, - expr0_0, - pattern12_0, - &expr1_0, - ); - let expr3_0: Type = I64; - let expr4_0 = ImmExtend::Zero; - let expr5_0: u64 = 0i128 as u64; - let expr6_0 = - constructor_imm(ctx, expr3_0, &expr4_0, expr5_0); - let expr7_0 = C::value_regs(ctx, expr2_0, expr6_0); - let expr8_0 = C::output(ctx, expr7_0); - return Some(expr8_0); - } - } - } - } - &Opcode::Sextend => { - if let Some(pattern7_0) = C::def_inst(ctx, pattern5_1) { - let pattern8_0 = C::inst_data(ctx, pattern7_0); - if let &InstructionData::BinaryImm8 { - opcode: ref pattern9_0, - arg: pattern9_1, - imm: pattern9_2, - } = &pattern8_0 - { - if let &Opcode::Extractlane = pattern9_0 { - let pattern11_0 = C::value_type(ctx, pattern9_1); - if let Some(()) = C::not_i64x2(ctx, pattern11_0) { - let pattern13_0 = C::u8_from_uimm8(ctx, pattern9_2); - // Rule at src/isa/aarch64/lower.isle line 1005. - let expr0_0 = C::put_in_reg(ctx, pattern9_1); - let expr1_0 = constructor_vector_size(ctx, pattern11_0); - let expr2_0: Type = I64; - let expr3_0 = constructor_size_from_ty(ctx, expr2_0); - let expr4_0 = constructor_mov_from_vec_signed( - ctx, - expr0_0, - pattern13_0, - &expr1_0, - &expr3_0, - ); - let expr5_0: Type = I64; - let expr6_0: u8 = 63i128 as u8; - let expr7_0 = C::imm_shift_from_u8(ctx, expr6_0); - let expr8_0 = - constructor_asr_imm(ctx, expr5_0, expr4_0, expr7_0); - let expr9_0 = C::value_regs(ctx, expr4_0, expr8_0); - let expr10_0 = C::output(ctx, expr9_0); - return Some(expr10_0); - } - } - } - } - } - _ => {} - } - } - &InstructionData::Load { - opcode: ref pattern5_0, - arg: pattern5_1, - flags: pattern5_2, - offset: pattern5_3, - } => { - if let &Opcode::Load = pattern5_0 { - // Rule at src/isa/aarch64/lower.isle line 2125. - let expr0_0 = C::offset32_to_u32(ctx, pattern5_3); - let expr1_0 = C::pair_amode(ctx, pattern5_1, expr0_0); - let expr2_0 = constructor_aarch64_loadp64(ctx, &expr1_0, pattern5_2); - let expr3_0 = C::output(ctx, expr2_0); - return Some(expr3_0); - } - } - &InstructionData::Binary { - opcode: ref pattern5_0, - args: ref pattern5_1, - } => { - match pattern5_0 { - &Opcode::Band => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 1063. - let expr0_0 = ALUOp::And; - let expr1_0: Type = I64; - let expr2_0 = constructor_i128_alu_bitop( - ctx, &expr0_0, expr1_0, pattern7_0, pattern7_1, - ); - let expr3_0 = C::output(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::Bor => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 1076. - let expr0_0 = ALUOp::Orr; - let expr1_0: Type = I64; - let expr2_0 = constructor_i128_alu_bitop( - ctx, &expr0_0, expr1_0, pattern7_0, pattern7_1, - ); - let expr3_0 = C::output(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::Bxor => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 1089. - let expr0_0 = ALUOp::Eor; - let expr1_0: Type = I64; - let expr2_0 = constructor_i128_alu_bitop( - ctx, &expr0_0, expr1_0, pattern7_0, pattern7_1, - ); - let expr3_0 = C::output(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::BandNot => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 1102. - let expr0_0 = ALUOp::AndNot; - let expr1_0: Type = I64; - let expr2_0 = constructor_i128_alu_bitop( - ctx, &expr0_0, expr1_0, pattern7_0, pattern7_1, - ); - let expr3_0 = C::output(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::BorNot => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 1115. - let expr0_0 = ALUOp::OrrNot; - let expr1_0: Type = I64; - let expr2_0 = constructor_i128_alu_bitop( - ctx, &expr0_0, expr1_0, pattern7_0, pattern7_1, - ); - let expr3_0 = C::output(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::BxorNot => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 1125. - let expr0_0 = ALUOp::EorNot; - let expr1_0: Type = I64; - let expr2_0 = constructor_i128_alu_bitop( - ctx, &expr0_0, expr1_0, pattern7_0, pattern7_1, - ); - let expr3_0 = C::output(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::Rotl => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 1362. - let expr0_0 = C::put_in_regs(ctx, pattern7_0); - let expr1_0 = C::put_in_regs(ctx, pattern7_1); - let expr2_0: usize = 0i128 as usize; - let expr3_0 = C::value_regs_get(ctx, expr1_0, expr2_0); - let expr4_0: Type = I64; - let expr5_0: Type = I64; - let expr6_0 = ImmExtend::Zero; - let expr7_0: u64 = 128i128 as u64; - let expr8_0 = constructor_imm(ctx, expr5_0, &expr6_0, expr7_0); - let expr9_0 = constructor_sub(ctx, expr4_0, expr8_0, expr3_0); - let expr10_0 = constructor_lower_shl128(ctx, expr0_0, expr3_0); - let expr11_0 = constructor_lower_ushr128(ctx, expr0_0, expr9_0); - let expr12_0: Type = I64; - let expr13_0: usize = 0i128 as usize; - let expr14_0 = C::value_regs_get(ctx, expr10_0, expr13_0); - let expr15_0: usize = 0i128 as usize; - let expr16_0 = C::value_regs_get(ctx, expr11_0, expr15_0); - let expr17_0 = constructor_orr(ctx, expr12_0, expr14_0, expr16_0); - let expr18_0: Type = I64; - let expr19_0: usize = 1i128 as usize; - let expr20_0 = C::value_regs_get(ctx, expr10_0, expr19_0); - let expr21_0: usize = 1i128 as usize; - let expr22_0 = C::value_regs_get(ctx, expr11_0, expr21_0); - let expr23_0 = constructor_orr(ctx, expr18_0, expr20_0, expr22_0); - let expr24_0 = C::value_regs(ctx, expr17_0, expr23_0); - let expr25_0 = C::output(ctx, expr24_0); - return Some(expr25_0); - } - &Opcode::Rotr => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 1450. - let expr0_0 = C::put_in_regs(ctx, pattern7_0); - let expr1_0 = C::put_in_regs(ctx, pattern7_1); - let expr2_0: usize = 0i128 as usize; - let expr3_0 = C::value_regs_get(ctx, expr1_0, expr2_0); - let expr4_0: Type = I64; - let expr5_0: Type = I64; - let expr6_0 = ImmExtend::Zero; - let expr7_0: u64 = 128i128 as u64; - let expr8_0 = constructor_imm(ctx, expr5_0, &expr6_0, expr7_0); - let expr9_0 = constructor_sub(ctx, expr4_0, expr8_0, expr3_0); - let expr10_0 = constructor_lower_ushr128(ctx, expr0_0, expr3_0); - let expr11_0 = constructor_lower_shl128(ctx, expr0_0, expr9_0); - let expr12_0: Type = I64; - let expr13_0: usize = 1i128 as usize; - let expr14_0 = C::value_regs_get(ctx, expr10_0, expr13_0); - let expr15_0: usize = 1i128 as usize; - let expr16_0 = C::value_regs_get(ctx, expr11_0, expr15_0); - let expr17_0 = constructor_orr(ctx, expr12_0, expr14_0, expr16_0); - let expr18_0: Type = I64; - let expr19_0: usize = 0i128 as usize; - let expr20_0 = C::value_regs_get(ctx, expr10_0, expr19_0); - let expr21_0: usize = 0i128 as usize; - let expr22_0 = C::value_regs_get(ctx, expr11_0, expr21_0); - let expr23_0 = constructor_orr(ctx, expr18_0, expr20_0, expr22_0); - let expr24_0 = C::value_regs(ctx, expr23_0, expr17_0); - let expr25_0 = C::output(ctx, expr24_0); - return Some(expr25_0); - } - &Opcode::Ishl => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 1138. - let expr0_0 = C::put_in_regs(ctx, pattern7_0); - let expr1_0 = C::put_in_regs(ctx, pattern7_1); - let expr2_0: usize = 0i128 as usize; - let expr3_0 = C::value_regs_get(ctx, expr1_0, expr2_0); - let expr4_0 = constructor_lower_shl128(ctx, expr0_0, expr3_0); - let expr5_0 = C::output(ctx, expr4_0); - return Some(expr5_0); - } - &Opcode::Ushr => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 1224. - let expr0_0 = C::put_in_regs(ctx, pattern7_0); - let expr1_0 = C::put_in_regs(ctx, pattern7_1); - let expr2_0: usize = 0i128 as usize; - let expr3_0 = C::value_regs_get(ctx, expr1_0, expr2_0); - let expr4_0 = constructor_lower_ushr128(ctx, expr0_0, expr3_0); - let expr5_0 = C::output(ctx, expr4_0); - return Some(expr5_0); - } - &Opcode::Sshr => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 1272. - let expr0_0 = C::put_in_regs(ctx, pattern7_0); - let expr1_0 = C::put_in_regs(ctx, pattern7_1); - let expr2_0: usize = 0i128 as usize; - let expr3_0 = C::value_regs_get(ctx, expr1_0, expr2_0); - let expr4_0 = constructor_lower_sshr128(ctx, expr0_0, expr3_0); - let expr5_0 = C::output(ctx, expr4_0); - return Some(expr5_0); - } - &Opcode::Iconcat => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 141. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = C::put_in_reg(ctx, pattern7_1); - let expr2_0 = C::value_regs(ctx, expr0_0, expr1_0); - let expr3_0 = C::output(ctx, expr2_0); - return Some(expr3_0); - } - _ => {} - } - } - _ => {} - } - } - if pattern2_0 == R64 { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Load { - opcode: ref pattern5_0, - arg: pattern5_1, - flags: pattern5_2, - offset: pattern5_3, - } = &pattern4_0 - { - if let &Opcode::Load = pattern5_0 { - // Rule at src/isa/aarch64/lower.isle line 2116. - let expr0_0: Type = I64; - let expr1_0 = C::offset32_to_u32(ctx, pattern5_3); - let expr2_0 = C::amode(ctx, expr0_0, pattern5_1, expr1_0); - let expr3_0 = constructor_aarch64_uload64(ctx, &expr2_0, pattern5_2); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - } - } - if pattern2_0 == F32 { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - match &pattern4_0 { - &InstructionData::Unary { - opcode: ref pattern5_0, - arg: pattern5_1, - } => { - match pattern5_0 { - &Opcode::Ceil => { - // Rule at src/isa/aarch64/lower.isle line 359. - let expr0_0 = FpuRoundMode::Plus32; - let expr1_0 = C::put_in_reg(ctx, pattern5_1); - let expr2_0 = constructor_fpu_round(ctx, &expr0_0, expr1_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::Floor => { - // Rule at src/isa/aarch64/lower.isle line 370. - let expr0_0 = FpuRoundMode::Minus32; - let expr1_0 = C::put_in_reg(ctx, pattern5_1); - let expr2_0 = constructor_fpu_round(ctx, &expr0_0, expr1_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::Trunc => { - // Rule at src/isa/aarch64/lower.isle line 381. - let expr0_0 = FpuRoundMode::Zero32; - let expr1_0 = C::put_in_reg(ctx, pattern5_1); - let expr2_0 = constructor_fpu_round(ctx, &expr0_0, expr1_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::Nearest => { - // Rule at src/isa/aarch64/lower.isle line 392. - let expr0_0 = FpuRoundMode::Nearest32; - let expr1_0 = C::put_in_reg(ctx, pattern5_1); - let expr2_0 = constructor_fpu_round(ctx, &expr0_0, expr1_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::Fdemote => { - // Rule at src/isa/aarch64/lower.isle line 351. - let expr0_0 = FPUOp1::Cvt64To32; - let expr1_0 = C::put_in_reg(ctx, pattern5_1); - let expr2_0 = ScalarSize::Size64; - let expr3_0 = constructor_fpu_rr(ctx, &expr0_0, expr1_0, &expr2_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - &Opcode::FcvtFromUint => { - let pattern7_0 = C::value_type(ctx, pattern5_1); - if let Some(pattern8_0) = C::fits_in_32(ctx, pattern7_0) { - // Rule at src/isa/aarch64/lower.isle line 447. - let expr0_0 = IntToFpuOp::U32ToF32; - let expr1_0 = constructor_put_in_reg_zext32(ctx, pattern5_1); - let expr2_0 = constructor_int_to_fpu(ctx, &expr0_0, expr1_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - } - &Opcode::FcvtFromSint => { - let pattern7_0 = C::value_type(ctx, pattern5_1); - if let Some(pattern8_0) = C::fits_in_32(ctx, pattern7_0) { - // Rule at src/isa/aarch64/lower.isle line 467. - let expr0_0 = IntToFpuOp::I32ToF32; - let expr1_0 = constructor_put_in_reg_sext32(ctx, pattern5_1); - let expr2_0 = constructor_int_to_fpu(ctx, &expr0_0, expr1_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - } - _ => {} - } - } - &InstructionData::Load { - opcode: ref pattern5_0, - arg: pattern5_1, - flags: pattern5_2, - offset: pattern5_3, - } => { - if let &Opcode::Load = pattern5_0 { - // Rule at src/isa/aarch64/lower.isle line 2119. - let expr0_0: Type = F32; - let expr1_0 = C::offset32_to_u32(ctx, pattern5_3); - let expr2_0 = C::amode(ctx, expr0_0, pattern5_1, expr1_0); - let expr3_0 = constructor_aarch64_fpuload32(ctx, &expr2_0, pattern5_2); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - } - _ => {} - } - } - if pattern2_0 == F64 { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - match &pattern4_0 { - &InstructionData::Unary { - opcode: ref pattern5_0, - arg: pattern5_1, - } => { - match pattern5_0 { - &Opcode::Ceil => { - // Rule at src/isa/aarch64/lower.isle line 362. - let expr0_0 = FpuRoundMode::Plus64; - let expr1_0 = C::put_in_reg(ctx, pattern5_1); - let expr2_0 = constructor_fpu_round(ctx, &expr0_0, expr1_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::Floor => { - // Rule at src/isa/aarch64/lower.isle line 373. - let expr0_0 = FpuRoundMode::Minus64; - let expr1_0 = C::put_in_reg(ctx, pattern5_1); - let expr2_0 = constructor_fpu_round(ctx, &expr0_0, expr1_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::Trunc => { - // Rule at src/isa/aarch64/lower.isle line 384. - let expr0_0 = FpuRoundMode::Zero64; - let expr1_0 = C::put_in_reg(ctx, pattern5_1); - let expr2_0 = constructor_fpu_round(ctx, &expr0_0, expr1_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::Nearest => { - // Rule at src/isa/aarch64/lower.isle line 395. - let expr0_0 = FpuRoundMode::Nearest64; - let expr1_0 = C::put_in_reg(ctx, pattern5_1); - let expr2_0 = constructor_fpu_round(ctx, &expr0_0, expr1_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::Fpromote => { - // Rule at src/isa/aarch64/lower.isle line 346. - let expr0_0 = FPUOp1::Cvt32To64; - let expr1_0 = C::put_in_reg(ctx, pattern5_1); - let expr2_0 = ScalarSize::Size32; - let expr3_0 = constructor_fpu_rr(ctx, &expr0_0, expr1_0, &expr2_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - &Opcode::FcvtFromUint => { - let pattern7_0 = C::value_type(ctx, pattern5_1); - if let Some(pattern8_0) = C::fits_in_32(ctx, pattern7_0) { - // Rule at src/isa/aarch64/lower.isle line 450. - let expr0_0 = IntToFpuOp::U32ToF64; - let expr1_0 = constructor_put_in_reg_zext32(ctx, pattern5_1); - let expr2_0 = constructor_int_to_fpu(ctx, &expr0_0, expr1_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - } - &Opcode::FcvtFromSint => { - let pattern7_0 = C::value_type(ctx, pattern5_1); - if let Some(pattern8_0) = C::fits_in_32(ctx, pattern7_0) { - // Rule at src/isa/aarch64/lower.isle line 470. - let expr0_0 = IntToFpuOp::I32ToF64; - let expr1_0 = constructor_put_in_reg_sext32(ctx, pattern5_1); - let expr2_0 = constructor_int_to_fpu(ctx, &expr0_0, expr1_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - } - _ => {} - } - } - &InstructionData::Load { - opcode: ref pattern5_0, - arg: pattern5_1, - flags: pattern5_2, - offset: pattern5_3, - } => { - if let &Opcode::Load = pattern5_0 { - // Rule at src/isa/aarch64/lower.isle line 2122. - let expr0_0: Type = F64; - let expr1_0 = C::offset32_to_u32(ctx, pattern5_3); - let expr2_0 = C::amode(ctx, expr0_0, pattern5_1, expr1_0); - let expr3_0 = constructor_aarch64_fpuload64(ctx, &expr2_0, pattern5_2); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - } - _ => {} - } - } - if pattern2_0 == I8X16 { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Unary { - opcode: ref pattern5_0, - arg: pattern5_1, - } = &pattern4_0 - { - if let &Opcode::Popcnt = pattern5_0 { - // Rule at src/isa/aarch64/lower.isle line 1638. - let expr0_0 = C::put_in_reg(ctx, pattern5_1); - let expr1_0 = VectorSize::Size8x16; - let expr2_0 = constructor_vec_cnt(ctx, expr0_0, &expr1_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - } - } - if pattern2_0 == I16X8 { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Binary { - opcode: ref pattern5_0, - args: ref pattern5_1, - } = &pattern4_0 - { - match pattern5_0 { - &Opcode::Imul => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - if let Some(pattern8_0) = C::def_inst(ctx, pattern7_0) { - let pattern9_0 = C::inst_data(ctx, pattern8_0); - if let &InstructionData::Unary { - opcode: ref pattern10_0, - arg: pattern10_1, - } = &pattern9_0 - { - match pattern10_0 { - &Opcode::SwidenLow => { - let pattern12_0 = C::value_type(ctx, pattern10_1); - if pattern12_0 == I8X16 { - if let Some(pattern14_0) = C::def_inst(ctx, pattern7_1) - { - let pattern15_0 = C::inst_data(ctx, pattern14_0); - if let &InstructionData::Unary { - opcode: ref pattern16_0, - arg: pattern16_1, - } = &pattern15_0 - { - if let &Opcode::SwidenLow = pattern16_0 { - let pattern18_0 = - C::value_type(ctx, pattern16_1); - if pattern18_0 == I8X16 { - // Rule at src/isa/aarch64/lower.isle line 696. - let expr0_0 = - C::put_in_reg(ctx, pattern10_1); - let expr1_0 = - C::put_in_reg(ctx, pattern16_1); - let expr2_0: bool = false; - let expr3_0 = constructor_smull8( - ctx, expr0_0, expr1_0, expr2_0, - ); - let expr4_0 = constructor_output_reg( - ctx, expr3_0, - ); - return Some(expr4_0); - } - } - } - } - } - } - &Opcode::SwidenHigh => { - let pattern12_0 = C::value_type(ctx, pattern10_1); - if pattern12_0 == I8X16 { - if let Some(pattern14_0) = C::def_inst(ctx, pattern7_1) - { - let pattern15_0 = C::inst_data(ctx, pattern14_0); - if let &InstructionData::Unary { - opcode: ref pattern16_0, - arg: pattern16_1, - } = &pattern15_0 - { - if let &Opcode::SwidenHigh = pattern16_0 { - let pattern18_0 = - C::value_type(ctx, pattern16_1); - if pattern18_0 == I8X16 { - // Rule at src/isa/aarch64/lower.isle line 702. - let expr0_0 = - C::put_in_reg(ctx, pattern10_1); - let expr1_0 = - C::put_in_reg(ctx, pattern16_1); - let expr2_0: bool = true; - let expr3_0 = constructor_smull8( - ctx, expr0_0, expr1_0, expr2_0, - ); - let expr4_0 = constructor_output_reg( - ctx, expr3_0, - ); - return Some(expr4_0); - } - } - } - } - } - } - &Opcode::UwidenLow => { - let pattern12_0 = C::value_type(ctx, pattern10_1); - if pattern12_0 == I8X16 { - if let Some(pattern14_0) = C::def_inst(ctx, pattern7_1) - { - let pattern15_0 = C::inst_data(ctx, pattern14_0); - if let &InstructionData::Unary { - opcode: ref pattern16_0, - arg: pattern16_1, - } = &pattern15_0 - { - if let &Opcode::UwidenLow = pattern16_0 { - let pattern18_0 = - C::value_type(ctx, pattern16_1); - if pattern18_0 == I8X16 { - // Rule at src/isa/aarch64/lower.isle line 708. - let expr0_0 = - C::put_in_reg(ctx, pattern10_1); - let expr1_0 = - C::put_in_reg(ctx, pattern16_1); - let expr2_0: bool = false; - let expr3_0 = constructor_umull8( - ctx, expr0_0, expr1_0, expr2_0, - ); - let expr4_0 = constructor_output_reg( - ctx, expr3_0, - ); - return Some(expr4_0); - } - } - } - } - } - } - &Opcode::UwidenHigh => { - let pattern12_0 = C::value_type(ctx, pattern10_1); - if pattern12_0 == I8X16 { - if let Some(pattern14_0) = C::def_inst(ctx, pattern7_1) - { - let pattern15_0 = C::inst_data(ctx, pattern14_0); - if let &InstructionData::Unary { - opcode: ref pattern16_0, - arg: pattern16_1, - } = &pattern15_0 - { - if let &Opcode::UwidenHigh = pattern16_0 { - let pattern18_0 = - C::value_type(ctx, pattern16_1); - if pattern18_0 == I8X16 { - // Rule at src/isa/aarch64/lower.isle line 714. - let expr0_0 = - C::put_in_reg(ctx, pattern10_1); - let expr1_0 = - C::put_in_reg(ctx, pattern16_1); - let expr2_0: bool = true; - let expr3_0 = constructor_umull8( - ctx, expr0_0, expr1_0, expr2_0, - ); - let expr4_0 = constructor_output_reg( - ctx, expr3_0, - ); - return Some(expr4_0); - } - } - } - } - } - } - _ => {} - } - } - } - } - &Opcode::IaddPairwise => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - if let Some(pattern8_0) = C::def_inst(ctx, pattern7_0) { - let pattern9_0 = C::inst_data(ctx, pattern8_0); - if let &InstructionData::Unary { - opcode: ref pattern10_0, - arg: pattern10_1, - } = &pattern9_0 - { - match pattern10_0 { - &Opcode::SwidenLow => { - if let Some(pattern12_0) = C::def_inst(ctx, pattern7_1) { - let pattern13_0 = C::inst_data(ctx, pattern12_0); - if let &InstructionData::Unary { - opcode: ref pattern14_0, - arg: pattern14_1, - } = &pattern13_0 - { - if let &Opcode::SwidenHigh = pattern14_0 { - if pattern14_1 == pattern10_1 { - // Rule at src/isa/aarch64/lower.isle line 207. - let expr0_0 = - C::put_in_reg(ctx, pattern10_1); - let expr1_0 = - constructor_saddlp8(ctx, expr0_0); - let expr2_0 = - constructor_output_reg(ctx, expr1_0); - return Some(expr2_0); - } - } - } - } - } - &Opcode::UwidenLow => { - if let Some(pattern12_0) = C::def_inst(ctx, pattern7_1) { - let pattern13_0 = C::inst_data(ctx, pattern12_0); - if let &InstructionData::Unary { - opcode: ref pattern14_0, - arg: pattern14_1, - } = &pattern13_0 - { - if let &Opcode::UwidenHigh = pattern14_0 { - if pattern14_1 == pattern10_1 { - // Rule at src/isa/aarch64/lower.isle line 213. - let expr0_0 = - C::put_in_reg(ctx, pattern10_1); - let expr1_0 = - constructor_uaddlp8(ctx, expr0_0); - let expr2_0 = - constructor_output_reg(ctx, expr1_0); - return Some(expr2_0); - } - } - } - } - } - _ => {} - } - } - } - } - _ => {} - } - } - } - if pattern2_0 == I32X4 { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Binary { - opcode: ref pattern5_0, - args: ref pattern5_1, - } = &pattern4_0 - { - match pattern5_0 { - &Opcode::Imul => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - if let Some(pattern8_0) = C::def_inst(ctx, pattern7_0) { - let pattern9_0 = C::inst_data(ctx, pattern8_0); - if let &InstructionData::Unary { - opcode: ref pattern10_0, - arg: pattern10_1, - } = &pattern9_0 - { - match pattern10_0 { - &Opcode::SwidenLow => { - let pattern12_0 = C::value_type(ctx, pattern10_1); - if pattern12_0 == I16X8 { - if let Some(pattern14_0) = C::def_inst(ctx, pattern7_1) - { - let pattern15_0 = C::inst_data(ctx, pattern14_0); - if let &InstructionData::Unary { - opcode: ref pattern16_0, - arg: pattern16_1, - } = &pattern15_0 - { - if let &Opcode::SwidenLow = pattern16_0 { - let pattern18_0 = - C::value_type(ctx, pattern16_1); - if pattern18_0 == I16X8 { - // Rule at src/isa/aarch64/lower.isle line 720. - let expr0_0 = - C::put_in_reg(ctx, pattern10_1); - let expr1_0 = - C::put_in_reg(ctx, pattern16_1); - let expr2_0: bool = false; - let expr3_0 = constructor_smull16( - ctx, expr0_0, expr1_0, expr2_0, - ); - let expr4_0 = constructor_output_reg( - ctx, expr3_0, - ); - return Some(expr4_0); - } - } - } - } - } - } - &Opcode::SwidenHigh => { - let pattern12_0 = C::value_type(ctx, pattern10_1); - if pattern12_0 == I16X8 { - if let Some(pattern14_0) = C::def_inst(ctx, pattern7_1) - { - let pattern15_0 = C::inst_data(ctx, pattern14_0); - if let &InstructionData::Unary { - opcode: ref pattern16_0, - arg: pattern16_1, - } = &pattern15_0 - { - if let &Opcode::SwidenHigh = pattern16_0 { - let pattern18_0 = - C::value_type(ctx, pattern16_1); - if pattern18_0 == I16X8 { - // Rule at src/isa/aarch64/lower.isle line 726. - let expr0_0 = - C::put_in_reg(ctx, pattern10_1); - let expr1_0 = - C::put_in_reg(ctx, pattern16_1); - let expr2_0: bool = true; - let expr3_0 = constructor_smull16( - ctx, expr0_0, expr1_0, expr2_0, - ); - let expr4_0 = constructor_output_reg( - ctx, expr3_0, - ); - return Some(expr4_0); - } - } - } - } - } - } - &Opcode::UwidenLow => { - let pattern12_0 = C::value_type(ctx, pattern10_1); - if pattern12_0 == I16X8 { - if let Some(pattern14_0) = C::def_inst(ctx, pattern7_1) - { - let pattern15_0 = C::inst_data(ctx, pattern14_0); - if let &InstructionData::Unary { - opcode: ref pattern16_0, - arg: pattern16_1, - } = &pattern15_0 - { - if let &Opcode::UwidenLow = pattern16_0 { - let pattern18_0 = - C::value_type(ctx, pattern16_1); - if pattern18_0 == I16X8 { - // Rule at src/isa/aarch64/lower.isle line 732. - let expr0_0 = - C::put_in_reg(ctx, pattern10_1); - let expr1_0 = - C::put_in_reg(ctx, pattern16_1); - let expr2_0: bool = false; - let expr3_0 = constructor_umull16( - ctx, expr0_0, expr1_0, expr2_0, - ); - let expr4_0 = constructor_output_reg( - ctx, expr3_0, - ); - return Some(expr4_0); - } - } - } - } - } - } - &Opcode::UwidenHigh => { - let pattern12_0 = C::value_type(ctx, pattern10_1); - if pattern12_0 == I16X8 { - if let Some(pattern14_0) = C::def_inst(ctx, pattern7_1) - { - let pattern15_0 = C::inst_data(ctx, pattern14_0); - if let &InstructionData::Unary { - opcode: ref pattern16_0, - arg: pattern16_1, - } = &pattern15_0 - { - if let &Opcode::UwidenHigh = pattern16_0 { - let pattern18_0 = - C::value_type(ctx, pattern16_1); - if pattern18_0 == I16X8 { - // Rule at src/isa/aarch64/lower.isle line 738. - let expr0_0 = - C::put_in_reg(ctx, pattern10_1); - let expr1_0 = - C::put_in_reg(ctx, pattern16_1); - let expr2_0: bool = true; - let expr3_0 = constructor_umull16( - ctx, expr0_0, expr1_0, expr2_0, - ); - let expr4_0 = constructor_output_reg( - ctx, expr3_0, - ); - return Some(expr4_0); - } - } - } - } - } - } - _ => {} - } - } - } - } - &Opcode::IaddPairwise => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - if let Some(pattern8_0) = C::def_inst(ctx, pattern7_0) { - let pattern9_0 = C::inst_data(ctx, pattern8_0); - if let &InstructionData::Unary { - opcode: ref pattern10_0, - arg: pattern10_1, - } = &pattern9_0 - { - match pattern10_0 { - &Opcode::SwidenLow => { - if let Some(pattern12_0) = C::def_inst(ctx, pattern7_1) { - let pattern13_0 = C::inst_data(ctx, pattern12_0); - if let &InstructionData::Unary { - opcode: ref pattern14_0, - arg: pattern14_1, - } = &pattern13_0 - { - if let &Opcode::SwidenHigh = pattern14_0 { - if pattern14_1 == pattern10_1 { - // Rule at src/isa/aarch64/lower.isle line 210. - let expr0_0 = - C::put_in_reg(ctx, pattern10_1); - let expr1_0 = - constructor_saddlp16(ctx, expr0_0); - let expr2_0 = - constructor_output_reg(ctx, expr1_0); - return Some(expr2_0); - } - } - } - } - } - &Opcode::UwidenLow => { - if let Some(pattern12_0) = C::def_inst(ctx, pattern7_1) { - let pattern13_0 = C::inst_data(ctx, pattern12_0); - if let &InstructionData::Unary { - opcode: ref pattern14_0, - arg: pattern14_1, - } = &pattern13_0 - { - if let &Opcode::UwidenHigh = pattern14_0 { - if pattern14_1 == pattern10_1 { - // Rule at src/isa/aarch64/lower.isle line 216. - let expr0_0 = - C::put_in_reg(ctx, pattern10_1); - let expr1_0 = - constructor_uaddlp16(ctx, expr0_0); - let expr2_0 = - constructor_output_reg(ctx, expr1_0); - return Some(expr2_0); - } - } - } - } - } - _ => {} - } - } - } - } - &Opcode::WideningPairwiseDotProductS => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 2040. - let expr0_0 = VecRRRLongOp::Smull16; - let expr1_0 = C::put_in_reg(ctx, pattern7_0); - let expr2_0 = C::put_in_reg(ctx, pattern7_1); - let expr3_0: bool = false; - let expr4_0 = - constructor_vec_rrr_long(ctx, &expr0_0, expr1_0, expr2_0, expr3_0); - let expr5_0 = VecRRRLongOp::Smull16; - let expr6_0 = C::put_in_reg(ctx, pattern7_0); - let expr7_0 = C::put_in_reg(ctx, pattern7_1); - let expr8_0: bool = true; - let expr9_0 = - constructor_vec_rrr_long(ctx, &expr5_0, expr6_0, expr7_0, expr8_0); - let expr10_0 = VecALUOp::Addp; - let expr11_0 = VectorSize::Size32x4; - let expr12_0 = - constructor_vec_rrr(ctx, &expr10_0, expr4_0, expr9_0, &expr11_0); - let expr13_0 = constructor_output_reg(ctx, expr12_0); - return Some(expr13_0); - } - _ => {} - } - } - } - if pattern2_0 == I64X2 { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Binary { - opcode: ref pattern5_0, - args: ref pattern5_1, - } = &pattern4_0 - { - match pattern5_0 { - &Opcode::AvgRound => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 235. - let expr0_0: u64 = 1i128 as u64; - let expr1_0 = VectorSize::Size64x2; - let expr2_0 = C::splat_const(ctx, expr0_0, &expr1_0); - let expr3_0 = C::put_in_reg(ctx, pattern7_0); - let expr4_0 = C::put_in_reg(ctx, pattern7_1); - let expr5_0 = VectorSize::Size64x2; - let expr6_0 = constructor_orr_vec(ctx, expr3_0, expr4_0, &expr5_0); - let expr7_0 = VectorSize::Size64x2; - let expr8_0 = constructor_and_vec(ctx, expr6_0, expr2_0, &expr7_0); - let expr9_0 = VecShiftImmOp::Ushr; - let expr10_0: u8 = 1i128 as u8; - let expr11_0 = C::put_in_reg(ctx, pattern7_0); - let expr12_0 = VectorSize::Size64x2; - let expr13_0 = - constructor_vec_shift_imm(ctx, &expr9_0, expr10_0, expr11_0, &expr12_0); - let expr14_0 = VecShiftImmOp::Ushr; - let expr15_0: u8 = 1i128 as u8; - let expr16_0 = C::put_in_reg(ctx, pattern7_1); - let expr17_0 = VectorSize::Size64x2; - let expr18_0 = constructor_vec_shift_imm( - ctx, &expr14_0, expr15_0, expr16_0, &expr17_0, - ); - let expr19_0 = VectorSize::Size64x2; - let expr20_0 = constructor_add_vec(ctx, expr13_0, expr18_0, &expr19_0); - let expr21_0 = VectorSize::Size64x2; - let expr22_0 = constructor_add_vec(ctx, expr8_0, expr20_0, &expr21_0); - let expr23_0 = constructor_output_reg(ctx, expr22_0); - return Some(expr23_0); - } - &Opcode::Imul => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - if let Some(pattern8_0) = C::def_inst(ctx, pattern7_0) { - let pattern9_0 = C::inst_data(ctx, pattern8_0); - if let &InstructionData::Unary { - opcode: ref pattern10_0, - arg: pattern10_1, - } = &pattern9_0 - { - match pattern10_0 { - &Opcode::SwidenLow => { - let pattern12_0 = C::value_type(ctx, pattern10_1); - if pattern12_0 == I32X4 { - if let Some(pattern14_0) = C::def_inst(ctx, pattern7_1) - { - let pattern15_0 = C::inst_data(ctx, pattern14_0); - if let &InstructionData::Unary { - opcode: ref pattern16_0, - arg: pattern16_1, - } = &pattern15_0 - { - if let &Opcode::SwidenLow = pattern16_0 { - let pattern18_0 = - C::value_type(ctx, pattern16_1); - if pattern18_0 == I32X4 { - // Rule at src/isa/aarch64/lower.isle line 744. - let expr0_0 = - C::put_in_reg(ctx, pattern10_1); - let expr1_0 = - C::put_in_reg(ctx, pattern16_1); - let expr2_0: bool = false; - let expr3_0 = constructor_smull32( - ctx, expr0_0, expr1_0, expr2_0, - ); - let expr4_0 = constructor_output_reg( - ctx, expr3_0, - ); - return Some(expr4_0); - } - } - } - } - } - } - &Opcode::SwidenHigh => { - let pattern12_0 = C::value_type(ctx, pattern10_1); - if pattern12_0 == I32X4 { - if let Some(pattern14_0) = C::def_inst(ctx, pattern7_1) - { - let pattern15_0 = C::inst_data(ctx, pattern14_0); - if let &InstructionData::Unary { - opcode: ref pattern16_0, - arg: pattern16_1, - } = &pattern15_0 - { - if let &Opcode::SwidenHigh = pattern16_0 { - let pattern18_0 = - C::value_type(ctx, pattern16_1); - if pattern18_0 == I32X4 { - // Rule at src/isa/aarch64/lower.isle line 750. - let expr0_0 = - C::put_in_reg(ctx, pattern10_1); - let expr1_0 = - C::put_in_reg(ctx, pattern16_1); - let expr2_0: bool = true; - let expr3_0 = constructor_smull32( - ctx, expr0_0, expr1_0, expr2_0, - ); - let expr4_0 = constructor_output_reg( - ctx, expr3_0, - ); - return Some(expr4_0); - } - } - } - } - } - } - &Opcode::UwidenLow => { - let pattern12_0 = C::value_type(ctx, pattern10_1); - if pattern12_0 == I32X4 { - if let Some(pattern14_0) = C::def_inst(ctx, pattern7_1) - { - let pattern15_0 = C::inst_data(ctx, pattern14_0); - if let &InstructionData::Unary { - opcode: ref pattern16_0, - arg: pattern16_1, - } = &pattern15_0 - { - if let &Opcode::UwidenLow = pattern16_0 { - let pattern18_0 = - C::value_type(ctx, pattern16_1); - if pattern18_0 == I32X4 { - // Rule at src/isa/aarch64/lower.isle line 756. - let expr0_0 = - C::put_in_reg(ctx, pattern10_1); - let expr1_0 = - C::put_in_reg(ctx, pattern16_1); - let expr2_0: bool = false; - let expr3_0 = constructor_umull32( - ctx, expr0_0, expr1_0, expr2_0, - ); - let expr4_0 = constructor_output_reg( - ctx, expr3_0, - ); - return Some(expr4_0); - } - } - } - } - } - } - &Opcode::UwidenHigh => { - let pattern12_0 = C::value_type(ctx, pattern10_1); - if pattern12_0 == I32X4 { - if let Some(pattern14_0) = C::def_inst(ctx, pattern7_1) - { - let pattern15_0 = C::inst_data(ctx, pattern14_0); - if let &InstructionData::Unary { - opcode: ref pattern16_0, - arg: pattern16_1, - } = &pattern15_0 - { - if let &Opcode::UwidenHigh = pattern16_0 { - let pattern18_0 = - C::value_type(ctx, pattern16_1); - if pattern18_0 == I32X4 { - // Rule at src/isa/aarch64/lower.isle line 762. - let expr0_0 = - C::put_in_reg(ctx, pattern10_1); - let expr1_0 = - C::put_in_reg(ctx, pattern16_1); - let expr2_0: bool = true; - let expr3_0 = constructor_umull32( - ctx, expr0_0, expr1_0, expr2_0, - ); - let expr4_0 = constructor_output_reg( - ctx, expr3_0, - ); - return Some(expr4_0); - } - } - } - } - } - } - _ => {} - } - } - } - } - _ => {} - } - } - } - if pattern2_0 == F32X4 { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Unary { - opcode: ref pattern5_0, - arg: pattern5_1, - } = &pattern4_0 - { - if let &Opcode::ScalarToVector = pattern5_0 { - // Rule at src/isa/aarch64/lower.isle line 146. - let expr0_0 = C::put_in_reg(ctx, pattern5_1); - let expr1_0 = ScalarSize::Size32; - let expr2_0 = constructor_fpu_extend(ctx, expr0_0, &expr1_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - } - } - if pattern2_0 == F64X2 { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Unary { - opcode: ref pattern5_0, - arg: pattern5_1, - } = &pattern4_0 - { - match pattern5_0 { - &Opcode::ScalarToVector => { - // Rule at src/isa/aarch64/lower.isle line 149. - let expr0_0 = C::put_in_reg(ctx, pattern5_1); - let expr1_0 = ScalarSize::Size64; - let expr2_0 = constructor_fpu_extend(ctx, expr0_0, &expr1_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::FcvtLowFromSint => { - // Rule at src/isa/aarch64/lower.isle line 2458. - let expr0_0 = VecExtendOp::Sxtl; - let expr1_0 = C::put_in_reg(ctx, pattern5_1); - let expr2_0: bool = false; - let expr3_0 = ScalarSize::Size64; - let expr4_0 = - constructor_vec_extend(ctx, &expr0_0, expr1_0, expr2_0, &expr3_0); - let expr5_0 = VecMisc2::Scvtf; - let expr6_0 = VectorSize::Size64x2; - let expr7_0 = constructor_vec_misc(ctx, &expr5_0, expr4_0, &expr6_0); - let expr8_0 = constructor_output_reg(ctx, expr7_0); - return Some(expr8_0); - } - _ => {} - } - } - } - if let Some(()) = C::not_i64x2(ctx, pattern2_0) { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Binary { - opcode: ref pattern5_0, - args: ref pattern5_1, - } = &pattern4_0 - { - match pattern5_0 { - &Opcode::Smin => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 920. - let expr0_0 = VecALUOp::Smin; - let expr1_0 = C::put_in_reg(ctx, pattern7_0); - let expr2_0 = C::put_in_reg(ctx, pattern7_1); - let expr3_0 = constructor_vector_size(ctx, pattern2_0); - let expr4_0 = - constructor_vec_rrr(ctx, &expr0_0, expr1_0, expr2_0, &expr3_0); - let expr5_0 = constructor_output_reg(ctx, expr4_0); - return Some(expr5_0); - } - &Opcode::Umin => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 926. - let expr0_0 = VecALUOp::Umin; - let expr1_0 = C::put_in_reg(ctx, pattern7_0); - let expr2_0 = C::put_in_reg(ctx, pattern7_1); - let expr3_0 = constructor_vector_size(ctx, pattern2_0); - let expr4_0 = - constructor_vec_rrr(ctx, &expr0_0, expr1_0, expr2_0, &expr3_0); - let expr5_0 = constructor_output_reg(ctx, expr4_0); - return Some(expr5_0); - } - &Opcode::Smax => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 932. - let expr0_0 = VecALUOp::Smax; - let expr1_0 = C::put_in_reg(ctx, pattern7_0); - let expr2_0 = C::put_in_reg(ctx, pattern7_1); - let expr3_0 = constructor_vector_size(ctx, pattern2_0); - let expr4_0 = - constructor_vec_rrr(ctx, &expr0_0, expr1_0, expr2_0, &expr3_0); - let expr5_0 = constructor_output_reg(ctx, expr4_0); - return Some(expr5_0); - } - &Opcode::Umax => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 938. - let expr0_0 = VecALUOp::Umax; - let expr1_0 = C::put_in_reg(ctx, pattern7_0); - let expr2_0 = C::put_in_reg(ctx, pattern7_1); - let expr3_0 = constructor_vector_size(ctx, pattern2_0); - let expr4_0 = - constructor_vec_rrr(ctx, &expr0_0, expr1_0, expr2_0, &expr3_0); - let expr5_0 = constructor_output_reg(ctx, expr4_0); - return Some(expr5_0); - } - _ => {} - } - } - } - if let Some((pattern3_0, pattern3_1)) = C::multi_lane(ctx, pattern2_0) { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - match &pattern4_0 { - &InstructionData::Unary { - opcode: ref pattern5_0, - arg: pattern5_1, - } => { - if let &Opcode::Iabs = pattern5_0 { - // Rule at src/isa/aarch64/lower.isle line 224. - let expr0_0 = C::put_in_reg(ctx, pattern5_1); - let expr1_0 = constructor_vector_size(ctx, pattern2_0); - let expr2_0 = constructor_vec_abs(ctx, expr0_0, &expr1_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - } - &InstructionData::Binary { - opcode: ref pattern5_0, - args: ref pattern5_1, - } => { - if let &Opcode::SqmulRoundSat = pattern5_0 { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 251. - let expr0_0 = VecALUOp::Sqrdmulh; - let expr1_0 = C::put_in_reg(ctx, pattern7_0); - let expr2_0 = C::put_in_reg(ctx, pattern7_1); - let expr3_0 = constructor_vector_size(ctx, pattern2_0); - let expr4_0 = - constructor_vec_rrr(ctx, &expr0_0, expr1_0, expr2_0, &expr3_0); - let expr5_0 = constructor_output_reg(ctx, expr4_0); - return Some(expr5_0); - } - } - &InstructionData::IntCompare { - opcode: ref pattern5_0, - args: ref pattern5_1, - cond: ref pattern5_2, - } => { - if let &Opcode::Icmp = pattern5_0 { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - if let Some(pattern8_0) = C::icmp_zero_cond(ctx, pattern5_2) { - let mut closure9 = || { - let expr0_0 = C::zero_value(ctx, pattern7_0)?; - return Some(expr0_0); - }; - if let Some(pattern9_0) = closure9() { - // Rule at src/isa/aarch64/lower.isle line 1721. - let expr0_0 = C::put_in_reg(ctx, pattern7_1); - let expr1_0 = constructor_vector_size(ctx, pattern2_0); - let expr2_0 = constructor_int_cmp_zero_swap( - ctx, - &pattern8_0, - expr0_0, - &expr1_0, - ); - let expr3_0 = C::value_reg(ctx, expr2_0); - let expr4_0 = C::output(ctx, expr3_0); - return Some(expr4_0); - } - } - } - } - &InstructionData::Ternary { - opcode: ref pattern5_0, - args: ref pattern5_1, - } => { - if let &Opcode::Fma = pattern5_0 { - let (pattern7_0, pattern7_1, pattern7_2) = - C::unpack_value_array_3(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 400. - let expr0_0 = VecALUModOp::Fmla; - let expr1_0 = C::put_in_reg(ctx, pattern7_2); - let expr2_0 = C::put_in_reg(ctx, pattern7_0); - let expr3_0 = C::put_in_reg(ctx, pattern7_1); - let expr4_0 = constructor_vector_size(ctx, pattern2_0); - let expr5_0 = constructor_vec_rrr_mod( - ctx, &expr0_0, expr1_0, expr2_0, expr3_0, &expr4_0, - ); - let expr6_0 = constructor_output_reg(ctx, expr5_0); - return Some(expr6_0); - } - } - _ => {} - } - } - if let Some(pattern3_0) = C::fits_in_16(ctx, pattern2_0) { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Binary { - opcode: ref pattern5_0, - args: ref pattern5_1, - } = &pattern4_0 - { - if let &Opcode::IaddCout = pattern5_0 { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 2412. - let expr0_0: bool = true; - let expr1_0 = constructor_lower_extend_op(ctx, pattern3_0, expr0_0); - let expr2_0 = constructor_put_in_reg_sext32(ctx, pattern7_0); - let expr3_0 = C::put_in_reg(ctx, pattern7_1); - let expr4_0 = - constructor_add_extend_op(ctx, pattern3_0, expr2_0, expr3_0, &expr1_0); - let expr5_0 = OperandSize::Size32; - let expr6_0 = constructor_cmp_extend(ctx, &expr5_0, expr4_0, expr4_0, &expr1_0); - let expr7_0 = Cond::Ne; - let expr8_0 = constructor_cset(ctx, &expr7_0); - let expr9_0 = constructor_with_flags_reg(ctx, &expr6_0, &expr8_0); - let expr10_0 = C::value_reg(ctx, expr4_0); - let expr11_0 = C::value_reg(ctx, expr9_0); - let expr12_0 = C::output_pair(ctx, expr10_0, expr11_0); - return Some(expr12_0); - } - } - } - if let Some(pattern3_0) = C::fits_in_32(ctx, pattern2_0) { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - match &pattern4_0 { - &InstructionData::Unary { - opcode: ref pattern5_0, - arg: pattern5_1, - } => { - match pattern5_0 { - &Opcode::FcvtToUint => { - let pattern7_0 = C::value_type(ctx, pattern5_1); - if pattern7_0 == F32 { - // Rule at src/isa/aarch64/lower.isle line 413. - let expr0_0 = FpuToIntOp::F32ToU32; - let expr1_0 = C::put_in_reg(ctx, pattern5_1); - let expr2_0: bool = false; - let expr3_0: Type = F32; - let expr4_0 = constructor_fpu_to_int_cvt( - ctx, &expr0_0, expr1_0, expr2_0, expr3_0, pattern3_0, - ); - let expr5_0 = constructor_output_reg(ctx, expr4_0); - return Some(expr5_0); - } - if pattern7_0 == F64 { - // Rule at src/isa/aarch64/lower.isle line 419. - let expr0_0 = FpuToIntOp::F64ToU32; - let expr1_0 = C::put_in_reg(ctx, pattern5_1); - let expr2_0: bool = false; - let expr3_0: Type = F64; - let expr4_0 = constructor_fpu_to_int_cvt( - ctx, &expr0_0, expr1_0, expr2_0, expr3_0, pattern3_0, - ); - let expr5_0 = constructor_output_reg(ctx, expr4_0); - return Some(expr5_0); - } - } - &Opcode::FcvtToSint => { - let pattern7_0 = C::value_type(ctx, pattern5_1); - if pattern7_0 == F32 { - // Rule at src/isa/aarch64/lower.isle line 427. - let expr0_0 = FpuToIntOp::F32ToI32; - let expr1_0 = C::put_in_reg(ctx, pattern5_1); - let expr2_0: bool = true; - let expr3_0: Type = F32; - let expr4_0 = constructor_fpu_to_int_cvt( - ctx, &expr0_0, expr1_0, expr2_0, expr3_0, pattern3_0, - ); - let expr5_0 = constructor_output_reg(ctx, expr4_0); - return Some(expr5_0); - } - if pattern7_0 == F64 { - // Rule at src/isa/aarch64/lower.isle line 433. - let expr0_0 = FpuToIntOp::F64ToI32; - let expr1_0 = C::put_in_reg(ctx, pattern5_1); - let expr2_0: bool = true; - let expr3_0: Type = F64; - let expr4_0 = constructor_fpu_to_int_cvt( - ctx, &expr0_0, expr1_0, expr2_0, expr3_0, pattern3_0, - ); - let expr5_0 = constructor_output_reg(ctx, expr4_0); - return Some(expr5_0); - } - } - &Opcode::FcvtToUintSat => { - let pattern7_0 = C::value_type(ctx, pattern5_1); - if pattern7_0 == F32 { - // Rule at src/isa/aarch64/lower.isle line 487. - let expr0_0 = FpuToIntOp::F32ToU32; - let expr1_0 = C::put_in_reg(ctx, pattern5_1); - let expr2_0: bool = false; - let expr3_0 = constructor_fpu_to_int_cvt_sat( - ctx, &expr0_0, expr1_0, expr2_0, pattern3_0, - ); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - if pattern7_0 == F64 { - // Rule at src/isa/aarch64/lower.isle line 493. - let expr0_0 = FpuToIntOp::F64ToU32; - let expr1_0 = C::put_in_reg(ctx, pattern5_1); - let expr2_0: bool = false; - let expr3_0 = constructor_fpu_to_int_cvt_sat( - ctx, &expr0_0, expr1_0, expr2_0, pattern3_0, - ); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - } - &Opcode::FcvtToSintSat => { - let pattern7_0 = C::value_type(ctx, pattern5_1); - if pattern7_0 == F32 { - // Rule at src/isa/aarch64/lower.isle line 507. - let expr0_0 = FpuToIntOp::F32ToI32; - let expr1_0 = C::put_in_reg(ctx, pattern5_1); - let expr2_0: bool = true; - let expr3_0 = constructor_fpu_to_int_cvt_sat( - ctx, &expr0_0, expr1_0, expr2_0, pattern3_0, - ); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - if pattern7_0 == F64 { - // Rule at src/isa/aarch64/lower.isle line 513. - let expr0_0 = FpuToIntOp::F64ToI32; - let expr1_0 = C::put_in_reg(ctx, pattern5_1); - let expr2_0: bool = true; - let expr3_0 = constructor_fpu_to_int_cvt_sat( - ctx, &expr0_0, expr1_0, expr2_0, pattern3_0, - ); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - } - _ => {} - } - } - &InstructionData::Binary { - opcode: ref pattern5_0, - args: ref pattern5_1, - } => { - match pattern5_0 { - &Opcode::Umulhi => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 784. - let expr0_0 = constructor_put_in_reg_zext64(ctx, pattern7_0); - let expr1_0 = constructor_put_in_reg_zext64(ctx, pattern7_1); - let expr2_0: Type = I64; - let expr3_0 = C::zero_reg(ctx); - let expr4_0 = constructor_madd(ctx, expr2_0, expr0_0, expr1_0, expr3_0); - let expr5_0: Type = I64; - let expr6_0 = C::ty_bits(ctx, pattern3_0); - let expr7_0 = C::imm_shift_from_u8(ctx, expr6_0); - let expr8_0 = constructor_lsr_imm(ctx, expr5_0, expr4_0, expr7_0); - let expr9_0 = C::value_reg(ctx, expr8_0); - let expr10_0 = C::output(ctx, expr9_0); - return Some(expr10_0); - } - &Opcode::Smulhi => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 772. - let expr0_0 = constructor_put_in_reg_sext64(ctx, pattern7_0); - let expr1_0 = constructor_put_in_reg_sext64(ctx, pattern7_1); - let expr2_0: Type = I64; - let expr3_0 = C::zero_reg(ctx); - let expr4_0 = constructor_madd(ctx, expr2_0, expr0_0, expr1_0, expr3_0); - let expr5_0: Type = I64; - let expr6_0 = C::ty_bits(ctx, pattern3_0); - let expr7_0 = C::imm_shift_from_u8(ctx, expr6_0); - let expr8_0 = constructor_asr_imm(ctx, expr5_0, expr4_0, expr7_0); - let expr9_0 = constructor_output_reg(ctx, expr8_0); - return Some(expr9_0); - } - _ => {} - } - } - _ => {} - } - } - if let Some(pattern3_0) = C::fits_in_64(ctx, pattern2_0) { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - match &pattern4_0 { - &InstructionData::Binary { - opcode: ref pattern5_0, - args: ref pattern5_1, - } => { - match pattern5_0 { - &Opcode::Iadd => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - if let Some(pattern8_0) = C::extended_value_from_value(ctx, pattern7_1) - { - // Rule at src/isa/aarch64/lower.isle line 67. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = - constructor_add_extend(ctx, pattern3_0, expr0_0, &pattern8_0); - let expr2_0 = constructor_output_reg(ctx, expr1_0); - return Some(expr2_0); - } - } - &Opcode::Isub => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - if let Some(pattern8_0) = C::def_inst(ctx, pattern7_1) { - let pattern9_0 = C::inst_data(ctx, pattern8_0); - match &pattern9_0 { - &InstructionData::UnaryImm { - opcode: ref pattern10_0, - imm: pattern10_1, - } => { - if let &Opcode::Iconst = pattern10_0 { - let pattern12_0 = C::u64_from_imm64(ctx, pattern10_1); - if let Some(pattern13_0) = - C::imm12_from_u64(ctx, pattern12_0) - { - // Rule at src/isa/aarch64/lower.isle line 528. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = constructor_sub_imm( - ctx, - pattern3_0, - expr0_0, - pattern13_0, - ); - let expr2_0 = constructor_output_reg(ctx, expr1_0); - return Some(expr2_0); - } - } - } - &InstructionData::Binary { - opcode: ref pattern10_0, - args: ref pattern10_1, - } => { - if let &Opcode::Imul = pattern10_0 { - let (pattern12_0, pattern12_1) = - C::unpack_value_array_2(ctx, pattern10_1); - // Rule at src/isa/aarch64/lower.isle line 93. - let expr0_0 = C::put_in_reg(ctx, pattern12_0); - let expr1_0 = C::put_in_reg(ctx, pattern12_1); - let expr2_0 = C::put_in_reg(ctx, pattern7_0); - let expr3_0 = constructor_msub( - ctx, pattern3_0, expr0_0, expr1_0, expr2_0, - ); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - } - _ => {} - } - } - } - &Opcode::Udiv => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 800. - let expr0_0: Type = I64; - let expr1_0 = constructor_put_in_reg_zext64(ctx, pattern7_0); - let expr2_0 = constructor_put_nonzero_in_reg_zext64(ctx, pattern7_1); - let expr3_0 = constructor_a64_udiv(ctx, expr0_0, expr1_0, expr2_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - &Opcode::Sdiv => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 833. - let expr0_0 = constructor_put_in_reg_sext64(ctx, pattern7_0); - let expr1_0 = constructor_put_nonzero_in_reg_sext64(ctx, pattern7_1); - let expr2_0 = - constructor_trap_if_div_overflow(ctx, pattern3_0, expr0_0, expr1_0); - let expr3_0: Type = I64; - let expr4_0 = constructor_a64_sdiv(ctx, expr3_0, expr2_0, expr1_0); - let expr5_0 = constructor_output_reg(ctx, expr4_0); - return Some(expr5_0); - } - &Opcode::Urem => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 874. - let expr0_0 = constructor_put_in_reg_zext64(ctx, pattern7_0); - let expr1_0 = constructor_put_nonzero_in_reg_zext64(ctx, pattern7_1); - let expr2_0: Type = I64; - let expr3_0 = constructor_a64_udiv(ctx, expr2_0, expr0_0, expr1_0); - let expr4_0: Type = I64; - let expr5_0 = constructor_msub(ctx, expr4_0, expr3_0, expr1_0, expr0_0); - let expr6_0 = constructor_output_reg(ctx, expr5_0); - return Some(expr6_0); - } - &Opcode::Srem => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 881. - let expr0_0 = constructor_put_in_reg_sext64(ctx, pattern7_0); - let expr1_0 = constructor_put_nonzero_in_reg_sext64(ctx, pattern7_1); - let expr2_0: Type = I64; - let expr3_0 = constructor_a64_sdiv(ctx, expr2_0, expr0_0, expr1_0); - let expr4_0: Type = I64; - let expr5_0 = constructor_msub(ctx, expr4_0, expr3_0, expr1_0, expr0_0); - let expr6_0 = constructor_output_reg(ctx, expr5_0); - return Some(expr6_0); - } - _ => {} - } - } - &InstructionData::IntAddTrap { - opcode: ref pattern5_0, - args: ref pattern5_1, - code: ref pattern5_2, - } => { - if let &Opcode::UaddOverflowTrap = pattern5_0 { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 2447. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = C::put_in_reg(ctx, pattern7_1); - let expr2_0 = - constructor_add_with_flags_paired(ctx, pattern3_0, expr0_0, expr1_0); - let expr3_0 = constructor_trap_if_overflow(ctx, &expr2_0, pattern5_2); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - } - _ => {} - } - } - if let Some(pattern3_0) = C::ty_int(ctx, pattern2_0) { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::BinaryImm8 { - opcode: ref pattern5_0, - arg: pattern5_1, - imm: pattern5_2, - } = &pattern4_0 - { - if let &Opcode::Extractlane = pattern5_0 { - let pattern7_0 = C::u8_from_uimm8(ctx, pattern5_2); - // Rule at src/isa/aarch64/lower.isle line 2308. - let expr0_0 = C::put_in_reg(ctx, pattern5_1); - let expr1_0 = constructor_scalar_size(ctx, pattern3_0); - let expr2_0 = constructor_mov_from_vec(ctx, expr0_0, pattern7_0, &expr1_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - } - } - if let Some(pattern3_0) = C::ty_scalar_float(ctx, pattern2_0) { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - match &pattern4_0 { - &InstructionData::Unary { - opcode: ref pattern5_0, - arg: pattern5_1, - } => { - match pattern5_0 { - &Opcode::Sqrt => { - // Rule at src/isa/aarch64/lower.isle line 325. - let expr0_0 = FPUOp1::Sqrt; - let expr1_0 = C::put_in_reg(ctx, pattern5_1); - let expr2_0 = constructor_scalar_size(ctx, pattern3_0); - let expr3_0 = constructor_fpu_rr(ctx, &expr0_0, expr1_0, &expr2_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - &Opcode::Fneg => { - // Rule at src/isa/aarch64/lower.isle line 333. - let expr0_0 = FPUOp1::Neg; - let expr1_0 = C::put_in_reg(ctx, pattern5_1); - let expr2_0 = constructor_scalar_size(ctx, pattern3_0); - let expr3_0 = constructor_fpu_rr(ctx, &expr0_0, expr1_0, &expr2_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - &Opcode::Fabs => { - // Rule at src/isa/aarch64/lower.isle line 341. - let expr0_0 = FPUOp1::Abs; - let expr1_0 = C::put_in_reg(ctx, pattern5_1); - let expr2_0 = constructor_scalar_size(ctx, pattern3_0); - let expr3_0 = constructor_fpu_rr(ctx, &expr0_0, expr1_0, &expr2_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - _ => {} - } - } - &InstructionData::Binary { - opcode: ref pattern5_0, - args: ref pattern5_1, - } => { - match pattern5_0 { - &Opcode::Fadd => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 259. - let expr0_0 = FPUOp2::Add; - let expr1_0 = C::put_in_reg(ctx, pattern7_0); - let expr2_0 = C::put_in_reg(ctx, pattern7_1); - let expr3_0 = constructor_scalar_size(ctx, pattern3_0); - let expr4_0 = - constructor_fpu_rrr(ctx, &expr0_0, expr1_0, expr2_0, &expr3_0); - let expr5_0 = constructor_output_reg(ctx, expr4_0); - return Some(expr5_0); - } - &Opcode::Fsub => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 267. - let expr0_0 = FPUOp2::Sub; - let expr1_0 = C::put_in_reg(ctx, pattern7_0); - let expr2_0 = C::put_in_reg(ctx, pattern7_1); - let expr3_0 = constructor_scalar_size(ctx, pattern3_0); - let expr4_0 = - constructor_fpu_rrr(ctx, &expr0_0, expr1_0, expr2_0, &expr3_0); - let expr5_0 = constructor_output_reg(ctx, expr4_0); - return Some(expr5_0); - } - &Opcode::Fmul => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 275. - let expr0_0 = FPUOp2::Mul; - let expr1_0 = C::put_in_reg(ctx, pattern7_0); - let expr2_0 = C::put_in_reg(ctx, pattern7_1); - let expr3_0 = constructor_scalar_size(ctx, pattern3_0); - let expr4_0 = - constructor_fpu_rrr(ctx, &expr0_0, expr1_0, expr2_0, &expr3_0); - let expr5_0 = constructor_output_reg(ctx, expr4_0); - return Some(expr5_0); - } - &Opcode::Fdiv => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 283. - let expr0_0 = FPUOp2::Div; - let expr1_0 = C::put_in_reg(ctx, pattern7_0); - let expr2_0 = C::put_in_reg(ctx, pattern7_1); - let expr3_0 = constructor_scalar_size(ctx, pattern3_0); - let expr4_0 = - constructor_fpu_rrr(ctx, &expr0_0, expr1_0, expr2_0, &expr3_0); - let expr5_0 = constructor_output_reg(ctx, expr4_0); - return Some(expr5_0); - } - &Opcode::Fmin => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 291. - let expr0_0 = FPUOp2::Min; - let expr1_0 = C::put_in_reg(ctx, pattern7_0); - let expr2_0 = C::put_in_reg(ctx, pattern7_1); - let expr3_0 = constructor_scalar_size(ctx, pattern3_0); - let expr4_0 = - constructor_fpu_rrr(ctx, &expr0_0, expr1_0, expr2_0, &expr3_0); - let expr5_0 = constructor_output_reg(ctx, expr4_0); - return Some(expr5_0); - } - &Opcode::FminPseudo => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 307. - let expr0_0 = constructor_scalar_size(ctx, pattern3_0); - let expr1_0 = C::put_in_reg(ctx, pattern7_0); - let expr2_0 = C::put_in_reg(ctx, pattern7_1); - let expr3_0 = constructor_fpu_cmp(ctx, &expr0_0, expr1_0, expr2_0); - let expr4_0 = Cond::Gt; - let expr5_0 = C::put_in_reg(ctx, pattern7_1); - let expr6_0 = C::put_in_reg(ctx, pattern7_0); - let expr7_0 = - constructor_fpu_csel(ctx, pattern3_0, &expr4_0, expr5_0, expr6_0); - let expr8_0 = constructor_with_flags(ctx, &expr3_0, &expr7_0); - let expr9_0 = C::output(ctx, expr8_0); - return Some(expr9_0); - } - &Opcode::Fmax => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 299. - let expr0_0 = FPUOp2::Max; - let expr1_0 = C::put_in_reg(ctx, pattern7_0); - let expr2_0 = C::put_in_reg(ctx, pattern7_1); - let expr3_0 = constructor_scalar_size(ctx, pattern3_0); - let expr4_0 = - constructor_fpu_rrr(ctx, &expr0_0, expr1_0, expr2_0, &expr3_0); - let expr5_0 = constructor_output_reg(ctx, expr4_0); - return Some(expr5_0); - } - &Opcode::FmaxPseudo => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 316. - let expr0_0 = constructor_scalar_size(ctx, pattern3_0); - let expr1_0 = C::put_in_reg(ctx, pattern7_1); - let expr2_0 = C::put_in_reg(ctx, pattern7_0); - let expr3_0 = constructor_fpu_cmp(ctx, &expr0_0, expr1_0, expr2_0); - let expr4_0 = Cond::Gt; - let expr5_0 = C::put_in_reg(ctx, pattern7_1); - let expr6_0 = C::put_in_reg(ctx, pattern7_0); - let expr7_0 = - constructor_fpu_csel(ctx, pattern3_0, &expr4_0, expr5_0, expr6_0); - let expr8_0 = constructor_with_flags(ctx, &expr3_0, &expr7_0); - let expr9_0 = C::output(ctx, expr8_0); - return Some(expr9_0); - } - _ => {} - } - } - _ => {} - } - } - if let Some(pattern3_0) = C::ty_vec128(ctx, pattern2_0) { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - match &pattern4_0 { - &InstructionData::Unary { - opcode: ref pattern5_0, - arg: pattern5_1, - } => { - if let &Opcode::Ineg = pattern5_0 { - // Rule at src/isa/aarch64/lower.isle line 587. - let expr0_0 = C::put_in_reg(ctx, pattern5_1); - let expr1_0 = constructor_vector_size(ctx, pattern3_0); - let expr2_0 = constructor_neg(ctx, expr0_0, &expr1_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - } - &InstructionData::UnaryConst { - opcode: ref pattern5_0, - constant_handle: pattern5_1, - } => { - if let &Opcode::Vconst = pattern5_0 { - if let Some(pattern7_0) = C::u128_from_constant(ctx, pattern5_1) { - // Rule at src/isa/aarch64/lower.isle line 1824. - let expr0_0 = C::constant_f128(ctx, pattern7_0); - let expr1_0 = constructor_output_reg(ctx, expr0_0); - return Some(expr1_0); - } - } - } - &InstructionData::Binary { - opcode: ref pattern5_0, - args: ref pattern5_1, - } => { - match pattern5_0 { - &Opcode::UaddSat => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 558. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = C::put_in_reg(ctx, pattern7_1); - let expr2_0 = constructor_vector_size(ctx, pattern3_0); - let expr3_0 = constructor_uqadd(ctx, expr0_0, expr1_0, &expr2_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - &Opcode::SaddSat => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 563. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = C::put_in_reg(ctx, pattern7_1); - let expr2_0 = constructor_vector_size(ctx, pattern3_0); - let expr3_0 = constructor_sqadd(ctx, expr0_0, expr1_0, &expr2_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - &Opcode::UsubSat => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 568. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = C::put_in_reg(ctx, pattern7_1); - let expr2_0 = constructor_vector_size(ctx, pattern3_0); - let expr3_0 = constructor_uqsub(ctx, expr0_0, expr1_0, &expr2_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - &Opcode::SsubSat => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 573. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = C::put_in_reg(ctx, pattern7_1); - let expr2_0 = constructor_vector_size(ctx, pattern3_0); - let expr3_0 = constructor_sqsub(ctx, expr0_0, expr1_0, &expr2_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - _ => {} - } - } - &InstructionData::Ternary { - opcode: ref pattern5_0, - args: ref pattern5_1, - } => { - if let &Opcode::Vselect = pattern5_0 { - let (pattern7_0, pattern7_1, pattern7_2) = - C::unpack_value_array_3(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 1654. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = C::put_in_reg(ctx, pattern7_1); - let expr2_0 = C::put_in_reg(ctx, pattern7_2); - let expr3_0 = constructor_bsl(ctx, pattern3_0, expr0_0, expr1_0, expr2_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - } - _ => {} - } - } - if let Some(pattern3_0) = C::ty_vec128_int(ctx, pattern2_0) { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Binary { - opcode: ref pattern5_0, - args: ref pattern5_1, - } = &pattern4_0 - { - match pattern5_0 { - &Opcode::Snarrow => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 1967. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = constructor_lane_size(ctx, pattern3_0); - let expr2_0 = constructor_sqxtn(ctx, expr0_0, &expr1_0); - let expr3_0 = C::put_in_reg(ctx, pattern7_1); - let expr4_0 = constructor_lane_size(ctx, pattern3_0); - let expr5_0 = constructor_sqxtn2(ctx, expr2_0, expr3_0, &expr4_0); - let expr6_0 = constructor_output_reg(ctx, expr5_0); - return Some(expr6_0); - } - &Opcode::Unarrow => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 1982. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = constructor_lane_size(ctx, pattern3_0); - let expr2_0 = constructor_sqxtun(ctx, expr0_0, &expr1_0); - let expr3_0 = C::put_in_reg(ctx, pattern7_1); - let expr4_0 = constructor_lane_size(ctx, pattern3_0); - let expr5_0 = constructor_sqxtun2(ctx, expr2_0, expr3_0, &expr4_0); - let expr6_0 = constructor_output_reg(ctx, expr5_0); - return Some(expr6_0); - } - &Opcode::Uunarrow => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 1998. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = constructor_lane_size(ctx, pattern3_0); - let expr2_0 = constructor_uqxtn(ctx, expr0_0, &expr1_0); - let expr3_0 = C::put_in_reg(ctx, pattern7_1); - let expr4_0 = constructor_lane_size(ctx, pattern3_0); - let expr5_0 = constructor_uqxtn2(ctx, expr2_0, expr3_0, &expr4_0); - let expr6_0 = constructor_output_reg(ctx, expr5_0); - return Some(expr6_0); - } - _ => {} - } - } - } - if let Some(pattern3_0) = C::valid_atomic_transaction(ctx, pattern2_0) { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - match &pattern4_0 { - &InstructionData::LoadNoOffset { - opcode: ref pattern5_0, - arg: pattern5_1, - flags: pattern5_2, - } => { - if let &Opcode::AtomicLoad = pattern5_0 { - // Rule at src/isa/aarch64/lower.isle line 1859. - let expr0_0 = C::put_in_reg(ctx, pattern5_1); - let expr1_0 = - constructor_load_acquire(ctx, pattern3_0, pattern5_2, expr0_0); - let expr2_0 = constructor_output_reg(ctx, expr1_0); - return Some(expr2_0); - } - } - &InstructionData::AtomicRmw { - opcode: ref pattern5_0, - args: ref pattern5_1, - flags: pattern5_2, - op: ref pattern5_3, - } => { - if let &Opcode::AtomicRmw = pattern5_0 { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - match pattern5_3 { - &AtomicRmwOp::Add => { - // Rule at src/isa/aarch64/lower.isle line 1909. - let expr0_0 = AtomicRMWLoopOp::Add; - let expr1_0 = C::put_in_reg(ctx, pattern7_0); - let expr2_0 = C::put_in_reg(ctx, pattern7_1); - let expr3_0 = constructor_atomic_rmw_loop( - ctx, &expr0_0, expr1_0, expr2_0, pattern3_0, pattern5_2, - ); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - &AtomicRmwOp::And => { - // Rule at src/isa/aarch64/lower.isle line 1915. - let expr0_0 = AtomicRMWLoopOp::And; - let expr1_0 = C::put_in_reg(ctx, pattern7_0); - let expr2_0 = C::put_in_reg(ctx, pattern7_1); - let expr3_0 = constructor_atomic_rmw_loop( - ctx, &expr0_0, expr1_0, expr2_0, pattern3_0, pattern5_2, - ); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - &AtomicRmwOp::Nand => { - // Rule at src/isa/aarch64/lower.isle line 1918. - let expr0_0 = AtomicRMWLoopOp::Nand; - let expr1_0 = C::put_in_reg(ctx, pattern7_0); - let expr2_0 = C::put_in_reg(ctx, pattern7_1); - let expr3_0 = constructor_atomic_rmw_loop( - ctx, &expr0_0, expr1_0, expr2_0, pattern3_0, pattern5_2, - ); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - &AtomicRmwOp::Or => { - // Rule at src/isa/aarch64/lower.isle line 1921. - let expr0_0 = AtomicRMWLoopOp::Orr; - let expr1_0 = C::put_in_reg(ctx, pattern7_0); - let expr2_0 = C::put_in_reg(ctx, pattern7_1); - let expr3_0 = constructor_atomic_rmw_loop( - ctx, &expr0_0, expr1_0, expr2_0, pattern3_0, pattern5_2, - ); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - &AtomicRmwOp::Smax => { - // Rule at src/isa/aarch64/lower.isle line 1930. - let expr0_0 = AtomicRMWLoopOp::Smax; - let expr1_0 = C::put_in_reg(ctx, pattern7_0); - let expr2_0 = C::put_in_reg(ctx, pattern7_1); - let expr3_0 = constructor_atomic_rmw_loop( - ctx, &expr0_0, expr1_0, expr2_0, pattern3_0, pattern5_2, - ); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - &AtomicRmwOp::Smin => { - // Rule at src/isa/aarch64/lower.isle line 1927. - let expr0_0 = AtomicRMWLoopOp::Smin; - let expr1_0 = C::put_in_reg(ctx, pattern7_0); - let expr2_0 = C::put_in_reg(ctx, pattern7_1); - let expr3_0 = constructor_atomic_rmw_loop( - ctx, &expr0_0, expr1_0, expr2_0, pattern3_0, pattern5_2, - ); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - &AtomicRmwOp::Sub => { - // Rule at src/isa/aarch64/lower.isle line 1912. - let expr0_0 = AtomicRMWLoopOp::Sub; - let expr1_0 = C::put_in_reg(ctx, pattern7_0); - let expr2_0 = C::put_in_reg(ctx, pattern7_1); - let expr3_0 = constructor_atomic_rmw_loop( - ctx, &expr0_0, expr1_0, expr2_0, pattern3_0, pattern5_2, - ); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - &AtomicRmwOp::Umax => { - // Rule at src/isa/aarch64/lower.isle line 1936. - let expr0_0 = AtomicRMWLoopOp::Umax; - let expr1_0 = C::put_in_reg(ctx, pattern7_0); - let expr2_0 = C::put_in_reg(ctx, pattern7_1); - let expr3_0 = constructor_atomic_rmw_loop( - ctx, &expr0_0, expr1_0, expr2_0, pattern3_0, pattern5_2, - ); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - &AtomicRmwOp::Umin => { - // Rule at src/isa/aarch64/lower.isle line 1933. - let expr0_0 = AtomicRMWLoopOp::Umin; - let expr1_0 = C::put_in_reg(ctx, pattern7_0); - let expr2_0 = C::put_in_reg(ctx, pattern7_1); - let expr3_0 = constructor_atomic_rmw_loop( - ctx, &expr0_0, expr1_0, expr2_0, pattern3_0, pattern5_2, - ); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - &AtomicRmwOp::Xchg => { - // Rule at src/isa/aarch64/lower.isle line 1939. - let expr0_0 = AtomicRMWLoopOp::Xchg; - let expr1_0 = C::put_in_reg(ctx, pattern7_0); - let expr2_0 = C::put_in_reg(ctx, pattern7_1); - let expr3_0 = constructor_atomic_rmw_loop( - ctx, &expr0_0, expr1_0, expr2_0, pattern3_0, pattern5_2, - ); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - &AtomicRmwOp::Xor => { - // Rule at src/isa/aarch64/lower.isle line 1924. - let expr0_0 = AtomicRMWLoopOp::Eor; - let expr1_0 = C::put_in_reg(ctx, pattern7_0); - let expr2_0 = C::put_in_reg(ctx, pattern7_1); - let expr3_0 = constructor_atomic_rmw_loop( - ctx, &expr0_0, expr1_0, expr2_0, pattern3_0, pattern5_2, - ); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - _ => {} - } - } - } - &InstructionData::AtomicCas { - opcode: ref pattern5_0, - args: ref pattern5_1, - flags: pattern5_2, - } => { - if let &Opcode::AtomicCas = pattern5_0 { - let (pattern7_0, pattern7_1, pattern7_2) = - C::unpack_value_array_3(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 1949. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = C::put_in_reg(ctx, pattern7_1); - let expr2_0 = C::put_in_reg(ctx, pattern7_2); - let expr3_0 = constructor_atomic_cas_loop( - ctx, expr0_0, expr1_0, expr2_0, pattern3_0, pattern5_2, - ); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - } - _ => {} - } - } - let pattern3_0 = C::inst_data(ctx, pattern0_0); - match &pattern3_0 { - &InstructionData::NullAry { - opcode: ref pattern4_0, - } => { - if let &Opcode::Null = pattern4_0 { - // Rule at src/isa/aarch64/lower.isle line 24. - let expr0_0 = ImmExtend::Zero; - let expr1_0: u64 = 0i128 as u64; - let expr2_0 = constructor_imm(ctx, pattern2_0, &expr0_0, expr1_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - } - &InstructionData::Unary { - opcode: ref pattern4_0, - arg: pattern4_1, - } => { - match pattern4_0 { - &Opcode::Splat => { - if let Some(pattern6_0) = C::def_inst(ctx, pattern4_1) { - let pattern7_0 = C::inst_data(ctx, pattern6_0); - match &pattern7_0 { - &InstructionData::Unary { - opcode: ref pattern8_0, - arg: pattern8_1, - } => { - if let &Opcode::Ireduce = pattern8_0 { - if let Some(pattern10_0) = C::def_inst(ctx, pattern8_1) { - let pattern11_0 = C::inst_data(ctx, pattern10_0); - if let &InstructionData::UnaryImm { - opcode: ref pattern12_0, - imm: pattern12_1, - } = &pattern11_0 - { - if let &Opcode::Iconst = pattern12_0 { - let pattern14_0 = - C::u64_from_imm64(ctx, pattern12_1); - // Rule at src/isa/aarch64/lower.isle line 1849. - let expr0_0 = - constructor_vector_size(ctx, pattern2_0); - let expr1_0 = - C::splat_const(ctx, pattern14_0, &expr0_0); - let expr2_0 = - constructor_output_reg(ctx, expr1_0); - return Some(expr2_0); - } - } - } - } - } - &InstructionData::Load { - opcode: ref pattern8_0, - arg: pattern8_1, - flags: pattern8_2, - offset: pattern8_3, - } => { - if let &Opcode::Load = pattern8_0 { - let mut closure10 = || { - let expr0_0 = C::is_sinkable_inst(ctx, pattern4_1)?; - return Some(expr0_0); - }; - if let Some(pattern10_0) = closure10() { - // Rule at src/isa/aarch64/lower.isle line 1852. - let expr0_0 = C::lane_type(ctx, pattern2_0); - let expr1_0 = constructor_sink_load_into_amode( - ctx, - expr0_0, - pattern10_0, - ); - let expr2_0 = constructor_load_addr(ctx, &expr1_0); - let expr3_0 = constructor_vector_size(ctx, pattern2_0); - let expr4_0 = constructor_ld1r( - ctx, expr2_0, &expr3_0, pattern8_2, - ); - let expr5_0 = constructor_output_reg(ctx, expr4_0); - return Some(expr5_0); - } - } - } - &InstructionData::UnaryIeee32 { - opcode: ref pattern8_0, - imm: pattern8_1, - } => { - if let &Opcode::F32const = pattern8_0 { - let pattern10_0 = C::u64_from_ieee32(ctx, pattern8_1); - // Rule at src/isa/aarch64/lower.isle line 1840. - let expr0_0 = constructor_vector_size(ctx, pattern2_0); - let expr1_0 = C::splat_const(ctx, pattern10_0, &expr0_0); - let expr2_0 = constructor_output_reg(ctx, expr1_0); - return Some(expr2_0); - } - } - &InstructionData::UnaryIeee64 { - opcode: ref pattern8_0, - imm: pattern8_1, - } => { - if let &Opcode::F64const = pattern8_0 { - let pattern10_0 = C::u64_from_ieee64(ctx, pattern8_1); - // Rule at src/isa/aarch64/lower.isle line 1843. - let expr0_0 = constructor_vector_size(ctx, pattern2_0); - let expr1_0 = C::splat_const(ctx, pattern10_0, &expr0_0); - let expr2_0 = constructor_output_reg(ctx, expr1_0); - return Some(expr2_0); - } - } - &InstructionData::UnaryImm { - opcode: ref pattern8_0, - imm: pattern8_1, - } => { - if let &Opcode::Iconst = pattern8_0 { - let pattern10_0 = C::u64_from_imm64(ctx, pattern8_1); - // Rule at src/isa/aarch64/lower.isle line 1846. - let expr0_0 = constructor_vector_size(ctx, pattern2_0); - let expr1_0 = C::splat_const(ctx, pattern10_0, &expr0_0); - let expr2_0 = constructor_output_reg(ctx, expr1_0); - return Some(expr2_0); - } - } - _ => {} - } - } - } - &Opcode::Bmask => { - let pattern6_0 = C::value_type(ctx, pattern4_1); - // Rule at src/isa/aarch64/lower.isle line 1584. - let expr0_0 = C::put_in_regs(ctx, pattern4_1); - let expr1_0 = constructor_lower_bmask(ctx, pattern2_0, pattern6_0, expr0_0); - let expr2_0 = C::output(ctx, expr1_0); - return Some(expr2_0); - } - &Opcode::Ireduce => { - let mut closure6 = || { - let expr0_0 = C::ty_int_ref_scalar_64(ctx, pattern2_0)?; - return Some(expr0_0); - }; - if let Some(pattern6_0) = closure6() { - // Rule at src/isa/aarch64/lower.isle line 1662. - let expr0_0 = C::put_in_regs(ctx, pattern4_1); - let expr1_0: usize = 0i128 as usize; - let expr2_0 = C::value_regs_get(ctx, expr0_0, expr1_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - } - &Opcode::SwidenLow => { - // Rule at src/isa/aarch64/lower.isle line 2005. - let expr0_0 = VecExtendOp::Sxtl; - let expr1_0 = C::put_in_reg(ctx, pattern4_1); - let expr2_0: bool = false; - let expr3_0 = constructor_lane_size(ctx, pattern2_0); - let expr4_0 = - constructor_vec_extend(ctx, &expr0_0, expr1_0, expr2_0, &expr3_0); - let expr5_0 = constructor_output_reg(ctx, expr4_0); - return Some(expr5_0); - } - &Opcode::SwidenHigh => { - let mut closure6 = || { - let expr0_0 = C::ty_vec64_ctor(ctx, pattern2_0)?; - return Some(expr0_0); - }; - if let Some(pattern6_0) = closure6() { - // Rule at src/isa/aarch64/lower.isle line 2013. - let expr0_0 = C::put_in_reg(ctx, pattern4_1); - let expr1_0: u8 = 1i128 as u8; - let expr2_0 = VectorSize::Size32x2; - let expr3_0 = - constructor_fpu_move_from_vec(ctx, expr0_0, expr1_0, &expr2_0); - let expr4_0 = VecExtendOp::Sxtl; - let expr5_0: bool = false; - let expr6_0 = constructor_lane_size(ctx, pattern2_0); - let expr7_0 = - constructor_vec_extend(ctx, &expr4_0, expr3_0, expr5_0, &expr6_0); - let expr8_0 = constructor_output_reg(ctx, expr7_0); - return Some(expr8_0); - } - } - &Opcode::UwidenLow => { - // Rule at src/isa/aarch64/lower.isle line 2020. - let expr0_0 = VecExtendOp::Uxtl; - let expr1_0 = C::put_in_reg(ctx, pattern4_1); - let expr2_0: bool = false; - let expr3_0 = constructor_lane_size(ctx, pattern2_0); - let expr4_0 = - constructor_vec_extend(ctx, &expr0_0, expr1_0, expr2_0, &expr3_0); - let expr5_0 = constructor_output_reg(ctx, expr4_0); - return Some(expr5_0); - } - &Opcode::UwidenHigh => { - let mut closure6 = || { - let expr0_0 = C::ty_vec64_ctor(ctx, pattern2_0)?; - return Some(expr0_0); - }; - if let Some(pattern6_0) = closure6() { - // Rule at src/isa/aarch64/lower.isle line 2028. - let expr0_0 = C::put_in_reg(ctx, pattern4_1); - let expr1_0: u8 = 1i128 as u8; - let expr2_0 = VectorSize::Size32x2; - let expr3_0 = - constructor_fpu_move_from_vec(ctx, expr0_0, expr1_0, &expr2_0); - let expr4_0 = VecExtendOp::Uxtl; - let expr5_0: bool = false; - let expr6_0 = constructor_lane_size(ctx, pattern2_0); - let expr7_0 = - constructor_vec_extend(ctx, &expr4_0, expr3_0, expr5_0, &expr6_0); - let expr8_0 = constructor_output_reg(ctx, expr7_0); - return Some(expr8_0); - } - } - _ => {} - } - } - &InstructionData::UnaryImm { - opcode: ref pattern4_0, - imm: pattern4_1, - } => { - if let &Opcode::Iconst = pattern4_0 { - let pattern6_0 = C::u64_from_imm64(ctx, pattern4_1); - // Rule at src/isa/aarch64/lower.isle line 19. - let expr0_0 = ImmExtend::Zero; - let expr1_0 = constructor_imm(ctx, pattern2_0, &expr0_0, pattern6_0); - let expr2_0 = constructor_output_reg(ctx, expr1_0); - return Some(expr2_0); - } - } - &InstructionData::Binary { - opcode: ref pattern4_0, - args: ref pattern4_1, - } => { - match pattern4_0 { - &Opcode::Swizzle => { - let (pattern6_0, pattern6_1) = C::unpack_value_array_2(ctx, pattern4_1); - // Rule at src/isa/aarch64/lower.isle line 127. - let expr0_0 = C::put_in_reg(ctx, pattern6_0); - let expr1_0 = C::put_in_reg(ctx, pattern6_1); - let expr2_0 = constructor_vec_tbl(ctx, expr0_0, expr1_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::Fcopysign => { - let (pattern6_0, pattern6_1) = C::unpack_value_array_2(ctx, pattern4_1); - // Rule at src/isa/aarch64/lower.isle line 408. - let expr0_0 = C::put_in_reg(ctx, pattern6_0); - let expr1_0 = C::put_in_reg(ctx, pattern6_1); - let expr2_0 = constructor_fcopy_sign(ctx, expr0_0, expr1_0, pattern2_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - _ => {} - } - } - &InstructionData::Shuffle { - opcode: ref pattern4_0, - args: ref pattern4_1, - imm: pattern4_2, - } => { - if let &Opcode::Shuffle = pattern4_0 { - let (pattern6_0, pattern6_1) = C::unpack_value_array_2(ctx, pattern4_1); - if let Some(pattern7_0) = C::u128_from_immediate(ctx, pattern4_2) { - // Rule at src/isa/aarch64/lower.isle line 121. - let expr0_0 = C::constant_f128(ctx, pattern7_0); - let expr1_0 = C::put_in_reg(ctx, pattern6_0); - let expr2_0 = C::put_in_reg(ctx, pattern6_1); - let expr3_0 = - constructor_vec_tbl2(ctx, expr1_0, expr2_0, expr0_0, pattern2_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - } - } - &InstructionData::FloatCompare { - opcode: ref pattern4_0, - args: ref pattern4_1, - cond: ref pattern4_2, - } => { - if let &Opcode::Fcmp = pattern4_0 { - let (pattern6_0, pattern6_1) = C::unpack_value_array_2(ctx, pattern4_1); - let pattern7_0 = C::value_type(ctx, pattern6_0); - if let Some(pattern8_0) = C::ty_scalar_float(ctx, pattern7_0) { - // Rule at src/isa/aarch64/lower.isle line 1692. - let expr0_0 = constructor_scalar_size(ctx, pattern8_0); - let expr1_0 = C::put_in_reg(ctx, pattern6_0); - let expr2_0 = C::put_in_reg(ctx, pattern6_1); - let expr3_0 = constructor_fpu_cmp(ctx, &expr0_0, expr1_0, expr2_0); - let expr4_0 = C::fp_cond_code(ctx, pattern4_2); - let expr5_0 = constructor_materialize_bool_result(ctx, &expr4_0); - let expr6_0 = constructor_with_flags(ctx, &expr3_0, &expr5_0); - let expr7_0 = C::output(ctx, expr6_0); - return Some(expr7_0); - } - } - } - &InstructionData::Ternary { - opcode: ref pattern4_0, - args: ref pattern4_1, - } => { - match pattern4_0 { - &Opcode::Select => { - let (pattern6_0, pattern6_1, pattern6_2) = - C::unpack_value_array_3(ctx, pattern4_1); - if let Some(pattern7_0) = C::maybe_uextend(ctx, pattern6_0) { - if let Some(pattern8_0) = C::def_inst(ctx, pattern7_0) { - let pattern9_0 = C::inst_data(ctx, pattern8_0); - match &pattern9_0 { - &InstructionData::FloatCompare { - opcode: ref pattern10_0, - args: ref pattern10_1, - cond: ref pattern10_2, - } => { - if let &Opcode::Fcmp = pattern10_0 { - let (pattern12_0, pattern12_1) = - C::unpack_value_array_2(ctx, pattern10_1); - let pattern13_0 = C::value_type(ctx, pattern12_0); - // Rule at src/isa/aarch64/lower.isle line 1755. - let expr0_0 = C::fp_cond_code(ctx, pattern10_2); - let expr1_0 = constructor_scalar_size(ctx, pattern13_0); - let expr2_0 = C::put_in_reg(ctx, pattern12_0); - let expr3_0 = C::put_in_reg(ctx, pattern12_1); - let expr4_0 = constructor_fpu_cmp( - ctx, &expr1_0, expr2_0, expr3_0, - ); - let expr5_0 = constructor_lower_select( - ctx, &expr4_0, &expr0_0, pattern2_0, pattern6_1, - pattern6_2, - ); - let expr6_0 = C::output(ctx, expr5_0); - return Some(expr6_0); - } - } - &InstructionData::IntCompare { - opcode: ref pattern10_0, - args: ref pattern10_1, - cond: ref pattern10_2, - } => { - if let &Opcode::Icmp = pattern10_0 { - let (pattern12_0, pattern12_1) = - C::unpack_value_array_2(ctx, pattern10_1); - let pattern13_0 = C::value_type(ctx, pattern12_0); - // Rule at src/isa/aarch64/lower.isle line 1742. - let expr0_0 = constructor_lower_icmp_into_flags( - ctx, - pattern10_2, - pattern12_0, - pattern12_1, - pattern13_0, - ); - let expr1_0 = - constructor_flags_and_cc_flags(ctx, &expr0_0); - let expr2_0 = - constructor_flags_and_cc_cc(ctx, &expr0_0); - let expr3_0 = C::cond_code(ctx, &expr2_0); - let expr4_0 = constructor_lower_select( - ctx, &expr1_0, &expr3_0, pattern2_0, pattern6_1, - pattern6_2, - ); - let expr5_0 = C::output(ctx, expr4_0); - return Some(expr5_0); - } - } - _ => {} - } - } - } - } - &Opcode::SelectSpectreGuard => { - let (pattern6_0, pattern6_1, pattern6_2) = - C::unpack_value_array_3(ctx, pattern4_1); - if let Some(pattern7_0) = C::maybe_uextend(ctx, pattern6_0) { - if let Some(pattern8_0) = C::def_inst(ctx, pattern7_0) { - let pattern9_0 = C::inst_data(ctx, pattern8_0); - if let &InstructionData::IntCompare { - opcode: ref pattern10_0, - args: ref pattern10_1, - cond: ref pattern10_2, - } = &pattern9_0 - { - if let &Opcode::Icmp = pattern10_0 { - let (pattern12_0, pattern12_1) = - C::unpack_value_array_2(ctx, pattern10_1); - let pattern13_0 = C::value_type(ctx, pattern12_0); - // Rule at src/isa/aarch64/lower.isle line 1793. - let expr0_0 = constructor_lower_icmp_into_flags( - ctx, - pattern10_2, - pattern12_0, - pattern12_1, - pattern13_0, - ); - let expr1_0 = constructor_flags_and_cc_flags(ctx, &expr0_0); - let expr2_0 = constructor_flags_and_cc_cc(ctx, &expr0_0); - let expr3_0 = C::cond_code(ctx, &expr2_0); - let expr4_0 = constructor_lower_select( - ctx, &expr1_0, &expr3_0, pattern2_0, pattern6_1, - pattern6_2, - ); - let expr5_0 = constructor_csdb(ctx); - let expr6_0 = constructor_side_effect(ctx, &expr5_0); - let expr7_0 = C::output(ctx, expr4_0); - return Some(expr7_0); - } - } - } - } - } - &Opcode::Bitselect => { - let (pattern6_0, pattern6_1, pattern6_2) = - C::unpack_value_array_3(ctx, pattern4_1); - let mut closure7 = || { - let expr0_0 = C::ty_int_ref_scalar_64(ctx, pattern2_0)?; - return Some(expr0_0); - }; - if let Some(pattern7_0) = closure7() { - // Rule at src/isa/aarch64/lower.isle line 1643. - let expr0_0 = C::put_in_reg(ctx, pattern6_1); - let expr1_0 = C::put_in_reg(ctx, pattern6_0); - let expr2_0 = constructor_and_reg(ctx, pattern2_0, expr0_0, expr1_0); - let expr3_0 = C::put_in_reg(ctx, pattern6_2); - let expr4_0 = C::put_in_reg(ctx, pattern6_0); - let expr5_0 = constructor_bic(ctx, pattern2_0, expr3_0, expr4_0); - let expr6_0 = constructor_orr(ctx, pattern2_0, expr2_0, expr5_0); - let expr7_0 = constructor_output_reg(ctx, expr6_0); - return Some(expr7_0); - } - } - _ => {} - } - } - _ => {} - } - } - let pattern1_0 = C::inst_data(ctx, pattern0_0); - match &pattern1_0 { - &InstructionData::NullAry { - opcode: ref pattern2_0, - } => { - match pattern2_0 { - &Opcode::Debugtrap => { - // Rule at src/isa/aarch64/lower.isle line 2064. - let expr0_0 = constructor_brk(ctx); - let expr1_0 = constructor_side_effect(ctx, &expr0_0); - return Some(expr1_0); - } - &Opcode::GetPinnedReg => { - // Rule at src/isa/aarch64/lower.isle line 2272. - let expr0_0 = C::preg_pinned(ctx); - let expr1_0 = constructor_mov_from_preg(ctx, expr0_0); - let expr2_0 = constructor_output_reg(ctx, expr1_0); - return Some(expr2_0); - } - &Opcode::GetFramePointer => { - // Rule at src/isa/aarch64/lower.isle line 2079. - let expr0_0 = constructor_aarch64_fp(ctx); - let expr1_0 = constructor_output_reg(ctx, expr0_0); - return Some(expr1_0); - } - &Opcode::GetStackPointer => { - // Rule at src/isa/aarch64/lower.isle line 2082. - let expr0_0 = constructor_aarch64_sp(ctx); - let expr1_0 = constructor_output_reg(ctx, expr0_0); - return Some(expr1_0); - } - &Opcode::GetReturnAddress => { - // Rule at src/isa/aarch64/lower.isle line 2085. - let expr0_0 = constructor_aarch64_link(ctx); - let expr1_0 = constructor_output_reg(ctx, expr0_0); - return Some(expr1_0); - } - &Opcode::Nop => { - // Rule at src/isa/aarch64/lower.isle line 39. - let expr0_0 = C::invalid_reg(ctx); - let expr1_0 = constructor_output_reg(ctx, expr0_0); - return Some(expr1_0); - } - &Opcode::Fence => { - // Rule at src/isa/aarch64/lower.isle line 2047. - let expr0_0 = constructor_aarch64_fence(ctx); - let expr1_0 = constructor_side_effect(ctx, &expr0_0); - return Some(expr1_0); - } - _ => {} - } - } - &InstructionData::Unary { - opcode: ref pattern2_0, - arg: pattern2_1, - } => { - match pattern2_0 { - &Opcode::SetPinnedReg => { - // Rule at src/isa/aarch64/lower.isle line 2275. - let expr0_0 = C::put_in_reg(ctx, pattern2_1); - let expr1_0 = constructor_write_pinned_reg(ctx, expr0_0); - let expr2_0 = constructor_side_effect(ctx, &expr1_0); - return Some(expr2_0); - } - &Opcode::VanyTrue => { - let pattern4_0 = C::value_type(ctx, pattern2_1); - // Rule at src/isa/aarch64/lower.isle line 201. - let expr0_0 = C::put_in_reg(ctx, pattern2_1); - let expr1_0 = constructor_vanytrue(ctx, expr0_0, pattern4_0); - let expr2_0 = Cond::Ne; - let expr3_0 = constructor_materialize_bool_result(ctx, &expr2_0); - let expr4_0 = constructor_with_flags(ctx, &expr1_0, &expr3_0); - let expr5_0 = C::output(ctx, expr4_0); - return Some(expr5_0); - } - &Opcode::VallTrue => { - let pattern4_0 = C::value_type(ctx, pattern2_1); - if let Some((pattern5_0, pattern5_1)) = C::multi_lane(ctx, pattern4_0) { - if pattern5_0 == 32i128 as u32 { - if pattern5_1 == 2i128 as u32 { - // Rule at src/isa/aarch64/lower.isle line 175. - let expr0_0 = C::put_in_reg(ctx, pattern2_1); - let expr1_0: u8 = 0i128 as u8; - let expr2_0 = ScalarSize::Size64; - let expr3_0 = - constructor_mov_from_vec(ctx, expr0_0, expr1_0, &expr2_0); - let expr4_0 = OperandSize::Size64; - let expr5_0 = C::zero_reg(ctx); - let expr6_0: u64 = 32i128 as u64; - let expr7_0 = constructor_cmp_rr_shift( - ctx, &expr4_0, expr5_0, expr3_0, expr6_0, - ); - let expr8_0 = OperandSize::Size32; - let expr9_0: u8 = 0i128 as u8; - let expr10_0 = C::u8_into_uimm5(ctx, expr9_0); - let expr11_0: bool = false; - let expr12_0: bool = true; - let expr13_0: bool = false; - let expr14_0: bool = false; - let expr15_0 = C::nzcv(ctx, expr11_0, expr12_0, expr13_0, expr14_0); - let expr16_0 = Cond::Ne; - let expr17_0 = constructor_ccmp_imm( - ctx, &expr8_0, expr3_0, expr10_0, expr15_0, &expr16_0, - ); - let expr18_0 = constructor_with_flags(ctx, &expr7_0, &expr17_0); - let expr19_0 = C::output(ctx, expr18_0); - return Some(expr19_0); - } - } - if pattern5_0 == 64i128 as u32 { - if pattern5_1 == 2i128 as u32 { - // Rule at src/isa/aarch64/lower.isle line 169. - let expr0_0 = C::put_in_reg(ctx, pattern2_1); - let expr1_0 = VectorSize::Size64x2; - let expr2_0 = constructor_cmeq0(ctx, expr0_0, &expr1_0); - let expr3_0 = VectorSize::Size64x2; - let expr4_0 = constructor_addp(ctx, expr2_0, expr2_0, &expr3_0); - let expr5_0 = ScalarSize::Size64; - let expr6_0 = constructor_fpu_cmp(ctx, &expr5_0, expr4_0, expr4_0); - let expr7_0 = Cond::Eq; - let expr8_0 = constructor_materialize_bool_result(ctx, &expr7_0); - let expr9_0 = constructor_with_flags(ctx, &expr6_0, &expr8_0); - let expr10_0 = C::output(ctx, expr9_0); - return Some(expr10_0); - } - } - } - } - &Opcode::VhighBits => { - let pattern4_0 = C::value_type(ctx, pattern2_1); - if pattern4_0 == I8X16 { - // Rule at src/isa/aarch64/lower.isle line 2346. - let expr0_0 = VecShiftImmOp::Sshr; - let expr1_0: u8 = 7i128 as u8; - let expr2_0 = C::put_in_reg(ctx, pattern2_1); - let expr3_0 = VectorSize::Size8x16; - let expr4_0 = - constructor_vec_shift_imm(ctx, &expr0_0, expr1_0, expr2_0, &expr3_0); - let expr5_0: u128 = -169808226154284360427508033573982305791i128 as u128; - let expr6_0 = C::constant_f128(ctx, expr5_0); - let expr7_0 = VectorSize::Size8x16; - let expr8_0 = constructor_and_vec(ctx, expr4_0, expr6_0, &expr7_0); - let expr9_0: u8 = 8i128 as u8; - let expr10_0 = constructor_vec_extract(ctx, expr8_0, expr8_0, expr9_0); - let expr11_0 = VectorSize::Size8x16; - let expr12_0 = constructor_zip1(ctx, expr8_0, expr10_0, &expr11_0); - let expr13_0 = VectorSize::Size16x8; - let expr14_0 = constructor_addv(ctx, expr12_0, &expr13_0); - let expr15_0: u8 = 0i128 as u8; - let expr16_0 = ScalarSize::Size16; - let expr17_0 = constructor_mov_from_vec(ctx, expr14_0, expr15_0, &expr16_0); - let expr18_0 = constructor_output_reg(ctx, expr17_0); - return Some(expr18_0); - } - if pattern4_0 == I16X8 { - // Rule at src/isa/aarch64/lower.isle line 2370. - let expr0_0 = VecShiftImmOp::Sshr; - let expr1_0: u8 = 15i128 as u8; - let expr2_0 = C::put_in_reg(ctx, pattern2_1); - let expr3_0 = VectorSize::Size16x8; - let expr4_0 = - constructor_vec_shift_imm(ctx, &expr0_0, expr1_0, expr2_0, &expr3_0); - let expr5_0: u128 = 664619068533544770747334646890102785i128 as u128; - let expr6_0 = C::constant_f128(ctx, expr5_0); - let expr7_0 = VectorSize::Size16x8; - let expr8_0 = constructor_and_vec(ctx, expr4_0, expr6_0, &expr7_0); - let expr9_0 = VectorSize::Size16x8; - let expr10_0 = constructor_addv(ctx, expr8_0, &expr9_0); - let expr11_0: u8 = 0i128 as u8; - let expr12_0 = ScalarSize::Size16; - let expr13_0 = constructor_mov_from_vec(ctx, expr10_0, expr11_0, &expr12_0); - let expr14_0 = constructor_output_reg(ctx, expr13_0); - return Some(expr14_0); - } - if pattern4_0 == I32X4 { - // Rule at src/isa/aarch64/lower.isle line 2383. - let expr0_0 = VecShiftImmOp::Sshr; - let expr1_0: u8 = 31i128 as u8; - let expr2_0 = C::put_in_reg(ctx, pattern2_1); - let expr3_0 = VectorSize::Size32x4; - let expr4_0 = - constructor_vec_shift_imm(ctx, &expr0_0, expr1_0, expr2_0, &expr3_0); - let expr5_0: u128 = 633825300187901677051779743745i128 as u128; - let expr6_0 = C::constant_f128(ctx, expr5_0); - let expr7_0 = VectorSize::Size32x4; - let expr8_0 = constructor_and_vec(ctx, expr4_0, expr6_0, &expr7_0); - let expr9_0 = VectorSize::Size32x4; - let expr10_0 = constructor_addv(ctx, expr8_0, &expr9_0); - let expr11_0: u8 = 0i128 as u8; - let expr12_0 = ScalarSize::Size32; - let expr13_0 = constructor_mov_from_vec(ctx, expr10_0, expr11_0, &expr12_0); - let expr14_0 = constructor_output_reg(ctx, expr13_0); - return Some(expr14_0); - } - if pattern4_0 == I64X2 { - // Rule at src/isa/aarch64/lower.isle line 2396. - let expr0_0 = C::put_in_reg(ctx, pattern2_1); - let expr1_0: u8 = 1i128 as u8; - let expr2_0 = ScalarSize::Size64; - let expr3_0 = constructor_mov_from_vec(ctx, expr0_0, expr1_0, &expr2_0); - let expr4_0 = C::put_in_reg(ctx, pattern2_1); - let expr5_0: u8 = 0i128 as u8; - let expr6_0 = ScalarSize::Size64; - let expr7_0 = constructor_mov_from_vec(ctx, expr4_0, expr5_0, &expr6_0); - let expr8_0: Type = I64; - let expr9_0: u8 = 63i128 as u8; - let expr10_0 = C::imm_shift_from_u8(ctx, expr9_0); - let expr11_0 = constructor_lsr_imm(ctx, expr8_0, expr3_0, expr10_0); - let expr12_0: Type = I64; - let expr13_0: u8 = 63i128 as u8; - let expr14_0 = C::imm_shift_from_u8(ctx, expr13_0); - let expr15_0 = constructor_lsr_imm(ctx, expr12_0, expr7_0, expr14_0); - let expr16_0: Type = I64; - let expr17_0: Type = I64; - let expr18_0: u64 = 1i128 as u64; - let expr19_0 = C::lshl_from_u64(ctx, expr17_0, expr18_0)?; - let expr20_0 = - constructor_add_shift(ctx, expr16_0, expr15_0, expr11_0, expr19_0); - let expr21_0 = constructor_output_reg(ctx, expr20_0); - return Some(expr21_0); - } - } - &Opcode::IsNull => { - let pattern4_0 = C::value_type(ctx, pattern2_1); - // Rule at src/isa/aarch64/lower.isle line 2052. - let expr0_0 = constructor_operand_size(ctx, pattern4_0); - let expr1_0 = C::put_in_reg(ctx, pattern2_1); - let expr2_0: u8 = 0i128 as u8; - let expr3_0 = C::u8_into_imm12(ctx, expr2_0); - let expr4_0 = constructor_cmp_imm(ctx, &expr0_0, expr1_0, expr3_0); - let expr5_0 = Cond::Eq; - let expr6_0 = constructor_materialize_bool_result(ctx, &expr5_0); - let expr7_0 = constructor_with_flags(ctx, &expr4_0, &expr6_0); - let expr8_0 = C::output(ctx, expr7_0); - return Some(expr8_0); - } - &Opcode::IsInvalid => { - let pattern4_0 = C::value_type(ctx, pattern2_1); - // Rule at src/isa/aarch64/lower.isle line 2058. - let expr0_0 = constructor_operand_size(ctx, pattern4_0); - let expr1_0 = C::put_in_reg(ctx, pattern2_1); - let expr2_0: u8 = 1i128 as u8; - let expr3_0 = C::u8_into_imm12(ctx, expr2_0); - let expr4_0 = constructor_cmn_imm(ctx, &expr0_0, expr1_0, expr3_0); - let expr5_0 = Cond::Eq; - let expr6_0 = constructor_materialize_bool_result(ctx, &expr5_0); - let expr7_0 = constructor_with_flags(ctx, &expr4_0, &expr6_0); - let expr8_0 = C::output(ctx, expr7_0); - return Some(expr8_0); - } - &Opcode::Fvdemote => { - // Rule at src/isa/aarch64/lower.isle line 1954. - let expr0_0 = C::put_in_reg(ctx, pattern2_1); - let expr1_0 = ScalarSize::Size32; - let expr2_0 = constructor_fcvtn(ctx, expr0_0, &expr1_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::FvpromoteLow => { - // Rule at src/isa/aarch64/lower.isle line 2465. - let expr0_0 = VecRRLongOp::Fcvtl32; - let expr1_0 = C::put_in_reg(ctx, pattern2_1); - let expr2_0: bool = false; - let expr3_0 = constructor_vec_rr_long(ctx, &expr0_0, expr1_0, expr2_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - &Opcode::Isplit => { - let pattern4_0 = C::value_type(ctx, pattern2_1); - if pattern4_0 == I128 { - // Rule at src/isa/aarch64/lower.isle line 132. - let expr0_0 = C::put_in_regs(ctx, pattern2_1); - let expr1_0: usize = 0i128 as usize; - let expr2_0 = C::value_regs_get(ctx, expr0_0, expr1_0); - let expr3_0 = C::value_reg(ctx, expr2_0); - let expr4_0: usize = 1i128 as usize; - let expr5_0 = C::value_regs_get(ctx, expr0_0, expr4_0); - let expr6_0 = C::value_reg(ctx, expr5_0); - let expr7_0 = C::output_pair(ctx, expr3_0, expr6_0); - return Some(expr7_0); - } - } - _ => {} - } - } - &InstructionData::Load { - opcode: ref pattern2_0, - arg: pattern2_1, - flags: pattern2_2, - offset: pattern2_3, - } => { - match pattern2_0 { - &Opcode::Uload8 => { - // Rule at src/isa/aarch64/lower.isle line 2145. - let expr0_0: Type = I8; - let expr1_0 = C::offset32_to_u32(ctx, pattern2_3); - let expr2_0 = C::amode(ctx, expr0_0, pattern2_1, expr1_0); - let expr3_0 = constructor_aarch64_uload8(ctx, &expr2_0, pattern2_2); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - &Opcode::Sload8 => { - // Rule at src/isa/aarch64/lower.isle line 2148. - let expr0_0: Type = I8; - let expr1_0 = C::offset32_to_u32(ctx, pattern2_3); - let expr2_0 = C::amode(ctx, expr0_0, pattern2_1, expr1_0); - let expr3_0 = constructor_aarch64_sload8(ctx, &expr2_0, pattern2_2); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - &Opcode::Uload16 => { - // Rule at src/isa/aarch64/lower.isle line 2151. - let expr0_0: Type = I16; - let expr1_0 = C::offset32_to_u32(ctx, pattern2_3); - let expr2_0 = C::amode(ctx, expr0_0, pattern2_1, expr1_0); - let expr3_0 = constructor_aarch64_uload16(ctx, &expr2_0, pattern2_2); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - &Opcode::Sload16 => { - // Rule at src/isa/aarch64/lower.isle line 2154. - let expr0_0: Type = I16; - let expr1_0 = C::offset32_to_u32(ctx, pattern2_3); - let expr2_0 = C::amode(ctx, expr0_0, pattern2_1, expr1_0); - let expr3_0 = constructor_aarch64_sload16(ctx, &expr2_0, pattern2_2); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - &Opcode::Uload32 => { - // Rule at src/isa/aarch64/lower.isle line 2157. - let expr0_0: Type = I32; - let expr1_0 = C::offset32_to_u32(ctx, pattern2_3); - let expr2_0 = C::amode(ctx, expr0_0, pattern2_1, expr1_0); - let expr3_0 = constructor_aarch64_uload32(ctx, &expr2_0, pattern2_2); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - &Opcode::Sload32 => { - // Rule at src/isa/aarch64/lower.isle line 2160. - let expr0_0: Type = I32; - let expr1_0 = C::offset32_to_u32(ctx, pattern2_3); - let expr2_0 = C::amode(ctx, expr0_0, pattern2_1, expr1_0); - let expr3_0 = constructor_aarch64_sload32(ctx, &expr2_0, pattern2_2); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - &Opcode::Uload8x8 => { - // Rule at src/isa/aarch64/lower.isle line 2170. - let expr0_0 = VecExtendOp::Uxtl; - let expr1_0: Type = F64; - let expr2_0 = C::offset32_to_u32(ctx, pattern2_3); - let expr3_0 = C::amode(ctx, expr1_0, pattern2_1, expr2_0); - let expr4_0 = constructor_aarch64_fpuload64(ctx, &expr3_0, pattern2_2); - let expr5_0: bool = false; - let expr6_0 = ScalarSize::Size16; - let expr7_0 = constructor_vec_extend(ctx, &expr0_0, expr4_0, expr5_0, &expr6_0); - let expr8_0 = constructor_output_reg(ctx, expr7_0); - return Some(expr8_0); - } - &Opcode::Sload8x8 => { - // Rule at src/isa/aarch64/lower.isle line 2164. - let expr0_0 = VecExtendOp::Sxtl; - let expr1_0: Type = F64; - let expr2_0 = C::offset32_to_u32(ctx, pattern2_3); - let expr3_0 = C::amode(ctx, expr1_0, pattern2_1, expr2_0); - let expr4_0 = constructor_aarch64_fpuload64(ctx, &expr3_0, pattern2_2); - let expr5_0: bool = false; - let expr6_0 = ScalarSize::Size16; - let expr7_0 = constructor_vec_extend(ctx, &expr0_0, expr4_0, expr5_0, &expr6_0); - let expr8_0 = constructor_output_reg(ctx, expr7_0); - return Some(expr8_0); - } - &Opcode::Uload16x4 => { - // Rule at src/isa/aarch64/lower.isle line 2182. - let expr0_0 = VecExtendOp::Uxtl; - let expr1_0: Type = F64; - let expr2_0 = C::offset32_to_u32(ctx, pattern2_3); - let expr3_0 = C::amode(ctx, expr1_0, pattern2_1, expr2_0); - let expr4_0 = constructor_aarch64_fpuload64(ctx, &expr3_0, pattern2_2); - let expr5_0: bool = false; - let expr6_0 = ScalarSize::Size32; - let expr7_0 = constructor_vec_extend(ctx, &expr0_0, expr4_0, expr5_0, &expr6_0); - let expr8_0 = constructor_output_reg(ctx, expr7_0); - return Some(expr8_0); - } - &Opcode::Sload16x4 => { - // Rule at src/isa/aarch64/lower.isle line 2176. - let expr0_0 = VecExtendOp::Sxtl; - let expr1_0: Type = F64; - let expr2_0 = C::offset32_to_u32(ctx, pattern2_3); - let expr3_0 = C::amode(ctx, expr1_0, pattern2_1, expr2_0); - let expr4_0 = constructor_aarch64_fpuload64(ctx, &expr3_0, pattern2_2); - let expr5_0: bool = false; - let expr6_0 = ScalarSize::Size32; - let expr7_0 = constructor_vec_extend(ctx, &expr0_0, expr4_0, expr5_0, &expr6_0); - let expr8_0 = constructor_output_reg(ctx, expr7_0); - return Some(expr8_0); - } - &Opcode::Uload32x2 => { - // Rule at src/isa/aarch64/lower.isle line 2194. - let expr0_0 = VecExtendOp::Uxtl; - let expr1_0: Type = F64; - let expr2_0 = C::offset32_to_u32(ctx, pattern2_3); - let expr3_0 = C::amode(ctx, expr1_0, pattern2_1, expr2_0); - let expr4_0 = constructor_aarch64_fpuload64(ctx, &expr3_0, pattern2_2); - let expr5_0: bool = false; - let expr6_0 = ScalarSize::Size64; - let expr7_0 = constructor_vec_extend(ctx, &expr0_0, expr4_0, expr5_0, &expr6_0); - let expr8_0 = constructor_output_reg(ctx, expr7_0); - return Some(expr8_0); - } - &Opcode::Sload32x2 => { - // Rule at src/isa/aarch64/lower.isle line 2188. - let expr0_0 = VecExtendOp::Sxtl; - let expr1_0: Type = F64; - let expr2_0 = C::offset32_to_u32(ctx, pattern2_3); - let expr3_0 = C::amode(ctx, expr1_0, pattern2_1, expr2_0); - let expr4_0 = constructor_aarch64_fpuload64(ctx, &expr3_0, pattern2_2); - let expr5_0: bool = false; - let expr6_0 = ScalarSize::Size64; - let expr7_0 = constructor_vec_extend(ctx, &expr0_0, expr4_0, expr5_0, &expr6_0); - let expr8_0 = constructor_output_reg(ctx, expr7_0); - return Some(expr8_0); - } - _ => {} - } - } - &InstructionData::BinaryImm8 { - opcode: ref pattern2_0, - arg: pattern2_1, - imm: pattern2_2, - } => { - if let &Opcode::ExtractVector = pattern2_0 { - if pattern2_2 == 0i128 as Uimm8 { - // Rule at src/isa/aarch64/lower_dynamic_neon.isle line 99. - let expr0_0 = C::put_in_reg(ctx, pattern2_1); - let expr1_0 = constructor_fpu_move_128(ctx, expr0_0); - let expr2_0 = C::value_reg(ctx, expr1_0); - let expr3_0 = C::output(ctx, expr2_0); - return Some(expr3_0); - } - } - } - &InstructionData::MultiAry { - opcode: ref pattern2_0, - args: pattern2_1, - } => { - if let &Opcode::Return = pattern2_0 { - let pattern4_0 = C::value_list_slice(ctx, pattern2_1); - // Rule at src/isa/aarch64/lower.isle line 2099. - let expr0_0: usize = 0i128 as usize; - let expr1_0 = C::value_slice_len(ctx, pattern4_0); - let expr2_0 = C::range(ctx, expr0_0, expr1_0); - let expr3_0 = constructor_lower_return(ctx, expr2_0, pattern4_0); - return Some(expr3_0); - } - } - &InstructionData::Call { - opcode: ref pattern2_0, - args: pattern2_1, - func_ref: pattern2_2, - } => { - if let &Opcode::Call = pattern2_0 { - let pattern4_0 = C::value_list_slice(ctx, pattern2_1); - let (pattern5_0, pattern5_1, pattern5_2) = C::func_ref_data(ctx, pattern2_2); - // Rule at src/isa/aarch64/lower.isle line 2090. - let expr0_0 = C::gen_call(ctx, pattern5_0, pattern5_1, pattern5_2, pattern4_0); - return Some(expr0_0); - } - } - &InstructionData::CallIndirect { - opcode: ref pattern2_0, - args: pattern2_1, - sig_ref: pattern2_2, - } => { - if let &Opcode::CallIndirect = pattern2_0 { - let pattern4_0 = C::value_list_slice(ctx, pattern2_1); - if let Some((pattern5_0, pattern5_1)) = C::value_slice_unwrap(ctx, pattern4_0) { - // Rule at src/isa/aarch64/lower.isle line 2093. - let expr0_0 = C::gen_call_indirect(ctx, pattern2_2, pattern5_0, pattern5_1); - return Some(expr0_0); - } - } - } - &InstructionData::DynamicStackLoad { - opcode: ref pattern2_0, - dynamic_stack_slot: pattern2_1, - } => { - if let &Opcode::DynamicStackAddr = pattern2_0 { - // Rule at src/isa/aarch64/lower_dynamic_neon.isle line 93. - let expr0_0: Type = I64; - let expr1_0 = C::temp_writable_reg(ctx, expr0_0); - let expr2_0 = C::abi_dynamic_stackslot_addr(ctx, expr1_0, pattern2_1); - let expr3_0 = C::emit(ctx, &expr2_0); - let expr4_0 = C::writable_reg_to_reg(ctx, expr1_0); - let expr5_0 = C::value_reg(ctx, expr4_0); - let expr6_0 = C::output(ctx, expr5_0); - return Some(expr6_0); - } - } - &InstructionData::FuncAddr { - opcode: ref pattern2_0, - func_ref: pattern2_1, - } => { - if let &Opcode::FuncAddr = pattern2_0 { - let (pattern4_0, pattern4_1, pattern4_2) = C::func_ref_data(ctx, pattern2_1); - // Rule at src/isa/aarch64/lower.isle line 2069. - let expr0_0 = C::box_external_name(ctx, pattern4_1); - let expr1_0: i64 = 0i128 as i64; - let expr2_0 = constructor_load_ext_name(ctx, expr0_0, expr1_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - } - &InstructionData::UnaryGlobalValue { - opcode: ref pattern2_0, - global_value: pattern2_1, - } => { - match pattern2_0 { - &Opcode::SymbolValue => { - if let Some((pattern4_0, pattern4_1, pattern4_2)) = - C::symbol_value_data(ctx, pattern2_1) - { - // Rule at src/isa/aarch64/lower.isle line 2074. - let expr0_0 = C::box_external_name(ctx, pattern4_0); - let expr1_0 = constructor_load_ext_name(ctx, expr0_0, pattern4_2); - let expr2_0 = constructor_output_reg(ctx, expr1_0); - return Some(expr2_0); - } - } - &Opcode::TlsValue => { - if let Some((pattern4_0, pattern4_1, pattern4_2)) = - C::symbol_value_data(ctx, pattern2_1) - { - let mut closure5 = || { - let expr0_0 = C::tls_model_is_elf_gd(ctx)?; - return Some(expr0_0); - }; - if let Some(pattern5_0) = closure5() { - // Rule at src/isa/aarch64/lower.isle line 2452. - let expr0_0 = constructor_elf_tls_get_addr(ctx, pattern4_0); - let expr1_0 = constructor_output_reg(ctx, expr0_0); - return Some(expr1_0); - } - } - } - _ => {} - } - } - &InstructionData::UnaryIeee32 { - opcode: ref pattern2_0, - imm: pattern2_1, - } => { - if let &Opcode::F32const = pattern2_0 { - let pattern4_0 = C::u64_from_ieee32(ctx, pattern2_1); - // Rule at src/isa/aarch64/lower.isle line 29. - let expr0_0 = C::constant_f32(ctx, pattern4_0); - let expr1_0 = constructor_output_reg(ctx, expr0_0); - return Some(expr1_0); - } - } - &InstructionData::UnaryIeee64 { - opcode: ref pattern2_0, - imm: pattern2_1, - } => { - if let &Opcode::F64const = pattern2_0 { - let pattern4_0 = C::u64_from_ieee64(ctx, pattern2_1); - // Rule at src/isa/aarch64/lower.isle line 34. - let expr0_0 = C::constant_f64(ctx, pattern4_0); - let expr1_0 = constructor_output_reg(ctx, expr0_0); - return Some(expr1_0); - } - } - &InstructionData::StackLoad { - opcode: ref pattern2_0, - stack_slot: pattern2_1, - offset: pattern2_2, - } => { - if let &Opcode::StackAddr = pattern2_0 { - // Rule at src/isa/aarch64/lower.isle line 2332. - let expr0_0 = constructor_compute_stack_addr(ctx, pattern2_1, pattern2_2); - let expr1_0 = constructor_output_reg(ctx, expr0_0); - return Some(expr1_0); - } - } - &InstructionData::Trap { - opcode: ref pattern2_0, - code: ref pattern2_1, - } => { - match pattern2_0 { - &Opcode::Trap => { - // Rule at src/isa/aarch64/lower.isle line 1732. - let expr0_0 = constructor_udf(ctx, pattern2_1); - let expr1_0 = constructor_side_effect(ctx, &expr0_0); - return Some(expr1_0); - } - &Opcode::ResumableTrap => { - // Rule at src/isa/aarch64/lower.isle line 1737. - let expr0_0 = constructor_udf(ctx, pattern2_1); - let expr1_0 = constructor_side_effect(ctx, &expr0_0); - return Some(expr1_0); - } - _ => {} - } - } - &InstructionData::StoreNoOffset { - opcode: ref pattern2_0, - args: ref pattern2_1, - flags: pattern2_2, - } => { - if let &Opcode::AtomicStore = pattern2_0 { - let (pattern4_0, pattern4_1) = C::unpack_value_array_2(ctx, pattern2_1); - let pattern5_0 = C::value_type(ctx, pattern4_0); - if let Some(pattern6_0) = C::valid_atomic_transaction(ctx, pattern5_0) { - // Rule at src/isa/aarch64/lower.isle line 1864. - let expr0_0 = C::put_in_reg(ctx, pattern4_0); - let expr1_0 = C::put_in_reg(ctx, pattern4_1); - let expr2_0 = - constructor_store_release(ctx, pattern6_0, pattern2_2, expr0_0, expr1_0); - let expr3_0 = constructor_side_effect(ctx, &expr2_0); - return Some(expr3_0); - } - } - } - &InstructionData::Store { - opcode: ref pattern2_0, - args: ref pattern2_1, - flags: pattern2_2, - offset: pattern2_3, - } => { - match pattern2_0 { - &Opcode::Store => { - let (pattern4_0, pattern4_1) = C::unpack_value_array_2(ctx, pattern2_1); - let pattern5_0 = C::value_type(ctx, pattern4_0); - if pattern5_0 == I8 { - // Rule at src/isa/aarch64/lower.isle line 2203. - let expr0_0: Type = I8; - let expr1_0 = C::offset32_to_u32(ctx, pattern2_3); - let expr2_0 = C::amode(ctx, expr0_0, pattern4_1, expr1_0); - let expr3_0 = C::put_in_reg(ctx, pattern4_0); - let expr4_0 = - constructor_aarch64_store8(ctx, &expr2_0, pattern2_2, expr3_0); - let expr5_0 = constructor_side_effect(ctx, &expr4_0); - return Some(expr5_0); - } - if pattern5_0 == I16 { - // Rule at src/isa/aarch64/lower.isle line 2207. - let expr0_0: Type = I16; - let expr1_0 = C::offset32_to_u32(ctx, pattern2_3); - let expr2_0 = C::amode(ctx, expr0_0, pattern4_1, expr1_0); - let expr3_0 = C::put_in_reg(ctx, pattern4_0); - let expr4_0 = - constructor_aarch64_store16(ctx, &expr2_0, pattern2_2, expr3_0); - let expr5_0 = constructor_side_effect(ctx, &expr4_0); - return Some(expr5_0); - } - if pattern5_0 == I32 { - // Rule at src/isa/aarch64/lower.isle line 2211. - let expr0_0: Type = I32; - let expr1_0 = C::offset32_to_u32(ctx, pattern2_3); - let expr2_0 = C::amode(ctx, expr0_0, pattern4_1, expr1_0); - let expr3_0 = C::put_in_reg(ctx, pattern4_0); - let expr4_0 = - constructor_aarch64_store32(ctx, &expr2_0, pattern2_2, expr3_0); - let expr5_0 = constructor_side_effect(ctx, &expr4_0); - return Some(expr5_0); - } - if pattern5_0 == I64 { - // Rule at src/isa/aarch64/lower.isle line 2215. - let expr0_0: Type = I64; - let expr1_0 = C::offset32_to_u32(ctx, pattern2_3); - let expr2_0 = C::amode(ctx, expr0_0, pattern4_1, expr1_0); - let expr3_0 = C::put_in_reg(ctx, pattern4_0); - let expr4_0 = - constructor_aarch64_store64(ctx, &expr2_0, pattern2_2, expr3_0); - let expr5_0 = constructor_side_effect(ctx, &expr4_0); - return Some(expr5_0); - } - if pattern5_0 == I128 { - // Rule at src/isa/aarch64/lower.isle line 2246. - let expr0_0 = C::offset32_to_u32(ctx, pattern2_3); - let expr1_0 = C::pair_amode(ctx, pattern4_1, expr0_0); - let expr2_0 = C::put_in_regs(ctx, pattern4_0); - let expr3_0: usize = 0i128 as usize; - let expr4_0 = C::value_regs_get(ctx, expr2_0, expr3_0); - let expr5_0 = C::put_in_regs(ctx, pattern4_0); - let expr6_0: usize = 1i128 as usize; - let expr7_0 = C::value_regs_get(ctx, expr5_0, expr6_0); - let expr8_0 = constructor_aarch64_storep64( - ctx, &expr1_0, pattern2_2, expr4_0, expr7_0, - ); - let expr9_0 = constructor_side_effect(ctx, &expr8_0); - return Some(expr9_0); - } - if pattern5_0 == R64 { - // Rule at src/isa/aarch64/lower.isle line 2219. - let expr0_0: Type = I64; - let expr1_0 = C::offset32_to_u32(ctx, pattern2_3); - let expr2_0 = C::amode(ctx, expr0_0, pattern4_1, expr1_0); - let expr3_0 = C::put_in_reg(ctx, pattern4_0); - let expr4_0 = - constructor_aarch64_store64(ctx, &expr2_0, pattern2_2, expr3_0); - let expr5_0 = constructor_side_effect(ctx, &expr4_0); - return Some(expr5_0); - } - if pattern5_0 == F32 { - // Rule at src/isa/aarch64/lower.isle line 2237. - let expr0_0: Type = F32; - let expr1_0 = C::offset32_to_u32(ctx, pattern2_3); - let expr2_0 = C::amode(ctx, expr0_0, pattern4_1, expr1_0); - let expr3_0 = C::put_in_reg(ctx, pattern4_0); - let expr4_0 = - constructor_aarch64_fpustore32(ctx, &expr2_0, pattern2_2, expr3_0); - let expr5_0 = constructor_side_effect(ctx, &expr4_0); - return Some(expr5_0); - } - if pattern5_0 == F64 { - // Rule at src/isa/aarch64/lower.isle line 2241. - let expr0_0: Type = F64; - let expr1_0 = C::offset32_to_u32(ctx, pattern2_3); - let expr2_0 = C::amode(ctx, expr0_0, pattern4_1, expr1_0); - let expr3_0 = C::put_in_reg(ctx, pattern4_0); - let expr4_0 = - constructor_aarch64_fpustore64(ctx, &expr2_0, pattern2_2, expr3_0); - let expr5_0 = constructor_side_effect(ctx, &expr4_0); - return Some(expr5_0); - } - } - &Opcode::Istore8 => { - let (pattern4_0, pattern4_1) = C::unpack_value_array_2(ctx, pattern2_1); - // Rule at src/isa/aarch64/lower.isle line 2224. - let expr0_0: Type = I8; - let expr1_0 = C::offset32_to_u32(ctx, pattern2_3); - let expr2_0 = C::amode(ctx, expr0_0, pattern4_1, expr1_0); - let expr3_0 = C::put_in_reg(ctx, pattern4_0); - let expr4_0 = constructor_aarch64_store8(ctx, &expr2_0, pattern2_2, expr3_0); - let expr5_0 = constructor_side_effect(ctx, &expr4_0); - return Some(expr5_0); - } - &Opcode::Istore16 => { - let (pattern4_0, pattern4_1) = C::unpack_value_array_2(ctx, pattern2_1); - // Rule at src/isa/aarch64/lower.isle line 2228. - let expr0_0: Type = I16; - let expr1_0 = C::offset32_to_u32(ctx, pattern2_3); - let expr2_0 = C::amode(ctx, expr0_0, pattern4_1, expr1_0); - let expr3_0 = C::put_in_reg(ctx, pattern4_0); - let expr4_0 = constructor_aarch64_store16(ctx, &expr2_0, pattern2_2, expr3_0); - let expr5_0 = constructor_side_effect(ctx, &expr4_0); - return Some(expr5_0); - } - &Opcode::Istore32 => { - let (pattern4_0, pattern4_1) = C::unpack_value_array_2(ctx, pattern2_1); - // Rule at src/isa/aarch64/lower.isle line 2232. - let expr0_0: Type = I32; - let expr1_0 = C::offset32_to_u32(ctx, pattern2_3); - let expr2_0 = C::amode(ctx, expr0_0, pattern4_1, expr1_0); - let expr3_0 = C::put_in_reg(ctx, pattern4_0); - let expr4_0 = constructor_aarch64_store32(ctx, &expr2_0, pattern2_2, expr3_0); - let expr5_0 = constructor_side_effect(ctx, &expr4_0); - return Some(expr5_0); - } - _ => {} - } - } - &InstructionData::TernaryImm8 { - opcode: ref pattern2_0, - args: ref pattern2_1, - imm: pattern2_2, - } => { - if let &Opcode::Insertlane = pattern2_0 { - let (pattern4_0, pattern4_1) = C::unpack_value_array_2(ctx, pattern2_1); - let pattern5_0 = C::value_type(ctx, pattern4_0); - let pattern6_0 = C::value_type(ctx, pattern4_1); - if let Some(pattern7_0) = C::ty_scalar_float(ctx, pattern6_0) { - let pattern8_0 = C::u8_from_uimm8(ctx, pattern2_2); - // Rule at src/isa/aarch64/lower.isle line 2325. - let expr0_0 = C::put_in_reg(ctx, pattern4_0); - let expr1_0 = C::put_in_reg(ctx, pattern4_1); - let expr2_0: u8 = 0i128 as u8; - let expr3_0 = constructor_vector_size(ctx, pattern5_0); - let expr4_0 = constructor_mov_vec_elem( - ctx, expr0_0, expr1_0, pattern8_0, expr2_0, &expr3_0, - ); - let expr5_0 = constructor_output_reg(ctx, expr4_0); - return Some(expr5_0); - } - } - } - _ => {} - } - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::first_result(ctx, pattern0_0) { - let pattern2_0 = C::value_type(ctx, pattern1_0); - if pattern2_0 == I32 { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Binary { - opcode: ref pattern5_0, - args: ref pattern5_1, - } = &pattern4_0 - { - if let &Opcode::Rotr = pattern5_0 { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 1379. - let expr0_0: Type = I32; - let expr1_0 = C::put_in_reg(ctx, pattern7_0); - let expr2_0 = C::put_in_regs(ctx, pattern7_1); - let expr3_0: usize = 0i128 as usize; - let expr4_0 = C::value_regs_get(ctx, expr2_0, expr3_0); - let expr5_0 = constructor_a64_rotr(ctx, expr0_0, expr1_0, expr4_0); - let expr6_0 = constructor_output_reg(ctx, expr5_0); - return Some(expr6_0); - } - } - } - if pattern2_0 == I64 { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Binary { - opcode: ref pattern5_0, - args: ref pattern5_1, - } = &pattern4_0 - { - if let &Opcode::Rotr = pattern5_0 { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 1383. - let expr0_0: Type = I64; - let expr1_0 = C::put_in_reg(ctx, pattern7_0); - let expr2_0 = C::put_in_regs(ctx, pattern7_1); - let expr3_0: usize = 0i128 as usize; - let expr4_0 = C::value_regs_get(ctx, expr2_0, expr3_0); - let expr5_0 = constructor_a64_rotr(ctx, expr0_0, expr1_0, expr4_0); - let expr6_0 = constructor_output_reg(ctx, expr5_0); - return Some(expr6_0); - } - } - } - if pattern2_0 == I128 { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - match &pattern4_0 { - &InstructionData::Unary { - opcode: ref pattern5_0, - arg: pattern5_1, - } => { - match pattern5_0 { - &Opcode::Uextend => { - // Rule at src/isa/aarch64/lower.isle line 967. - let expr0_0 = constructor_put_in_reg_zext64(ctx, pattern5_1); - let expr1_0: Type = I64; - let expr2_0 = ImmExtend::Zero; - let expr3_0: u64 = 0i128 as u64; - let expr4_0 = constructor_imm(ctx, expr1_0, &expr2_0, expr3_0); - let expr5_0 = C::value_regs(ctx, expr0_0, expr4_0); - let expr6_0 = C::output(ctx, expr5_0); - return Some(expr6_0); - } - &Opcode::Sextend => { - if let Some(pattern7_0) = C::def_inst(ctx, pattern5_1) { - let pattern8_0 = C::inst_data(ctx, pattern7_0); - if let &InstructionData::BinaryImm8 { - opcode: ref pattern9_0, - arg: pattern9_1, - imm: pattern9_2, - } = &pattern8_0 - { - if let &Opcode::Extractlane = pattern9_0 { - let pattern11_0 = C::value_type(ctx, pattern9_1); - if pattern11_0 == I64X2 { - let pattern13_0 = C::u8_from_uimm8(ctx, pattern9_2); - // Rule at src/isa/aarch64/lower.isle line 1016. - let expr0_0 = C::put_in_reg(ctx, pattern9_1); - let expr1_0 = ScalarSize::Size64; - let expr2_0 = constructor_mov_from_vec( - ctx, - expr0_0, - pattern13_0, - &expr1_0, - ); - let expr3_0: Type = I64; - let expr4_0: u8 = 63i128 as u8; - let expr5_0 = C::imm_shift_from_u8(ctx, expr4_0); - let expr6_0 = - constructor_asr_imm(ctx, expr3_0, expr2_0, expr5_0); - let expr7_0 = C::value_regs(ctx, expr2_0, expr6_0); - let expr8_0 = C::output(ctx, expr7_0); - return Some(expr8_0); - } - } - } - } - } - _ => {} - } - } - &InstructionData::Binary { - opcode: ref pattern5_0, - args: ref pattern5_1, - } => { - match pattern5_0 { - &Opcode::Isub => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 553. - let expr0_0 = C::put_in_regs(ctx, pattern7_0); - let expr1_0 = C::put_in_regs(ctx, pattern7_1); - let expr2_0 = constructor_sub_i128(ctx, expr0_0, expr1_0); - let expr3_0 = C::output(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::Imul => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 597. - let expr0_0 = C::put_in_regs(ctx, pattern7_0); - let expr1_0: usize = 0i128 as usize; - let expr2_0 = C::value_regs_get(ctx, expr0_0, expr1_0); - let expr3_0: usize = 1i128 as usize; - let expr4_0 = C::value_regs_get(ctx, expr0_0, expr3_0); - let expr5_0 = C::put_in_regs(ctx, pattern7_1); - let expr6_0: usize = 0i128 as usize; - let expr7_0 = C::value_regs_get(ctx, expr5_0, expr6_0); - let expr8_0: usize = 1i128 as usize; - let expr9_0 = C::value_regs_get(ctx, expr5_0, expr8_0); - let expr10_0: Type = I64; - let expr11_0 = constructor_umulh(ctx, expr10_0, expr2_0, expr7_0); - let expr12_0: Type = I64; - let expr13_0 = - constructor_madd(ctx, expr12_0, expr2_0, expr9_0, expr11_0); - let expr14_0: Type = I64; - let expr15_0 = - constructor_madd(ctx, expr14_0, expr4_0, expr7_0, expr13_0); - let expr16_0: Type = I64; - let expr17_0 = C::zero_reg(ctx); - let expr18_0 = - constructor_madd(ctx, expr16_0, expr2_0, expr7_0, expr17_0); - let expr19_0 = C::value_regs(ctx, expr18_0, expr15_0); - let expr20_0 = C::output(ctx, expr19_0); - return Some(expr20_0); - } - _ => {} - } - } - _ => {} - } - } - if pattern2_0 == I64X2 { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Binary { - opcode: ref pattern5_0, - args: ref pattern5_1, - } = &pattern4_0 - { - if let &Opcode::Imul = pattern5_0 { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 657. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = C::put_in_reg(ctx, pattern7_1); - let expr2_0 = VectorSize::Size32x4; - let expr3_0 = constructor_rev64(ctx, expr1_0, &expr2_0); - let expr4_0 = VectorSize::Size32x4; - let expr5_0 = constructor_mul(ctx, expr3_0, expr0_0, &expr4_0); - let expr6_0 = ScalarSize::Size32; - let expr7_0 = constructor_xtn(ctx, expr0_0, &expr6_0); - let expr8_0 = VectorSize::Size32x4; - let expr9_0 = constructor_addp(ctx, expr5_0, expr5_0, &expr8_0); - let expr10_0 = ScalarSize::Size32; - let expr11_0 = constructor_xtn(ctx, expr1_0, &expr10_0); - let expr12_0: bool = false; - let expr13_0 = constructor_shll32(ctx, expr9_0, expr12_0); - let expr14_0: bool = false; - let expr15_0 = constructor_umlal32(ctx, expr13_0, expr11_0, expr7_0, expr14_0); - let expr16_0 = constructor_output_reg(ctx, expr15_0); - return Some(expr16_0); - } - } - } - if let Some((pattern3_0, pattern3_1)) = C::multi_lane(ctx, pattern2_0) { - if pattern3_0 == 32i128 as u32 { - let pattern5_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Unary { - opcode: ref pattern6_0, - arg: pattern6_1, - } = &pattern5_0 - { - match pattern6_0 { - &Opcode::FcvtToUintSat => { - let pattern8_0 = C::value_type(ctx, pattern6_1); - if let Some((pattern9_0, pattern9_1)) = C::multi_lane(ctx, pattern8_0) { - if pattern9_0 == 32i128 as u32 { - // Rule at src/isa/aarch64/lower.isle line 481. - let expr0_0 = VecMisc2::Fcvtzu; - let expr1_0 = C::put_in_reg(ctx, pattern6_1); - let expr2_0 = constructor_vector_size(ctx, pattern2_0); - let expr3_0 = - constructor_vec_misc(ctx, &expr0_0, expr1_0, &expr2_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - } - } - &Opcode::FcvtToSintSat => { - let pattern8_0 = C::value_type(ctx, pattern6_1); - if let Some((pattern9_0, pattern9_1)) = C::multi_lane(ctx, pattern8_0) { - if pattern9_0 == 32i128 as u32 { - // Rule at src/isa/aarch64/lower.isle line 501. - let expr0_0 = VecMisc2::Fcvtzs; - let expr1_0 = C::put_in_reg(ctx, pattern6_1); - let expr2_0 = constructor_vector_size(ctx, pattern2_0); - let expr3_0 = - constructor_vec_misc(ctx, &expr0_0, expr1_0, &expr2_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - } - } - &Opcode::FcvtFromUint => { - let pattern8_0 = C::value_type(ctx, pattern6_1); - if let Some((pattern9_0, pattern9_1)) = C::multi_lane(ctx, pattern8_0) { - if pattern9_0 == 32i128 as u32 { - // Rule at src/isa/aarch64/lower.isle line 441. - let expr0_0 = VecMisc2::Ucvtf; - let expr1_0 = C::put_in_reg(ctx, pattern6_1); - let expr2_0 = constructor_vector_size(ctx, pattern2_0); - let expr3_0 = - constructor_vec_misc(ctx, &expr0_0, expr1_0, &expr2_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - } - } - &Opcode::FcvtFromSint => { - let pattern8_0 = C::value_type(ctx, pattern6_1); - if let Some((pattern9_0, pattern9_1)) = C::multi_lane(ctx, pattern8_0) { - if pattern9_0 == 32i128 as u32 { - // Rule at src/isa/aarch64/lower.isle line 461. - let expr0_0 = VecMisc2::Scvtf; - let expr1_0 = C::put_in_reg(ctx, pattern6_1); - let expr2_0 = constructor_vector_size(ctx, pattern2_0); - let expr3_0 = - constructor_vec_misc(ctx, &expr0_0, expr1_0, &expr2_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - } - } - _ => {} - } - } - } - if pattern3_0 == 64i128 as u32 { - let pattern5_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Unary { - opcode: ref pattern6_0, - arg: pattern6_1, - } = &pattern5_0 - { - match pattern6_0 { - &Opcode::FcvtToUintSat => { - let pattern8_0 = C::value_type(ctx, pattern6_1); - if let Some((pattern9_0, pattern9_1)) = C::multi_lane(ctx, pattern8_0) { - if pattern9_0 == 64i128 as u32 { - // Rule at src/isa/aarch64/lower.isle line 484. - let expr0_0 = VecMisc2::Fcvtzu; - let expr1_0 = C::put_in_reg(ctx, pattern6_1); - let expr2_0 = constructor_vector_size(ctx, pattern2_0); - let expr3_0 = - constructor_vec_misc(ctx, &expr0_0, expr1_0, &expr2_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - } - } - &Opcode::FcvtToSintSat => { - let pattern8_0 = C::value_type(ctx, pattern6_1); - if let Some((pattern9_0, pattern9_1)) = C::multi_lane(ctx, pattern8_0) { - if pattern9_0 == 64i128 as u32 { - // Rule at src/isa/aarch64/lower.isle line 504. - let expr0_0 = VecMisc2::Fcvtzs; - let expr1_0 = C::put_in_reg(ctx, pattern6_1); - let expr2_0 = constructor_vector_size(ctx, pattern2_0); - let expr3_0 = - constructor_vec_misc(ctx, &expr0_0, expr1_0, &expr2_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - } - } - &Opcode::FcvtFromUint => { - let pattern8_0 = C::value_type(ctx, pattern6_1); - if let Some((pattern9_0, pattern9_1)) = C::multi_lane(ctx, pattern8_0) { - if pattern9_0 == 64i128 as u32 { - // Rule at src/isa/aarch64/lower.isle line 444. - let expr0_0 = VecMisc2::Ucvtf; - let expr1_0 = C::put_in_reg(ctx, pattern6_1); - let expr2_0 = constructor_vector_size(ctx, pattern2_0); - let expr3_0 = - constructor_vec_misc(ctx, &expr0_0, expr1_0, &expr2_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - } - } - &Opcode::FcvtFromSint => { - let pattern8_0 = C::value_type(ctx, pattern6_1); - if let Some((pattern9_0, pattern9_1)) = C::multi_lane(ctx, pattern8_0) { - if pattern9_0 == 64i128 as u32 { - // Rule at src/isa/aarch64/lower.isle line 464. - let expr0_0 = VecMisc2::Scvtf; - let expr1_0 = C::put_in_reg(ctx, pattern6_1); - let expr2_0 = constructor_vector_size(ctx, pattern2_0); - let expr3_0 = - constructor_vec_misc(ctx, &expr0_0, expr1_0, &expr2_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - } - } - _ => {} - } - } - } - let pattern4_0 = C::inst_data(ctx, pattern0_0); - match &pattern4_0 { - &InstructionData::Unary { - opcode: ref pattern5_0, - arg: pattern5_1, - } => { - match pattern5_0 { - &Opcode::Sqrt => { - // Rule at src/isa/aarch64/lower.isle line 322. - let expr0_0 = VecMisc2::Fsqrt; - let expr1_0 = C::put_in_reg(ctx, pattern5_1); - let expr2_0 = constructor_vector_size(ctx, pattern2_0); - let expr3_0 = constructor_vec_misc(ctx, &expr0_0, expr1_0, &expr2_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - &Opcode::Fneg => { - // Rule at src/isa/aarch64/lower.isle line 330. - let expr0_0 = VecMisc2::Fneg; - let expr1_0 = C::put_in_reg(ctx, pattern5_1); - let expr2_0 = constructor_vector_size(ctx, pattern2_0); - let expr3_0 = constructor_vec_misc(ctx, &expr0_0, expr1_0, &expr2_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - &Opcode::Fabs => { - // Rule at src/isa/aarch64/lower.isle line 338. - let expr0_0 = VecMisc2::Fabs; - let expr1_0 = C::put_in_reg(ctx, pattern5_1); - let expr2_0 = constructor_vector_size(ctx, pattern2_0); - let expr3_0 = constructor_vec_misc(ctx, &expr0_0, expr1_0, &expr2_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - &Opcode::Ceil => { - // Rule at src/isa/aarch64/lower.isle line 356. - let expr0_0 = VecMisc2::Frintp; - let expr1_0 = C::put_in_reg(ctx, pattern5_1); - let expr2_0 = constructor_vector_size(ctx, pattern2_0); - let expr3_0 = constructor_vec_misc(ctx, &expr0_0, expr1_0, &expr2_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - &Opcode::Floor => { - // Rule at src/isa/aarch64/lower.isle line 367. - let expr0_0 = VecMisc2::Frintm; - let expr1_0 = C::put_in_reg(ctx, pattern5_1); - let expr2_0 = constructor_vector_size(ctx, pattern2_0); - let expr3_0 = constructor_vec_misc(ctx, &expr0_0, expr1_0, &expr2_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - &Opcode::Trunc => { - // Rule at src/isa/aarch64/lower.isle line 378. - let expr0_0 = VecMisc2::Frintz; - let expr1_0 = C::put_in_reg(ctx, pattern5_1); - let expr2_0 = constructor_vector_size(ctx, pattern2_0); - let expr3_0 = constructor_vec_misc(ctx, &expr0_0, expr1_0, &expr2_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - &Opcode::Nearest => { - // Rule at src/isa/aarch64/lower.isle line 389. - let expr0_0 = VecMisc2::Frintn; - let expr1_0 = C::put_in_reg(ctx, pattern5_1); - let expr2_0 = constructor_vector_size(ctx, pattern2_0); - let expr3_0 = constructor_vec_misc(ctx, &expr0_0, expr1_0, &expr2_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - _ => {} - } - } - &InstructionData::Binary { - opcode: ref pattern5_0, - args: ref pattern5_1, - } => { - match pattern5_0 { - &Opcode::Fadd => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 256. - let expr0_0 = VecALUOp::Fadd; - let expr1_0 = C::put_in_reg(ctx, pattern7_0); - let expr2_0 = C::put_in_reg(ctx, pattern7_1); - let expr3_0 = constructor_vector_size(ctx, pattern2_0); - let expr4_0 = - constructor_vec_rrr(ctx, &expr0_0, expr1_0, expr2_0, &expr3_0); - let expr5_0 = constructor_output_reg(ctx, expr4_0); - return Some(expr5_0); - } - &Opcode::Fsub => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 264. - let expr0_0 = VecALUOp::Fsub; - let expr1_0 = C::put_in_reg(ctx, pattern7_0); - let expr2_0 = C::put_in_reg(ctx, pattern7_1); - let expr3_0 = constructor_vector_size(ctx, pattern2_0); - let expr4_0 = - constructor_vec_rrr(ctx, &expr0_0, expr1_0, expr2_0, &expr3_0); - let expr5_0 = constructor_output_reg(ctx, expr4_0); - return Some(expr5_0); - } - &Opcode::Fmul => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 272. - let expr0_0 = VecALUOp::Fmul; - let expr1_0 = C::put_in_reg(ctx, pattern7_0); - let expr2_0 = C::put_in_reg(ctx, pattern7_1); - let expr3_0 = constructor_vector_size(ctx, pattern2_0); - let expr4_0 = - constructor_vec_rrr(ctx, &expr0_0, expr1_0, expr2_0, &expr3_0); - let expr5_0 = constructor_output_reg(ctx, expr4_0); - return Some(expr5_0); - } - &Opcode::Fdiv => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 280. - let expr0_0 = VecALUOp::Fdiv; - let expr1_0 = C::put_in_reg(ctx, pattern7_0); - let expr2_0 = C::put_in_reg(ctx, pattern7_1); - let expr3_0 = constructor_vector_size(ctx, pattern2_0); - let expr4_0 = - constructor_vec_rrr(ctx, &expr0_0, expr1_0, expr2_0, &expr3_0); - let expr5_0 = constructor_output_reg(ctx, expr4_0); - return Some(expr5_0); - } - &Opcode::Fmin => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 288. - let expr0_0 = VecALUOp::Fmin; - let expr1_0 = C::put_in_reg(ctx, pattern7_0); - let expr2_0 = C::put_in_reg(ctx, pattern7_1); - let expr3_0 = constructor_vector_size(ctx, pattern2_0); - let expr4_0 = - constructor_vec_rrr(ctx, &expr0_0, expr1_0, expr2_0, &expr3_0); - let expr5_0 = constructor_output_reg(ctx, expr4_0); - return Some(expr5_0); - } - &Opcode::FminPseudo => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 304. - let expr0_0 = VecALUOp::Fcmgt; - let expr1_0 = C::put_in_reg(ctx, pattern7_0); - let expr2_0 = C::put_in_reg(ctx, pattern7_1); - let expr3_0 = constructor_vector_size(ctx, pattern2_0); - let expr4_0 = - constructor_vec_rrr(ctx, &expr0_0, expr1_0, expr2_0, &expr3_0); - let expr5_0 = C::put_in_reg(ctx, pattern7_1); - let expr6_0 = C::put_in_reg(ctx, pattern7_0); - let expr7_0 = - constructor_bsl(ctx, pattern2_0, expr4_0, expr5_0, expr6_0); - let expr8_0 = constructor_output_reg(ctx, expr7_0); - return Some(expr8_0); - } - &Opcode::Fmax => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 296. - let expr0_0 = VecALUOp::Fmax; - let expr1_0 = C::put_in_reg(ctx, pattern7_0); - let expr2_0 = C::put_in_reg(ctx, pattern7_1); - let expr3_0 = constructor_vector_size(ctx, pattern2_0); - let expr4_0 = - constructor_vec_rrr(ctx, &expr0_0, expr1_0, expr2_0, &expr3_0); - let expr5_0 = constructor_output_reg(ctx, expr4_0); - return Some(expr5_0); - } - &Opcode::FmaxPseudo => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 313. - let expr0_0 = VecALUOp::Fcmgt; - let expr1_0 = C::put_in_reg(ctx, pattern7_1); - let expr2_0 = C::put_in_reg(ctx, pattern7_0); - let expr3_0 = constructor_vector_size(ctx, pattern2_0); - let expr4_0 = - constructor_vec_rrr(ctx, &expr0_0, expr1_0, expr2_0, &expr3_0); - let expr5_0 = C::put_in_reg(ctx, pattern7_1); - let expr6_0 = C::put_in_reg(ctx, pattern7_0); - let expr7_0 = - constructor_bsl(ctx, pattern2_0, expr4_0, expr5_0, expr6_0); - let expr8_0 = constructor_output_reg(ctx, expr7_0); - return Some(expr8_0); - } - _ => {} - } - } - _ => {} - } - } - if let Some(pattern3_0) = C::fits_in_16(ctx, pattern2_0) { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Binary { - opcode: ref pattern5_0, - args: ref pattern5_1, - } = &pattern4_0 - { - if let &Opcode::Rotl = pattern5_0 { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - if let Some(pattern8_0) = C::def_inst(ctx, pattern7_1) { - let pattern9_0 = C::inst_data(ctx, pattern8_0); - if let &InstructionData::UnaryImm { - opcode: ref pattern10_0, - imm: pattern10_1, - } = &pattern9_0 - { - if let &Opcode::Iconst = pattern10_0 { - let mut closure12 = || { - let expr0_0 = - C::imm_shift_from_imm64(ctx, pattern3_0, pattern10_1)?; - return Some(expr0_0); - }; - if let Some(pattern12_0) = closure12() { - // Rule at src/isa/aarch64/lower.isle line 1322. - let expr0_0 = constructor_put_in_reg_zext32(ctx, pattern7_0); - let expr1_0 = C::negate_imm_shift(ctx, pattern3_0, pattern12_0); - let expr2_0 = constructor_small_rotr_imm( - ctx, pattern3_0, expr0_0, expr1_0, - ); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - } - } - } - } - } - } - if let Some(pattern3_0) = C::fits_in_32(ctx, pattern2_0) { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Binary { - opcode: ref pattern5_0, - args: ref pattern5_1, - } = &pattern4_0 - { - match pattern5_0 { - &Opcode::Band => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 1057. - let expr0_0 = ALUOp::And; - let expr1_0 = constructor_alu_rs_imm_logic_commutative( - ctx, &expr0_0, pattern3_0, pattern7_0, pattern7_1, - ); - let expr2_0 = constructor_output_reg(ctx, expr1_0); - return Some(expr2_0); - } - &Opcode::Bor => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 1070. - let expr0_0 = ALUOp::Orr; - let expr1_0 = constructor_alu_rs_imm_logic_commutative( - ctx, &expr0_0, pattern3_0, pattern7_0, pattern7_1, - ); - let expr2_0 = constructor_output_reg(ctx, expr1_0); - return Some(expr2_0); - } - &Opcode::Bxor => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 1083. - let expr0_0 = ALUOp::Eor; - let expr1_0 = constructor_alu_rs_imm_logic_commutative( - ctx, &expr0_0, pattern3_0, pattern7_0, pattern7_1, - ); - let expr2_0 = constructor_output_reg(ctx, expr1_0); - return Some(expr2_0); - } - &Opcode::BandNot => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 1096. - let expr0_0 = ALUOp::AndNot; - let expr1_0 = constructor_alu_rs_imm_logic( - ctx, &expr0_0, pattern3_0, pattern7_0, pattern7_1, - ); - let expr2_0 = constructor_output_reg(ctx, expr1_0); - return Some(expr2_0); - } - &Opcode::BorNot => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 1109. - let expr0_0 = ALUOp::OrrNot; - let expr1_0 = constructor_alu_rs_imm_logic( - ctx, &expr0_0, pattern3_0, pattern7_0, pattern7_1, - ); - let expr2_0 = constructor_output_reg(ctx, expr1_0); - return Some(expr2_0); - } - &Opcode::BxorNot => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 1119. - let expr0_0 = ALUOp::EorNot; - let expr1_0: Type = I32; - let expr2_0 = constructor_alu_rs_imm_logic( - ctx, &expr0_0, expr1_0, pattern7_0, pattern7_1, - ); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::Ishl => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 1130. - let expr0_0 = ALUOp::Lsl; - let expr1_0 = C::put_in_reg(ctx, pattern7_0); - let expr2_0 = - constructor_do_shift(ctx, &expr0_0, pattern3_0, expr1_0, pattern7_1); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::Ushr => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 1216. - let expr0_0 = ALUOp::Lsr; - let expr1_0 = constructor_put_in_reg_zext32(ctx, pattern7_0); - let expr2_0 = - constructor_do_shift(ctx, &expr0_0, pattern3_0, expr1_0, pattern7_1); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - _ => {} - } - } - } - if let Some(pattern3_0) = C::lane_fits_in_32(ctx, pattern2_0) { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Binary { - opcode: ref pattern5_0, - args: ref pattern5_1, - } = &pattern4_0 - { - if let &Opcode::AvgRound = pattern5_0 { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 246. - let expr0_0 = VecALUOp::Urhadd; - let expr1_0 = C::put_in_reg(ctx, pattern7_0); - let expr2_0 = C::put_in_reg(ctx, pattern7_1); - let expr3_0 = constructor_vector_size(ctx, pattern3_0); - let expr4_0 = constructor_vec_rrr(ctx, &expr0_0, expr1_0, expr2_0, &expr3_0); - let expr5_0 = constructor_output_reg(ctx, expr4_0); - return Some(expr5_0); - } - } - } - if let Some(pattern3_0) = C::fits_in_64(ctx, pattern2_0) { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - match &pattern4_0 { - &InstructionData::Unary { - opcode: ref pattern5_0, - arg: pattern5_1, - } => { - if let &Opcode::Bnot = pattern5_0 { - // Rule at src/isa/aarch64/lower.isle line 1032. - let expr0_0 = C::zero_reg(ctx); - let expr1_0 = C::put_in_reg(ctx, pattern5_1); - let expr2_0 = constructor_orr_not(ctx, pattern3_0, expr0_0, expr1_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - } - &InstructionData::Binary { - opcode: ref pattern5_0, - args: ref pattern5_1, - } => { - if let &Opcode::Iadd = pattern5_0 { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 47. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = C::put_in_reg(ctx, pattern7_1); - let expr2_0 = constructor_add(ctx, pattern3_0, expr0_0, expr1_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - } - _ => {} - } - } - if let Some(pattern3_0) = C::ty_vec64(ctx, pattern2_0) { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Load { - opcode: ref pattern5_0, - arg: pattern5_1, - flags: pattern5_2, - offset: pattern5_3, - } = &pattern4_0 - { - if let &Opcode::Load = pattern5_0 { - // Rule at src/isa/aarch64/lower.isle line 2128. - let expr0_0: Type = F64; - let expr1_0 = C::offset32_to_u32(ctx, pattern5_3); - let expr2_0 = C::amode(ctx, expr0_0, pattern5_1, expr1_0); - let expr3_0 = constructor_aarch64_fpuload128(ctx, &expr2_0, pattern5_2); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - } - } - if let Some(pattern3_0) = C::ty_vec128(ctx, pattern2_0) { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Binary { - opcode: ref pattern5_0, - args: ref pattern5_1, - } = &pattern4_0 - { - if let &Opcode::Sshr = pattern5_0 { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 1278. - let expr0_0 = constructor_vector_size(ctx, pattern3_0); - let expr1_0: Type = I32; - let expr2_0 = C::put_in_reg(ctx, pattern7_1); - let expr3_0 = C::shift_mask(ctx, pattern3_0); - let expr4_0 = constructor_and_imm(ctx, expr1_0, expr2_0, expr3_0); - let expr5_0: Type = I64; - let expr6_0 = C::zero_reg(ctx); - let expr7_0 = constructor_sub(ctx, expr5_0, expr6_0, expr4_0); - let expr8_0 = constructor_vec_dup(ctx, expr7_0, &expr0_0); - let expr9_0 = C::put_in_reg(ctx, pattern7_0); - let expr10_0 = constructor_sshl(ctx, expr9_0, expr8_0, &expr0_0); - let expr11_0 = constructor_output_reg(ctx, expr10_0); - return Some(expr11_0); - } - } - } - if let Some(pattern3_0) = C::ty_dyn64_int(ctx, pattern2_0) { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Binary { - opcode: ref pattern5_0, - args: ref pattern5_1, - } = &pattern4_0 - { - match pattern5_0 { - &Opcode::Snarrow => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower_dynamic_neon.isle line 55. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = C::put_in_reg(ctx, pattern7_1); - let expr2_0: u8 = 1i128 as u8; - let expr3_0: u8 = 0i128 as u8; - let expr4_0 = VectorSize::Size64x2; - let expr5_0 = constructor_mov_vec_elem( - ctx, expr0_0, expr1_0, expr2_0, expr3_0, &expr4_0, - ); - let expr6_0 = constructor_lane_size(ctx, pattern3_0); - let expr7_0 = constructor_sqxtn(ctx, expr5_0, &expr6_0); - let expr8_0 = constructor_output_reg(ctx, expr7_0); - return Some(expr8_0); - } - &Opcode::Unarrow => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower_dynamic_neon.isle line 69. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = C::put_in_reg(ctx, pattern7_1); - let expr2_0: u8 = 1i128 as u8; - let expr3_0: u8 = 0i128 as u8; - let expr4_0 = VectorSize::Size64x2; - let expr5_0 = constructor_mov_vec_elem( - ctx, expr0_0, expr1_0, expr2_0, expr3_0, &expr4_0, - ); - let expr6_0 = constructor_lane_size(ctx, pattern3_0); - let expr7_0 = constructor_sqxtun(ctx, expr5_0, &expr6_0); - let expr8_0 = constructor_output_reg(ctx, expr7_0); - return Some(expr8_0); - } - &Opcode::Uunarrow => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower_dynamic_neon.isle line 83. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = C::put_in_reg(ctx, pattern7_1); - let expr2_0: u8 = 1i128 as u8; - let expr3_0: u8 = 0i128 as u8; - let expr4_0 = VectorSize::Size64x2; - let expr5_0 = constructor_mov_vec_elem( - ctx, expr0_0, expr1_0, expr2_0, expr3_0, &expr4_0, - ); - let expr6_0 = constructor_lane_size(ctx, pattern3_0); - let expr7_0 = constructor_uqxtn(ctx, expr5_0, &expr6_0); - let expr8_0 = constructor_output_reg(ctx, expr7_0); - return Some(expr8_0); - } - _ => {} - } - } - } - let pattern3_0 = C::inst_data(ctx, pattern0_0); - match &pattern3_0 { - &InstructionData::Unary { - opcode: ref pattern4_0, - arg: pattern4_1, - } => { - match pattern4_0 { - &Opcode::Splat => { - let pattern6_0 = C::value_type(ctx, pattern4_1); - let mut closure7 = || { - let expr0_0 = C::ty_int_ref_scalar_64(ctx, pattern6_0)?; - return Some(expr0_0); - }; - if let Some(pattern7_0) = closure7() { - // Rule at src/isa/aarch64/lower.isle line 1833. - let expr0_0 = C::put_in_reg(ctx, pattern4_1); - let expr1_0 = constructor_vector_size(ctx, pattern2_0); - let expr2_0 = constructor_vec_dup(ctx, expr0_0, &expr1_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - } - &Opcode::Bitrev => { - // Rule at src/isa/aarch64/lower.isle line 1480. - let expr0_0 = C::put_in_reg(ctx, pattern4_1); - let expr1_0 = constructor_rbit(ctx, pattern2_0, expr0_0); - let expr2_0 = constructor_output_reg(ctx, expr1_0); - return Some(expr2_0); - } - &Opcode::Clz => { - // Rule at src/isa/aarch64/lower.isle line 1495. - let expr0_0 = C::put_in_reg(ctx, pattern4_1); - let expr1_0 = constructor_a64_clz(ctx, pattern2_0, expr0_0); - let expr2_0 = constructor_output_reg(ctx, expr1_0); - return Some(expr2_0); - } - &Opcode::Cls => { - // Rule at src/isa/aarch64/lower.isle line 1562. - let expr0_0 = C::put_in_reg(ctx, pattern4_1); - let expr1_0 = constructor_a64_cls(ctx, pattern2_0, expr0_0); - let expr2_0 = constructor_output_reg(ctx, expr1_0); - return Some(expr2_0); - } - &Opcode::Ctz => { - // Rule at src/isa/aarch64/lower.isle line 1528. - let expr0_0 = C::put_in_reg(ctx, pattern4_1); - let expr1_0 = constructor_rbit(ctx, pattern2_0, expr0_0); - let expr2_0 = constructor_a64_clz(ctx, pattern2_0, expr1_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::SwidenHigh => { - // Rule at src/isa/aarch64/lower_dynamic_neon.isle line 104. - let expr0_0 = VecExtendOp::Sxtl; - let expr1_0 = C::put_in_reg(ctx, pattern4_1); - let expr2_0: bool = true; - let expr3_0 = constructor_lane_size(ctx, pattern2_0); - let expr4_0 = - constructor_vec_extend(ctx, &expr0_0, expr1_0, expr2_0, &expr3_0); - let expr5_0 = constructor_output_reg(ctx, expr4_0); - return Some(expr5_0); - } - &Opcode::UwidenHigh => { - // Rule at src/isa/aarch64/lower_dynamic_neon.isle line 109. - let expr0_0 = VecExtendOp::Uxtl; - let expr1_0 = C::put_in_reg(ctx, pattern4_1); - let expr2_0: bool = true; - let expr3_0 = constructor_lane_size(ctx, pattern2_0); - let expr4_0 = - constructor_vec_extend(ctx, &expr0_0, expr1_0, expr2_0, &expr3_0); - let expr5_0 = constructor_output_reg(ctx, expr4_0); - return Some(expr5_0); - } - _ => {} - } - } - &InstructionData::Binary { - opcode: ref pattern4_0, - args: ref pattern4_1, - } => { - if let &Opcode::IaddPairwise = pattern4_0 { - let (pattern6_0, pattern6_1) = C::unpack_value_array_2(ctx, pattern4_1); - // Rule at src/isa/aarch64/lower.isle line 219. - let expr0_0 = C::put_in_reg(ctx, pattern6_0); - let expr1_0 = C::put_in_reg(ctx, pattern6_1); - let expr2_0 = constructor_vector_size(ctx, pattern2_0); - let expr3_0 = constructor_addp(ctx, expr0_0, expr1_0, &expr2_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - } - &InstructionData::FloatCompare { - opcode: ref pattern4_0, - args: ref pattern4_1, - cond: ref pattern4_2, - } => { - if let &Opcode::Fcmp = pattern4_0 { - let (pattern6_0, pattern6_1) = C::unpack_value_array_2(ctx, pattern4_1); - let pattern7_0 = C::value_type(ctx, pattern6_0); - let mut closure8 = || { - let expr0_0 = C::ty_vector_float(ctx, pattern7_0)?; - return Some(expr0_0); - }; - if let Some(pattern8_0) = closure8() { - // Rule at src/isa/aarch64/lower.isle line 1697. - let expr0_0 = C::put_in_reg(ctx, pattern6_0); - let expr1_0 = C::put_in_reg(ctx, pattern6_1); - let expr2_0 = C::fp_cond_code(ctx, pattern4_2); - let expr3_0 = - constructor_vec_cmp(ctx, expr0_0, expr1_0, pattern7_0, &expr2_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - } - } - &InstructionData::Ternary { - opcode: ref pattern4_0, - args: ref pattern4_1, - } => { - match pattern4_0 { - &Opcode::Select => { - let (pattern6_0, pattern6_1, pattern6_2) = - C::unpack_value_array_3(ctx, pattern4_1); - let pattern7_0 = C::value_type(ctx, pattern6_0); - if pattern7_0 == I8 { - // Rule at src/isa/aarch64/lower.isle line 1764. - let expr0_0 = C::put_in_reg(ctx, pattern6_0); - let expr1_0: Type = I32; - let expr2_0: Type = I32; - let expr3_0: u64 = 255i128 as u64; - let expr4_0 = C::u64_into_imm_logic(ctx, expr2_0, expr3_0); - let expr5_0 = constructor_tst_imm(ctx, expr1_0, expr0_0, expr4_0); - let expr6_0 = Cond::Ne; - let expr7_0 = constructor_lower_select( - ctx, &expr5_0, &expr6_0, pattern2_0, pattern6_1, pattern6_2, - ); - let expr8_0 = C::output(ctx, expr7_0); - return Some(expr8_0); - } - } - &Opcode::SelectSpectreGuard => { - let (pattern6_0, pattern6_1, pattern6_2) = - C::unpack_value_array_3(ctx, pattern4_1); - let pattern7_0 = C::value_type(ctx, pattern6_0); - if let Some(pattern8_0) = C::fits_in_64(ctx, pattern7_0) { - // Rule at src/isa/aarch64/lower.isle line 1807. - let expr0_0 = constructor_put_in_reg_zext64(ctx, pattern6_0); - let expr1_0 = OperandSize::Size64; - let expr2_0 = C::zero_reg(ctx); - let expr3_0 = constructor_cmp(ctx, &expr1_0, expr0_0, expr2_0); - let expr4_0 = Cond::Ne; - let expr5_0 = constructor_lower_select( - ctx, &expr3_0, &expr4_0, pattern2_0, pattern6_1, pattern6_2, - ); - let expr6_0 = C::output(ctx, expr5_0); - return Some(expr6_0); - } - } - _ => {} - } - } - _ => {} - } - } - let pattern1_0 = C::inst_data(ctx, pattern0_0); - match &pattern1_0 { - &InstructionData::Unary { - opcode: ref pattern2_0, - arg: pattern2_1, - } => { - match pattern2_0 { - &Opcode::VallTrue => { - let pattern4_0 = C::value_type(ctx, pattern2_1); - if let Some(pattern5_0) = C::lane_fits_in_32(ctx, pattern4_0) { - let mut closure6 = || { - let expr0_0 = C::not_vec32x2(ctx, pattern5_0)?; - return Some(expr0_0); - }; - if let Some(pattern6_0) = closure6() { - // Rule at src/isa/aarch64/lower.isle line 192. - let expr0_0 = VecLanesOp::Uminv; - let expr1_0 = C::put_in_reg(ctx, pattern2_1); - let expr2_0 = constructor_vector_size(ctx, pattern5_0); - let expr3_0 = constructor_vec_lanes(ctx, &expr0_0, expr1_0, &expr2_0); - let expr4_0: u8 = 0i128 as u8; - let expr5_0 = ScalarSize::Size64; - let expr6_0 = constructor_mov_from_vec(ctx, expr3_0, expr4_0, &expr5_0); - let expr7_0 = OperandSize::Size64; - let expr8_0: u8 = 0i128 as u8; - let expr9_0 = C::u8_into_imm12(ctx, expr8_0); - let expr10_0 = constructor_cmp_imm(ctx, &expr7_0, expr6_0, expr9_0); - let expr11_0 = Cond::Ne; - let expr12_0 = constructor_materialize_bool_result(ctx, &expr11_0); - let expr13_0 = constructor_with_flags(ctx, &expr10_0, &expr12_0); - let expr14_0 = C::output(ctx, expr13_0); - return Some(expr14_0); - } - } - } - &Opcode::ScalarToVector => { - let pattern4_0 = C::value_type(ctx, pattern2_1); - if pattern4_0 == I64 { - // Rule at src/isa/aarch64/lower.isle line 152. - let expr0_0 = C::put_in_reg(ctx, pattern2_1); - let expr1_0 = ScalarSize::Size64; - let expr2_0 = constructor_mov_to_fpu(ctx, expr0_0, &expr1_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - } - _ => {} - } - } - &InstructionData::Store { - opcode: ref pattern2_0, - args: ref pattern2_1, - flags: pattern2_2, - offset: pattern2_3, - } => { - if let &Opcode::Store = pattern2_0 { - let (pattern4_0, pattern4_1) = C::unpack_value_array_2(ctx, pattern2_1); - let pattern5_0 = C::value_type(ctx, pattern4_0); - if let Some(pattern6_0) = C::ty_vec64(ctx, pattern5_0) { - // Rule at src/isa/aarch64/lower.isle line 2253. - let expr0_0: Type = F64; - let expr1_0 = C::offset32_to_u32(ctx, pattern2_3); - let expr2_0 = C::amode(ctx, expr0_0, pattern4_1, expr1_0); - let expr3_0 = C::put_in_reg(ctx, pattern4_0); - let expr4_0 = - constructor_aarch64_fpustore64(ctx, &expr2_0, pattern2_2, expr3_0); - let expr5_0 = constructor_side_effect(ctx, &expr4_0); - return Some(expr5_0); - } - } - } - &InstructionData::IntCompare { - opcode: ref pattern2_0, - args: ref pattern2_1, - cond: ref pattern2_2, - } => { - if let &Opcode::Icmp = pattern2_0 { - let (pattern4_0, pattern4_1) = C::unpack_value_array_2(ctx, pattern2_1); - let pattern5_0 = C::value_type(ctx, pattern4_0); - // Rule at src/isa/aarch64/lower.isle line 1727. - let expr0_0: Type = I8; - let expr1_0 = constructor_lower_icmp_into_reg( - ctx, pattern2_2, pattern4_0, pattern4_1, pattern5_0, expr0_0, - ); - let expr2_0 = C::output(ctx, expr1_0); - return Some(expr2_0); - } - } - _ => {} - } - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::first_result(ctx, pattern0_0) { - let pattern2_0 = C::value_type(ctx, pattern1_0); - if pattern2_0 == I128 { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Unary { - opcode: ref pattern5_0, - arg: pattern5_1, - } = &pattern4_0 - { - if let &Opcode::Sextend = pattern5_0 { - // Rule at src/isa/aarch64/lower.isle line 995. - let expr0_0 = constructor_put_in_reg_sext64(ctx, pattern5_1); - let expr1_0: Type = I64; - let expr2_0: u8 = 63i128 as u8; - let expr3_0 = C::imm_shift_from_u8(ctx, expr2_0); - let expr4_0 = constructor_asr_imm(ctx, expr1_0, expr0_0, expr3_0); - let expr5_0 = C::value_regs(ctx, expr0_0, expr4_0); - let expr6_0 = C::output(ctx, expr5_0); - return Some(expr6_0); - } - } - } - if let Some((pattern3_0, pattern3_1)) = C::multi_lane(ctx, pattern2_0) { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Binary { - opcode: ref pattern5_0, - args: ref pattern5_1, - } = &pattern4_0 - { - match pattern5_0 { - &Opcode::Iadd => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 98. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = C::put_in_reg(ctx, pattern7_1); - let expr2_0 = constructor_vector_size(ctx, pattern2_0); - let expr3_0 = constructor_add_vec(ctx, expr0_0, expr1_0, &expr2_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - &Opcode::Isub => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 549. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = C::put_in_reg(ctx, pattern7_1); - let expr2_0 = constructor_vector_size(ctx, pattern2_0); - let expr3_0 = constructor_sub_vec(ctx, expr0_0, expr1_0, &expr2_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - _ => {} - } - } - } - if let Some((pattern3_0, pattern3_1)) = C::dynamic_lane(ctx, pattern2_0) { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Binary { - opcode: ref pattern5_0, - args: ref pattern5_1, - } = &pattern4_0 - { - match pattern5_0 { - &Opcode::Fadd => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower_dynamic_neon.isle line 15. - let expr0_0 = VecALUOp::Fadd; - let expr1_0 = C::put_in_reg(ctx, pattern7_0); - let expr2_0 = C::put_in_reg(ctx, pattern7_1); - let expr3_0 = constructor_vector_size(ctx, pattern2_0); - let expr4_0 = - constructor_vec_rrr(ctx, &expr0_0, expr1_0, expr2_0, &expr3_0); - let expr5_0 = C::value_reg(ctx, expr4_0); - let expr6_0 = C::output(ctx, expr5_0); - return Some(expr6_0); - } - &Opcode::Fsub => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower_dynamic_neon.isle line 19. - let expr0_0 = VecALUOp::Fsub; - let expr1_0 = C::put_in_reg(ctx, pattern7_0); - let expr2_0 = C::put_in_reg(ctx, pattern7_1); - let expr3_0 = constructor_vector_size(ctx, pattern2_0); - let expr4_0 = - constructor_vec_rrr(ctx, &expr0_0, expr1_0, expr2_0, &expr3_0); - let expr5_0 = C::value_reg(ctx, expr4_0); - let expr6_0 = C::output(ctx, expr5_0); - return Some(expr6_0); - } - &Opcode::Fmul => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower_dynamic_neon.isle line 23. - let expr0_0 = VecALUOp::Fmul; - let expr1_0 = C::put_in_reg(ctx, pattern7_0); - let expr2_0 = C::put_in_reg(ctx, pattern7_1); - let expr3_0 = constructor_vector_size(ctx, pattern2_0); - let expr4_0 = - constructor_vec_rrr(ctx, &expr0_0, expr1_0, expr2_0, &expr3_0); - let expr5_0 = C::value_reg(ctx, expr4_0); - let expr6_0 = C::output(ctx, expr5_0); - return Some(expr6_0); - } - &Opcode::Fdiv => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower_dynamic_neon.isle line 27. - let expr0_0 = VecALUOp::Fdiv; - let expr1_0 = C::put_in_reg(ctx, pattern7_0); - let expr2_0 = C::put_in_reg(ctx, pattern7_1); - let expr3_0 = constructor_vector_size(ctx, pattern2_0); - let expr4_0 = - constructor_vec_rrr(ctx, &expr0_0, expr1_0, expr2_0, &expr3_0); - let expr5_0 = C::value_reg(ctx, expr4_0); - let expr6_0 = C::output(ctx, expr5_0); - return Some(expr6_0); - } - &Opcode::Fmin => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower_dynamic_neon.isle line 31. - let expr0_0 = VecALUOp::Fmin; - let expr1_0 = C::put_in_reg(ctx, pattern7_0); - let expr2_0 = C::put_in_reg(ctx, pattern7_1); - let expr3_0 = constructor_vector_size(ctx, pattern2_0); - let expr4_0 = - constructor_vec_rrr(ctx, &expr0_0, expr1_0, expr2_0, &expr3_0); - let expr5_0 = C::value_reg(ctx, expr4_0); - let expr6_0 = C::output(ctx, expr5_0); - return Some(expr6_0); - } - &Opcode::FminPseudo => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower_dynamic_neon.isle line 39. - let expr0_0 = VecALUOp::Fcmgt; - let expr1_0 = C::put_in_reg(ctx, pattern7_0); - let expr2_0 = C::put_in_reg(ctx, pattern7_1); - let expr3_0 = constructor_vector_size(ctx, pattern2_0); - let expr4_0 = - constructor_vec_rrr(ctx, &expr0_0, expr1_0, expr2_0, &expr3_0); - let expr5_0 = C::put_in_reg(ctx, pattern7_1); - let expr6_0 = C::put_in_reg(ctx, pattern7_0); - let expr7_0 = constructor_bsl(ctx, pattern2_0, expr4_0, expr5_0, expr6_0); - let expr8_0 = C::value_reg(ctx, expr7_0); - let expr9_0 = C::output(ctx, expr8_0); - return Some(expr9_0); - } - &Opcode::Fmax => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower_dynamic_neon.isle line 35. - let expr0_0 = VecALUOp::Fmax; - let expr1_0 = C::put_in_reg(ctx, pattern7_0); - let expr2_0 = C::put_in_reg(ctx, pattern7_1); - let expr3_0 = constructor_vector_size(ctx, pattern2_0); - let expr4_0 = - constructor_vec_rrr(ctx, &expr0_0, expr1_0, expr2_0, &expr3_0); - let expr5_0 = C::value_reg(ctx, expr4_0); - let expr6_0 = C::output(ctx, expr5_0); - return Some(expr6_0); - } - &Opcode::FmaxPseudo => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower_dynamic_neon.isle line 45. - let expr0_0 = VecALUOp::Fcmgt; - let expr1_0 = C::put_in_reg(ctx, pattern7_1); - let expr2_0 = C::put_in_reg(ctx, pattern7_0); - let expr3_0 = constructor_vector_size(ctx, pattern2_0); - let expr4_0 = - constructor_vec_rrr(ctx, &expr0_0, expr1_0, expr2_0, &expr3_0); - let expr5_0 = C::put_in_reg(ctx, pattern7_1); - let expr6_0 = C::put_in_reg(ctx, pattern7_0); - let expr7_0 = constructor_bsl(ctx, pattern2_0, expr4_0, expr5_0, expr6_0); - let expr8_0 = C::value_reg(ctx, expr7_0); - let expr9_0 = C::output(ctx, expr8_0); - return Some(expr9_0); - } - _ => {} - } - } - } - if let Some(pattern3_0) = C::fits_in_16(ctx, pattern2_0) { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Binary { - opcode: ref pattern5_0, - args: ref pattern5_1, - } = &pattern4_0 - { - match pattern5_0 { - &Opcode::Rotl => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 1316. - let expr0_0 = C::put_in_regs(ctx, pattern7_1); - let expr1_0: usize = 0i128 as usize; - let expr2_0 = C::value_regs_get(ctx, expr0_0, expr1_0); - let expr3_0: Type = I32; - let expr4_0 = C::zero_reg(ctx); - let expr5_0 = constructor_sub(ctx, expr3_0, expr4_0, expr2_0); - let expr6_0 = constructor_put_in_reg_zext32(ctx, pattern7_0); - let expr7_0 = constructor_small_rotr(ctx, pattern3_0, expr6_0, expr5_0); - let expr8_0 = constructor_output_reg(ctx, expr7_0); - return Some(expr8_0); - } - &Opcode::Rotr => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - if let Some(pattern8_0) = C::def_inst(ctx, pattern7_1) { - let pattern9_0 = C::inst_data(ctx, pattern8_0); - if let &InstructionData::UnaryImm { - opcode: ref pattern10_0, - imm: pattern10_1, - } = &pattern9_0 - { - if let &Opcode::Iconst = pattern10_0 { - let mut closure12 = || { - let expr0_0 = - C::imm_shift_from_imm64(ctx, pattern3_0, pattern10_1)?; - return Some(expr0_0); - }; - if let Some(pattern12_0) = closure12() { - // Rule at src/isa/aarch64/lower.isle line 1387. - let expr0_0 = - constructor_put_in_reg_zext32(ctx, pattern7_0); - let expr1_0 = constructor_small_rotr_imm( - ctx, - pattern3_0, - expr0_0, - pattern12_0, - ); - let expr2_0 = constructor_output_reg(ctx, expr1_0); - return Some(expr2_0); - } - } - } - } - } - _ => {} - } - } - } - if let Some(pattern3_0) = C::fits_in_32(ctx, pattern2_0) { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Binary { - opcode: ref pattern5_0, - args: ref pattern5_1, - } = &pattern4_0 - { - if let &Opcode::Sshr = pattern5_0 { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 1264. - let expr0_0 = ALUOp::Asr; - let expr1_0 = constructor_put_in_reg_sext32(ctx, pattern7_0); - let expr2_0 = - constructor_do_shift(ctx, &expr0_0, pattern3_0, expr1_0, pattern7_1); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - } - } - if let Some(pattern3_0) = C::fits_in_64(ctx, pattern2_0) { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Unary { - opcode: ref pattern5_0, - arg: pattern5_1, - } = &pattern4_0 - { - if let &Opcode::Uextend = pattern5_0 { - let pattern7_0 = C::value_type(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 948. - let expr0_0 = C::put_in_reg(ctx, pattern5_1); - let expr1_0: bool = false; - let expr2_0 = C::ty_bits(ctx, pattern7_0); - let expr3_0 = C::ty_bits(ctx, pattern3_0); - let expr4_0 = constructor_extend(ctx, expr0_0, expr1_0, expr2_0, expr3_0); - let expr5_0 = constructor_output_reg(ctx, expr4_0); - return Some(expr5_0); - } - } - } - if let Some(pattern3_0) = C::ty_vec128(ctx, pattern2_0) { - if let Some(()) = C::not_i64x2(ctx, pattern3_0) { - let pattern5_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Binary { - opcode: ref pattern6_0, - args: ref pattern6_1, - } = &pattern5_0 - { - if let &Opcode::Imul = pattern6_0 { - let (pattern8_0, pattern8_1) = C::unpack_value_array_2(ctx, pattern6_1); - // Rule at src/isa/aarch64/lower.isle line 625. - let expr0_0 = C::put_in_reg(ctx, pattern8_0); - let expr1_0 = C::put_in_reg(ctx, pattern8_1); - let expr2_0 = constructor_vector_size(ctx, pattern3_0); - let expr3_0 = constructor_mul(ctx, expr0_0, expr1_0, &expr2_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - } - } - let pattern4_0 = C::inst_data(ctx, pattern0_0); - match &pattern4_0 { - &InstructionData::Unary { - opcode: ref pattern5_0, - arg: pattern5_1, - } => { - if let &Opcode::Bnot = pattern5_0 { - // Rule at src/isa/aarch64/lower.isle line 1052. - let expr0_0 = C::put_in_reg(ctx, pattern5_1); - let expr1_0 = constructor_vector_size(ctx, pattern3_0); - let expr2_0 = constructor_not(ctx, expr0_0, &expr1_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - } - &InstructionData::Binary { - opcode: ref pattern5_0, - args: ref pattern5_1, - } => { - match pattern5_0 { - &Opcode::Band => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 1065. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = C::put_in_reg(ctx, pattern7_1); - let expr2_0 = constructor_vector_size(ctx, pattern3_0); - let expr3_0 = constructor_and_vec(ctx, expr0_0, expr1_0, &expr2_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - &Opcode::Bor => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 1078. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = C::put_in_reg(ctx, pattern7_1); - let expr2_0 = constructor_vector_size(ctx, pattern3_0); - let expr3_0 = constructor_orr_vec(ctx, expr0_0, expr1_0, &expr2_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - &Opcode::Bxor => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 1091. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = C::put_in_reg(ctx, pattern7_1); - let expr2_0 = constructor_vector_size(ctx, pattern3_0); - let expr3_0 = constructor_eor_vec(ctx, expr0_0, expr1_0, &expr2_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - &Opcode::BandNot => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 1104. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = C::put_in_reg(ctx, pattern7_1); - let expr2_0 = constructor_vector_size(ctx, pattern3_0); - let expr3_0 = constructor_bic_vec(ctx, expr0_0, expr1_0, &expr2_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - &Opcode::Ishl => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 1168. - let expr0_0 = constructor_vector_size(ctx, pattern3_0); - let expr1_0: Type = I32; - let expr2_0 = C::put_in_reg(ctx, pattern7_1); - let expr3_0 = C::shift_mask(ctx, pattern3_0); - let expr4_0 = constructor_and_imm(ctx, expr1_0, expr2_0, expr3_0); - let expr5_0 = constructor_vec_dup(ctx, expr4_0, &expr0_0); - let expr6_0 = C::put_in_reg(ctx, pattern7_0); - let expr7_0 = constructor_sshl(ctx, expr6_0, expr5_0, &expr0_0); - let expr8_0 = constructor_output_reg(ctx, expr7_0); - return Some(expr8_0); - } - &Opcode::Ushr => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 1228. - let expr0_0 = constructor_vector_size(ctx, pattern3_0); - let expr1_0: Type = I32; - let expr2_0 = C::put_in_reg(ctx, pattern7_1); - let expr3_0 = C::shift_mask(ctx, pattern3_0); - let expr4_0 = constructor_and_imm(ctx, expr1_0, expr2_0, expr3_0); - let expr5_0: Type = I64; - let expr6_0 = C::zero_reg(ctx); - let expr7_0 = constructor_sub(ctx, expr5_0, expr6_0, expr4_0); - let expr8_0 = constructor_vec_dup(ctx, expr7_0, &expr0_0); - let expr9_0 = C::put_in_reg(ctx, pattern7_0); - let expr10_0 = constructor_ushl(ctx, expr9_0, expr8_0, &expr0_0); - let expr11_0 = constructor_output_reg(ctx, expr10_0); - return Some(expr11_0); - } - _ => {} - } - } - _ => {} - } - } - if let Some(pattern3_0) = C::ty_dyn_vec64(ctx, pattern2_0) { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Load { - opcode: ref pattern5_0, - arg: pattern5_1, - flags: pattern5_2, - offset: pattern5_3, - } = &pattern4_0 - { - if let &Opcode::Load = pattern5_0 { - // Rule at src/isa/aarch64/lower.isle line 2136. - let expr0_0: Type = F64; - let expr1_0 = C::offset32_to_u32(ctx, pattern5_3); - let expr2_0 = C::amode(ctx, expr0_0, pattern5_1, expr1_0); - let expr3_0 = constructor_aarch64_fpuload64(ctx, &expr2_0, pattern5_2); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - } - } - if let Some(pattern3_0) = C::ty_dyn128_int(ctx, pattern2_0) { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Binary { - opcode: ref pattern5_0, - args: ref pattern5_1, - } = &pattern4_0 - { - match pattern5_0 { - &Opcode::Snarrow => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - let mut closure8 = || { - let expr0_0 = C::zero_value(ctx, pattern7_1)?; - return Some(expr0_0); - }; - if let Some(pattern8_0) = closure8() { - // Rule at src/isa/aarch64/lower_dynamic_neon.isle line 51. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = constructor_lane_size(ctx, pattern3_0); - let expr2_0 = constructor_sqxtn(ctx, expr0_0, &expr1_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - } - &Opcode::Unarrow => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - let mut closure8 = || { - let expr0_0 = C::zero_value(ctx, pattern7_1)?; - return Some(expr0_0); - }; - if let Some(pattern8_0) = closure8() { - // Rule at src/isa/aarch64/lower_dynamic_neon.isle line 65. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = constructor_lane_size(ctx, pattern3_0); - let expr2_0 = constructor_sqxtun(ctx, expr0_0, &expr1_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - } - &Opcode::Uunarrow => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - let mut closure8 = || { - let expr0_0 = C::zero_value(ctx, pattern7_1)?; - return Some(expr0_0); - }; - if let Some(pattern8_0) = closure8() { - // Rule at src/isa/aarch64/lower_dynamic_neon.isle line 79. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = constructor_lane_size(ctx, pattern3_0); - let expr2_0 = constructor_uqxtn(ctx, expr0_0, &expr1_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - } - _ => {} - } - } - } - let pattern3_0 = C::inst_data(ctx, pattern0_0); - match &pattern3_0 { - &InstructionData::Unary { - opcode: ref pattern4_0, - arg: pattern4_1, - } => { - if let &Opcode::Splat = pattern4_0 { - let pattern6_0 = C::value_type(ctx, pattern4_1); - if let Some(pattern7_0) = C::ty_scalar_float(ctx, pattern6_0) { - // Rule at src/isa/aarch64/lower.isle line 1837. - let expr0_0 = C::put_in_reg(ctx, pattern4_1); - let expr1_0 = constructor_vector_size(ctx, pattern2_0); - let expr2_0 = constructor_vec_dup_from_fpu(ctx, expr0_0, &expr1_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - } - } - &InstructionData::Ternary { - opcode: ref pattern4_0, - args: ref pattern4_1, - } => { - match pattern4_0 { - &Opcode::Select => { - let (pattern6_0, pattern6_1, pattern6_2) = - C::unpack_value_array_3(ctx, pattern4_1); - let pattern7_0 = C::value_type(ctx, pattern6_0); - if let Some(pattern8_0) = C::fits_in_32(ctx, pattern7_0) { - // Rule at src/isa/aarch64/lower.isle line 1770. - let expr0_0 = constructor_put_in_reg_zext32(ctx, pattern6_0); - let expr1_0 = OperandSize::Size32; - let expr2_0 = C::zero_reg(ctx); - let expr3_0 = constructor_cmp(ctx, &expr1_0, expr0_0, expr2_0); - let expr4_0 = Cond::Ne; - let expr5_0 = constructor_lower_select( - ctx, &expr3_0, &expr4_0, pattern2_0, pattern6_1, pattern6_2, - ); - let expr6_0 = C::output(ctx, expr5_0); - return Some(expr6_0); - } - } - &Opcode::SelectSpectreGuard => { - let (pattern6_0, pattern6_1, pattern6_2) = - C::unpack_value_array_3(ctx, pattern4_1); - let pattern7_0 = C::value_type(ctx, pattern6_0); - if pattern7_0 == I128 { - // Rule at src/isa/aarch64/lower.isle line 1813. - let expr0_0 = C::put_in_regs(ctx, pattern6_0); - let expr1_0: usize = 0i128 as usize; - let expr2_0 = C::value_regs_get(ctx, expr0_0, expr1_0); - let expr3_0: usize = 1i128 as usize; - let expr4_0 = C::value_regs_get(ctx, expr0_0, expr3_0); - let expr5_0: Type = I64; - let expr6_0 = constructor_orr(ctx, expr5_0, expr2_0, expr4_0); - let expr7_0 = OperandSize::Size64; - let expr8_0 = C::zero_reg(ctx); - let expr9_0 = constructor_cmp(ctx, &expr7_0, expr6_0, expr8_0); - let expr10_0 = Cond::Ne; - let expr11_0 = constructor_lower_select( - ctx, &expr9_0, &expr10_0, pattern2_0, pattern6_1, pattern6_2, - ); - let expr12_0 = C::output(ctx, expr11_0); - return Some(expr12_0); - } - } - _ => {} - } - } - _ => {} - } - } - let pattern1_0 = C::inst_data(ctx, pattern0_0); - match &pattern1_0 { - &InstructionData::Unary { - opcode: ref pattern2_0, - arg: pattern2_1, - } => { - if let &Opcode::ScalarToVector = pattern2_0 { - let pattern4_0 = C::value_type(ctx, pattern2_1); - if let Some(pattern5_0) = C::int_fits_in_32(ctx, pattern4_0) { - // Rule at src/isa/aarch64/lower.isle line 155. - let expr0_0 = constructor_put_in_reg_zext32(ctx, pattern2_1); - let expr1_0 = ScalarSize::Size32; - let expr2_0 = constructor_mov_to_fpu(ctx, expr0_0, &expr1_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - } - } - &InstructionData::Store { - opcode: ref pattern2_0, - args: ref pattern2_1, - flags: pattern2_2, - offset: pattern2_3, - } => { - if let &Opcode::Store = pattern2_0 { - let (pattern4_0, pattern4_1) = C::unpack_value_array_2(ctx, pattern2_1); - let pattern5_0 = C::value_type(ctx, pattern4_0); - if let Some(pattern6_0) = C::ty_dyn_vec64(ctx, pattern5_0) { - // Rule at src/isa/aarch64/lower.isle line 2261. - let expr0_0: Type = F64; - let expr1_0 = C::offset32_to_u32(ctx, pattern2_3); - let expr2_0 = C::amode(ctx, expr0_0, pattern4_1, expr1_0); - let expr3_0 = C::put_in_reg(ctx, pattern4_0); - let expr4_0 = - constructor_aarch64_fpustore64(ctx, &expr2_0, pattern2_2, expr3_0); - let expr5_0 = constructor_side_effect(ctx, &expr4_0); - return Some(expr5_0); - } - } - } - _ => {} - } - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::first_result(ctx, pattern0_0) { - let pattern2_0 = C::value_type(ctx, pattern1_0); - if pattern2_0 == I128 { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Binary { - opcode: ref pattern5_0, - args: ref pattern5_1, - } = &pattern4_0 - { - if let &Opcode::Iadd = pattern5_0 { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 102. - let expr0_0 = C::put_in_regs(ctx, pattern7_0); - let expr1_0: usize = 0i128 as usize; - let expr2_0 = C::value_regs_get(ctx, expr0_0, expr1_0); - let expr3_0: usize = 1i128 as usize; - let expr4_0 = C::value_regs_get(ctx, expr0_0, expr3_0); - let expr5_0 = C::put_in_regs(ctx, pattern7_1); - let expr6_0: usize = 0i128 as usize; - let expr7_0 = C::value_regs_get(ctx, expr5_0, expr6_0); - let expr8_0: usize = 1i128 as usize; - let expr9_0 = C::value_regs_get(ctx, expr5_0, expr8_0); - let expr10_0: Type = I64; - let expr11_0 = - constructor_add_with_flags_paired(ctx, expr10_0, expr2_0, expr7_0); - let expr12_0: Type = I64; - let expr13_0 = constructor_adc_paired(ctx, expr12_0, expr4_0, expr9_0); - let expr14_0 = constructor_with_flags(ctx, &expr11_0, &expr13_0); - let expr15_0 = C::output(ctx, expr14_0); - return Some(expr15_0); - } - } - } - if let Some(pattern3_0) = C::fits_in_16(ctx, pattern2_0) { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Binary { - opcode: ref pattern5_0, - args: ref pattern5_1, - } = &pattern4_0 - { - if let &Opcode::Rotr = pattern5_0 { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 1375. - let expr0_0 = constructor_put_in_reg_zext32(ctx, pattern7_0); - let expr1_0 = C::put_in_regs(ctx, pattern7_1); - let expr2_0: usize = 0i128 as usize; - let expr3_0 = C::value_regs_get(ctx, expr1_0, expr2_0); - let expr4_0 = constructor_small_rotr(ctx, pattern3_0, expr0_0, expr3_0); - let expr5_0 = constructor_output_reg(ctx, expr4_0); - return Some(expr5_0); - } - } - } - if let Some(pattern3_0) = C::fits_in_64(ctx, pattern2_0) { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - match &pattern4_0 { - &InstructionData::Unary { - opcode: ref pattern5_0, - arg: pattern5_1, - } => { - if let &Opcode::Sextend = pattern5_0 { - if let Some(pattern7_0) = C::def_inst(ctx, pattern5_1) { - let pattern8_0 = C::inst_data(ctx, pattern7_0); - if let &InstructionData::BinaryImm8 { - opcode: ref pattern9_0, - arg: pattern9_1, - imm: pattern9_2, - } = &pattern8_0 - { - if let &Opcode::Extractlane = pattern9_0 { - let pattern11_0 = C::value_type(ctx, pattern9_1); - let pattern12_0 = C::u8_from_uimm8(ctx, pattern9_2); - // Rule at src/isa/aarch64/lower.isle line 986. - let expr0_0 = C::put_in_reg(ctx, pattern9_1); - let expr1_0 = constructor_vector_size(ctx, pattern11_0); - let expr2_0 = constructor_size_from_ty(ctx, pattern3_0); - let expr3_0 = constructor_mov_from_vec_signed( - ctx, - expr0_0, - pattern12_0, - &expr1_0, - &expr2_0, - ); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - } - } - } - } - &InstructionData::Binary { - opcode: ref pattern5_0, - args: ref pattern5_1, - } => { - match pattern5_0 { - &Opcode::Isub => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - if let Some(pattern8_0) = C::def_inst(ctx, pattern7_1) { - let pattern9_0 = C::inst_data(ctx, pattern8_0); - if let &InstructionData::Binary { - opcode: ref pattern10_0, - args: ref pattern10_1, - } = &pattern9_0 - { - if let &Opcode::Ishl = pattern10_0 { - let (pattern12_0, pattern12_1) = - C::unpack_value_array_2(ctx, pattern10_1); - if let Some(pattern13_0) = C::def_inst(ctx, pattern12_1) { - let pattern14_0 = C::inst_data(ctx, pattern13_0); - if let &InstructionData::UnaryImm { - opcode: ref pattern15_0, - imm: pattern15_1, - } = &pattern14_0 - { - if let &Opcode::Iconst = pattern15_0 { - let mut closure17 = || { - let expr0_0 = C::lshl_from_imm64( - ctx, - pattern3_0, - pattern15_1, - )?; - return Some(expr0_0); - }; - if let Some(pattern17_0) = closure17() { - // Rule at src/isa/aarch64/lower.isle line 543. - let expr0_0 = - C::put_in_reg(ctx, pattern7_0); - let expr1_0 = - C::put_in_reg(ctx, pattern12_0); - let expr2_0 = constructor_sub_shift( - ctx, - pattern3_0, - expr0_0, - expr1_0, - pattern17_0, - ); - let expr3_0 = - constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - } - } - } - } - } - } - } - &Opcode::Imul => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 593. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = C::put_in_reg(ctx, pattern7_1); - let expr2_0 = C::zero_reg(ctx); - let expr3_0 = - constructor_madd(ctx, pattern3_0, expr0_0, expr1_0, expr2_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - _ => {} - } - } - _ => {} - } - } - if let Some(pattern3_0) = C::ty_vec128(ctx, pattern2_0) { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Load { - opcode: ref pattern5_0, - arg: pattern5_1, - flags: pattern5_2, - offset: pattern5_3, - } = &pattern4_0 - { - if let &Opcode::Load = pattern5_0 { - // Rule at src/isa/aarch64/lower.isle line 2132. - let expr0_0: Type = I8X16; - let expr1_0 = C::offset32_to_u32(ctx, pattern5_3); - let expr2_0 = C::amode(ctx, expr0_0, pattern5_1, expr1_0); - let expr3_0 = constructor_aarch64_fpuload128(ctx, &expr2_0, pattern5_2); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - } - } - if let Some(pattern3_0) = C::ty_dyn128_int(ctx, pattern2_0) { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Binary { - opcode: ref pattern5_0, - args: ref pattern5_1, - } = &pattern4_0 - { - match pattern5_0 { - &Opcode::Snarrow => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower_dynamic_neon.isle line 59. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = constructor_lane_size(ctx, pattern3_0); - let expr2_0 = constructor_sqxtn(ctx, expr0_0, &expr1_0); - let expr3_0 = C::put_in_reg(ctx, pattern7_1); - let expr4_0 = constructor_lane_size(ctx, pattern3_0); - let expr5_0 = constructor_sqxtn2(ctx, expr2_0, expr3_0, &expr4_0); - let expr6_0 = constructor_output_reg(ctx, expr5_0); - return Some(expr6_0); - } - &Opcode::Unarrow => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower_dynamic_neon.isle line 73. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = constructor_lane_size(ctx, pattern3_0); - let expr2_0 = constructor_sqxtun(ctx, expr0_0, &expr1_0); - let expr3_0 = C::put_in_reg(ctx, pattern7_1); - let expr4_0 = constructor_lane_size(ctx, pattern3_0); - let expr5_0 = constructor_sqxtun2(ctx, expr2_0, expr3_0, &expr4_0); - let expr6_0 = constructor_output_reg(ctx, expr5_0); - return Some(expr6_0); - } - &Opcode::Uunarrow => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower_dynamic_neon.isle line 87. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = constructor_lane_size(ctx, pattern3_0); - let expr2_0 = constructor_uqxtn(ctx, expr0_0, &expr1_0); - let expr3_0 = C::put_in_reg(ctx, pattern7_1); - let expr4_0 = constructor_lane_size(ctx, pattern3_0); - let expr5_0 = constructor_uqxtn2(ctx, expr2_0, expr3_0, &expr4_0); - let expr6_0 = constructor_output_reg(ctx, expr5_0); - return Some(expr6_0); - } - _ => {} - } - } - } - let pattern3_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Ternary { - opcode: ref pattern4_0, - args: ref pattern4_1, - } = &pattern3_0 - { - if let &Opcode::Select = pattern4_0 { - let (pattern6_0, pattern6_1, pattern6_2) = C::unpack_value_array_3(ctx, pattern4_1); - let pattern7_0 = C::value_type(ctx, pattern6_0); - if let Some(pattern8_0) = C::fits_in_64(ctx, pattern7_0) { - // Rule at src/isa/aarch64/lower.isle line 1776. - let expr0_0 = constructor_put_in_reg_zext64(ctx, pattern6_0); - let expr1_0 = OperandSize::Size64; - let expr2_0 = C::zero_reg(ctx); - let expr3_0 = constructor_cmp(ctx, &expr1_0, expr0_0, expr2_0); - let expr4_0 = Cond::Ne; - let expr5_0 = constructor_lower_select( - ctx, &expr3_0, &expr4_0, pattern2_0, pattern6_1, pattern6_2, - ); - let expr6_0 = C::output(ctx, expr5_0); - return Some(expr6_0); - } - } - } - } - let pattern1_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Store { - opcode: ref pattern2_0, - args: ref pattern2_1, - flags: pattern2_2, - offset: pattern2_3, - } = &pattern1_0 - { - if let &Opcode::Store = pattern2_0 { - let (pattern4_0, pattern4_1) = C::unpack_value_array_2(ctx, pattern2_1); - let pattern5_0 = C::value_type(ctx, pattern4_0); - if let Some(pattern6_0) = C::ty_vec128(ctx, pattern5_0) { - // Rule at src/isa/aarch64/lower.isle line 2257. - let expr0_0: Type = I8X16; - let expr1_0 = C::offset32_to_u32(ctx, pattern2_3); - let expr2_0 = C::amode(ctx, expr0_0, pattern4_1, expr1_0); - let expr3_0 = C::put_in_reg(ctx, pattern4_0); - let expr4_0 = constructor_aarch64_fpustore128(ctx, &expr2_0, pattern2_2, expr3_0); - let expr5_0 = constructor_side_effect(ctx, &expr4_0); - return Some(expr5_0); - } - } - } - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::first_result(ctx, pattern0_0) { - let pattern2_0 = C::value_type(ctx, pattern1_0); - if let Some((pattern3_0, pattern3_1)) = C::dynamic_lane(ctx, pattern2_0) { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Binary { - opcode: ref pattern5_0, - args: ref pattern5_1, - } = &pattern4_0 - { - if let &Opcode::Iadd = pattern5_0 { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower_dynamic_neon.isle line 3. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = C::put_in_reg(ctx, pattern7_1); - let expr2_0 = constructor_vector_size(ctx, pattern2_0); - let expr3_0 = constructor_add_vec(ctx, expr0_0, expr1_0, &expr2_0); - let expr4_0 = C::value_reg(ctx, expr3_0); - let expr5_0 = C::output(ctx, expr4_0); - return Some(expr5_0); - } - } - } - if let Some(pattern3_0) = C::lane_fits_in_32(ctx, pattern2_0) { - if let Some((pattern4_0, pattern4_1)) = C::dynamic_lane(ctx, pattern3_0) { - let pattern5_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Binary { - opcode: ref pattern6_0, - args: ref pattern6_1, - } = &pattern5_0 - { - if let &Opcode::Imul = pattern6_0 { - let (pattern8_0, pattern8_1) = C::unpack_value_array_2(ctx, pattern6_1); - // Rule at src/isa/aarch64/lower_dynamic_neon.isle line 11. - let expr0_0 = VecALUOp::Mul; - let expr1_0 = C::put_in_reg(ctx, pattern8_0); - let expr2_0 = C::put_in_reg(ctx, pattern8_1); - let expr3_0 = constructor_vector_size(ctx, pattern3_0); - let expr4_0 = - constructor_vec_rrr(ctx, &expr0_0, expr1_0, expr2_0, &expr3_0); - let expr5_0 = C::value_reg(ctx, expr4_0); - let expr6_0 = C::output(ctx, expr5_0); - return Some(expr6_0); - } - } - } - } - if let Some(pattern3_0) = C::fits_in_64(ctx, pattern2_0) { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - match &pattern4_0 { - &InstructionData::Unary { - opcode: ref pattern5_0, - arg: pattern5_1, - } => { - if let &Opcode::Sextend = pattern5_0 { - let pattern7_0 = C::value_type(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 981. - let expr0_0 = C::put_in_reg(ctx, pattern5_1); - let expr1_0: bool = true; - let expr2_0 = C::ty_bits(ctx, pattern7_0); - let expr3_0 = C::ty_bits(ctx, pattern3_0); - let expr4_0 = constructor_extend(ctx, expr0_0, expr1_0, expr2_0, expr3_0); - let expr5_0 = constructor_output_reg(ctx, expr4_0); - return Some(expr5_0); - } - } - &InstructionData::Binary { - opcode: ref pattern5_0, - args: ref pattern5_1, - } => { - if let &Opcode::Isub = pattern5_0 { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 524. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = C::put_in_reg(ctx, pattern7_1); - let expr2_0 = constructor_sub(ctx, pattern3_0, expr0_0, expr1_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - } - _ => {} - } - } - if let Some(pattern3_0) = C::ty_dyn_vec128(ctx, pattern2_0) { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Load { - opcode: ref pattern5_0, - arg: pattern5_1, - flags: pattern5_2, - offset: pattern5_3, - } = &pattern4_0 - { - if let &Opcode::Load = pattern5_0 { - // Rule at src/isa/aarch64/lower.isle line 2140. - let expr0_0: Type = I8X16; - let expr1_0 = C::offset32_to_u32(ctx, pattern5_3); - let expr2_0 = C::amode(ctx, expr0_0, pattern5_1, expr1_0); - let expr3_0 = constructor_aarch64_fpuload128(ctx, &expr2_0, pattern5_2); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - } - } - let pattern3_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Ternary { - opcode: ref pattern4_0, - args: ref pattern4_1, - } = &pattern3_0 - { - if let &Opcode::Select = pattern4_0 { - let (pattern6_0, pattern6_1, pattern6_2) = C::unpack_value_array_3(ctx, pattern4_1); - let pattern7_0 = C::value_type(ctx, pattern6_0); - if pattern7_0 == I128 { - // Rule at src/isa/aarch64/lower.isle line 1782. - let expr0_0 = C::put_in_regs(ctx, pattern6_0); - let expr1_0: usize = 0i128 as usize; - let expr2_0 = C::value_regs_get(ctx, expr0_0, expr1_0); - let expr3_0: usize = 1i128 as usize; - let expr4_0 = C::value_regs_get(ctx, expr0_0, expr3_0); - let expr5_0: Type = I64; - let expr6_0 = constructor_orr(ctx, expr5_0, expr2_0, expr4_0); - let expr7_0 = OperandSize::Size64; - let expr8_0 = C::zero_reg(ctx); - let expr9_0 = constructor_cmp(ctx, &expr7_0, expr6_0, expr8_0); - let expr10_0 = Cond::Ne; - let expr11_0 = constructor_lower_select( - ctx, &expr9_0, &expr10_0, pattern2_0, pattern6_1, pattern6_2, - ); - let expr12_0 = C::output(ctx, expr11_0); - return Some(expr12_0); - } - } - } - } - let pattern1_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Store { - opcode: ref pattern2_0, - args: ref pattern2_1, - flags: pattern2_2, - offset: pattern2_3, - } = &pattern1_0 - { - if let &Opcode::Store = pattern2_0 { - let (pattern4_0, pattern4_1) = C::unpack_value_array_2(ctx, pattern2_1); - let pattern5_0 = C::value_type(ctx, pattern4_0); - if let Some(pattern6_0) = C::ty_dyn_vec128(ctx, pattern5_0) { - // Rule at src/isa/aarch64/lower.isle line 2265. - let expr0_0: Type = I8X16; - let expr1_0 = C::offset32_to_u32(ctx, pattern2_3); - let expr2_0 = C::amode(ctx, expr0_0, pattern4_1, expr1_0); - let expr3_0 = C::put_in_reg(ctx, pattern4_0); - let expr4_0 = constructor_aarch64_fpustore128(ctx, &expr2_0, pattern2_2, expr3_0); - let expr5_0 = constructor_side_effect(ctx, &expr4_0); - return Some(expr5_0); - } - } - } - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::first_result(ctx, pattern0_0) { - let pattern2_0 = C::value_type(ctx, pattern1_0); - if let Some((pattern3_0, pattern3_1)) = C::dynamic_lane(ctx, pattern2_0) { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Binary { - opcode: ref pattern5_0, - args: ref pattern5_1, - } = &pattern4_0 - { - if let &Opcode::Isub = pattern5_0 { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower_dynamic_neon.isle line 7. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = C::put_in_reg(ctx, pattern7_1); - let expr2_0 = constructor_vector_size(ctx, pattern2_0); - let expr3_0 = constructor_sub_vec(ctx, expr0_0, expr1_0, &expr2_0); - let expr4_0 = C::value_reg(ctx, expr3_0); - let expr5_0 = C::output(ctx, expr4_0); - return Some(expr5_0); - } - } - } - } - return None; -} - -// Generated as internal constructor for term lower_branch. -pub fn constructor_lower_branch( - ctx: &mut C, - arg0: Inst, - arg1: &VecMachLabel, -) -> Option { - let pattern0_0 = arg0; - let pattern1_0 = C::inst_data(ctx, pattern0_0); - match &pattern1_0 { - &InstructionData::BranchTable { - opcode: ref pattern2_0, - arg: pattern2_1, - destination: pattern2_2, - table: pattern2_3, - } => { - if let &Opcode::BrTable = pattern2_0 { - let pattern4_0 = arg1; - // Rule at src/isa/aarch64/lower.isle line 2564. - let expr0_0 = C::targets_jt_size(ctx, pattern4_0); - let expr1_0 = C::targets_jt_space(ctx, pattern4_0); - let expr2_0 = constructor_emit_island(ctx, expr1_0); - let expr3_0 = constructor_side_effect(ctx, &expr2_0); - let expr4_0 = constructor_put_in_reg_zext32(ctx, pattern2_1); - let expr5_0 = C::u32_as_u64(ctx, expr0_0); - let expr6_0 = constructor_br_table_impl(ctx, expr5_0, expr4_0, pattern4_0); - return Some(expr6_0); - } - } - &InstructionData::Branch { - opcode: ref pattern2_0, - args: pattern2_1, - destination: pattern2_2, - } => { - match pattern2_0 { - &Opcode::Brz => { - let pattern4_0 = C::value_list_slice(ctx, pattern2_1); - if let Some((pattern5_0, pattern5_1)) = C::value_slice_unwrap(ctx, pattern4_0) { - if let Some(pattern6_0) = C::maybe_uextend(ctx, pattern5_0) { - if let Some(pattern7_0) = C::def_inst(ctx, pattern6_0) { - let pattern8_0 = C::inst_data(ctx, pattern7_0); - match &pattern8_0 { - &InstructionData::FloatCompare { - opcode: ref pattern9_0, - args: ref pattern9_1, - cond: ref pattern9_2, - } => { - if let &Opcode::Fcmp = pattern9_0 { - let (pattern11_0, pattern11_1) = - C::unpack_value_array_2(ctx, pattern9_1); - let pattern12_0 = C::value_type(ctx, pattern11_0); - if let Some(pattern13_0) = - C::ty_scalar_float(ctx, pattern12_0) - { - let pattern14_0 = arg1; - // Rule at src/isa/aarch64/lower.isle line 2494. - let expr0_0 = C::fp_cond_code(ctx, pattern9_2); - let expr1_0 = C::invert_cond(ctx, &expr0_0); - let expr2_0: u8 = 0i128 as u8; - let expr3_0 = - C::branch_target(ctx, pattern14_0, expr2_0); - let expr4_0: u8 = 1i128 as u8; - let expr5_0 = - C::branch_target(ctx, pattern14_0, expr4_0); - let expr6_0 = - constructor_scalar_size(ctx, pattern13_0); - let expr7_0 = C::put_in_reg(ctx, pattern11_0); - let expr8_0 = C::put_in_reg(ctx, pattern11_1); - let expr9_0 = constructor_fpu_cmp( - ctx, &expr6_0, expr7_0, expr8_0, - ); - let expr10_0 = C::cond_br_cond(ctx, &expr1_0); - let expr11_0 = constructor_cond_br( - ctx, expr3_0, expr5_0, expr10_0, - ); - let expr12_0 = constructor_with_flags_side_effect( - ctx, &expr9_0, &expr11_0, - ); - let expr13_0 = - constructor_emit_side_effect(ctx, &expr12_0); - return Some(expr13_0); - } - } - } - &InstructionData::IntCompare { - opcode: ref pattern9_0, - args: ref pattern9_1, - cond: ref pattern9_2, - } => { - if let &Opcode::Icmp = pattern9_0 { - let (pattern11_0, pattern11_1) = - C::unpack_value_array_2(ctx, pattern9_1); - let pattern12_0 = C::value_type(ctx, pattern11_0); - let pattern13_0 = arg1; - // Rule at src/isa/aarch64/lower.isle line 2471. - let expr0_0 = constructor_lower_icmp_into_flags( - ctx, - pattern9_2, - pattern11_0, - pattern11_1, - pattern12_0, - ); - let expr1_0 = - constructor_flags_and_cc_cc(ctx, &expr0_0); - let expr2_0 = C::cond_code(ctx, &expr1_0); - let expr3_0 = C::invert_cond(ctx, &expr2_0); - let expr4_0: u8 = 0i128 as u8; - let expr5_0 = - C::branch_target(ctx, pattern13_0, expr4_0); - let expr6_0: u8 = 1i128 as u8; - let expr7_0 = - C::branch_target(ctx, pattern13_0, expr6_0); - let expr8_0 = - constructor_flags_and_cc_flags(ctx, &expr0_0); - let expr9_0 = C::cond_br_cond(ctx, &expr3_0); - let expr10_0 = - constructor_cond_br(ctx, expr5_0, expr7_0, expr9_0); - let expr11_0 = constructor_with_flags_side_effect( - ctx, &expr8_0, &expr10_0, - ); - let expr12_0 = - constructor_emit_side_effect(ctx, &expr11_0); - return Some(expr12_0); - } - } - _ => {} - } - } - } - } - } - &Opcode::Brnz => { - let pattern4_0 = C::value_list_slice(ctx, pattern2_1); - if let Some((pattern5_0, pattern5_1)) = C::value_slice_unwrap(ctx, pattern4_0) { - if let Some(pattern6_0) = C::maybe_uextend(ctx, pattern5_0) { - if let Some(pattern7_0) = C::def_inst(ctx, pattern6_0) { - let pattern8_0 = C::inst_data(ctx, pattern7_0); - match &pattern8_0 { - &InstructionData::FloatCompare { - opcode: ref pattern9_0, - args: ref pattern9_1, - cond: ref pattern9_2, - } => { - if let &Opcode::Fcmp = pattern9_0 { - let (pattern11_0, pattern11_1) = - C::unpack_value_array_2(ctx, pattern9_1); - let pattern12_0 = C::value_type(ctx, pattern11_0); - if let Some(pattern13_0) = - C::ty_scalar_float(ctx, pattern12_0) - { - let pattern14_0 = arg1; - // Rule at src/isa/aarch64/lower.isle line 2504. - let expr0_0 = C::fp_cond_code(ctx, pattern9_2); - let expr1_0: u8 = 0i128 as u8; - let expr2_0 = - C::branch_target(ctx, pattern14_0, expr1_0); - let expr3_0: u8 = 1i128 as u8; - let expr4_0 = - C::branch_target(ctx, pattern14_0, expr3_0); - let expr5_0 = - constructor_scalar_size(ctx, pattern13_0); - let expr6_0 = C::put_in_reg(ctx, pattern11_0); - let expr7_0 = C::put_in_reg(ctx, pattern11_1); - let expr8_0 = constructor_fpu_cmp( - ctx, &expr5_0, expr6_0, expr7_0, - ); - let expr9_0 = C::cond_br_cond(ctx, &expr0_0); - let expr10_0 = constructor_cond_br( - ctx, expr2_0, expr4_0, expr9_0, - ); - let expr11_0 = constructor_with_flags_side_effect( - ctx, &expr8_0, &expr10_0, - ); - let expr12_0 = - constructor_emit_side_effect(ctx, &expr11_0); - return Some(expr12_0); - } - } - } - &InstructionData::IntCompare { - opcode: ref pattern9_0, - args: ref pattern9_1, - cond: ref pattern9_2, - } => { - if let &Opcode::Icmp = pattern9_0 { - let (pattern11_0, pattern11_1) = - C::unpack_value_array_2(ctx, pattern9_1); - let pattern12_0 = C::value_type(ctx, pattern11_0); - let pattern13_0 = arg1; - // Rule at src/isa/aarch64/lower.isle line 2483. - let expr0_0 = constructor_lower_icmp_into_flags( - ctx, - pattern9_2, - pattern11_0, - pattern11_1, - pattern12_0, - ); - let expr1_0 = - constructor_flags_and_cc_cc(ctx, &expr0_0); - let expr2_0 = C::cond_code(ctx, &expr1_0); - let expr3_0: u8 = 0i128 as u8; - let expr4_0 = - C::branch_target(ctx, pattern13_0, expr3_0); - let expr5_0: u8 = 1i128 as u8; - let expr6_0 = - C::branch_target(ctx, pattern13_0, expr5_0); - let expr7_0 = - constructor_flags_and_cc_flags(ctx, &expr0_0); - let expr8_0 = C::cond_br_cond(ctx, &expr2_0); - let expr9_0 = - constructor_cond_br(ctx, expr4_0, expr6_0, expr8_0); - let expr10_0 = constructor_with_flags_side_effect( - ctx, &expr7_0, &expr9_0, - ); - let expr11_0 = - constructor_emit_side_effect(ctx, &expr10_0); - return Some(expr11_0); - } - } - _ => {} - } - } - } - } - } - _ => {} - } - } - &InstructionData::Jump { - opcode: ref pattern2_0, - args: pattern2_1, - destination: pattern2_2, - } => { - if let &Opcode::Jump = pattern2_0 { - let pattern4_0 = C::value_list_slice(ctx, pattern2_1); - let pattern5_0 = arg1; - // Rule at src/isa/aarch64/lower.isle line 2557. - let expr0_0: u8 = 0i128 as u8; - let expr1_0 = C::branch_target(ctx, pattern5_0, expr0_0); - let expr2_0 = constructor_aarch64_jump(ctx, expr1_0); - let expr3_0 = constructor_emit_side_effect(ctx, &expr2_0); - return Some(expr3_0); - } - } - _ => {} - } - let pattern0_0 = arg0; - let pattern1_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Branch { - opcode: ref pattern2_0, - args: pattern2_1, - destination: pattern2_2, - } = &pattern1_0 - { - match pattern2_0 { - &Opcode::Brz => { - let pattern4_0 = C::value_list_slice(ctx, pattern2_1); - if let Some((pattern5_0, pattern5_1)) = C::value_slice_unwrap(ctx, pattern4_0) { - let pattern6_0 = C::value_type(ctx, pattern5_0); - if pattern6_0 == I128 { - let pattern8_0 = arg1; - // Rule at src/isa/aarch64/lower.isle line 2513. - let expr0_0 = constructor_flags_to_producesflags(ctx, pattern5_0); - let expr1_0 = C::put_in_regs(ctx, pattern5_0); - let expr2_0: usize = 0i128 as usize; - let expr3_0 = C::value_regs_get(ctx, expr1_0, expr2_0); - let expr4_0: usize = 1i128 as usize; - let expr5_0 = C::value_regs_get(ctx, expr1_0, expr4_0); - let expr6_0: Type = I64; - let expr7_0 = constructor_orr(ctx, expr6_0, expr3_0, expr5_0); - let expr8_0: u8 = 0i128 as u8; - let expr9_0 = C::branch_target(ctx, pattern8_0, expr8_0); - let expr10_0: u8 = 1i128 as u8; - let expr11_0 = C::branch_target(ctx, pattern8_0, expr10_0); - let expr12_0 = C::cond_br_zero(ctx, expr7_0); - let expr13_0 = constructor_cond_br(ctx, expr9_0, expr11_0, expr12_0); - let expr14_0 = constructor_with_flags_side_effect(ctx, &expr0_0, &expr13_0); - let expr15_0 = constructor_emit_side_effect(ctx, &expr14_0); - return Some(expr15_0); - } - } - } - &Opcode::Brnz => { - let pattern4_0 = C::value_list_slice(ctx, pattern2_1); - if let Some((pattern5_0, pattern5_1)) = C::value_slice_unwrap(ctx, pattern4_0) { - let pattern6_0 = C::value_type(ctx, pattern5_0); - if pattern6_0 == I128 { - let pattern8_0 = arg1; - // Rule at src/isa/aarch64/lower.isle line 2534. - let expr0_0 = constructor_flags_to_producesflags(ctx, pattern5_0); - let expr1_0 = C::put_in_regs(ctx, pattern5_0); - let expr2_0: usize = 0i128 as usize; - let expr3_0 = C::value_regs_get(ctx, expr1_0, expr2_0); - let expr4_0: usize = 1i128 as usize; - let expr5_0 = C::value_regs_get(ctx, expr1_0, expr4_0); - let expr6_0: Type = I64; - let expr7_0 = constructor_orr(ctx, expr6_0, expr3_0, expr5_0); - let expr8_0: u8 = 0i128 as u8; - let expr9_0 = C::branch_target(ctx, pattern8_0, expr8_0); - let expr10_0: u8 = 1i128 as u8; - let expr11_0 = C::branch_target(ctx, pattern8_0, expr10_0); - let expr12_0 = C::cond_br_not_zero(ctx, expr7_0); - let expr13_0 = constructor_cond_br(ctx, expr9_0, expr11_0, expr12_0); - let expr14_0 = constructor_with_flags_side_effect(ctx, &expr0_0, &expr13_0); - let expr15_0 = constructor_emit_side_effect(ctx, &expr14_0); - return Some(expr15_0); - } - } - } - _ => {} - } - } - let pattern0_0 = arg0; - let pattern1_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Branch { - opcode: ref pattern2_0, - args: pattern2_1, - destination: pattern2_2, - } = &pattern1_0 - { - match pattern2_0 { - &Opcode::Brz => { - let pattern4_0 = C::value_list_slice(ctx, pattern2_1); - if let Some((pattern5_0, pattern5_1)) = C::value_slice_unwrap(ctx, pattern4_0) { - let pattern6_0 = C::value_type(ctx, pattern5_0); - let pattern7_0 = arg1; - let mut closure8 = || { - let expr0_0 = C::ty_int_ref_scalar_64(ctx, pattern6_0)?; - return Some(expr0_0); - }; - if let Some(pattern8_0) = closure8() { - // Rule at src/isa/aarch64/lower.isle line 2524. - let expr0_0 = constructor_flags_to_producesflags(ctx, pattern5_0); - let expr1_0 = constructor_put_in_reg_zext64(ctx, pattern5_0); - let expr2_0: u8 = 0i128 as u8; - let expr3_0 = C::branch_target(ctx, pattern7_0, expr2_0); - let expr4_0: u8 = 1i128 as u8; - let expr5_0 = C::branch_target(ctx, pattern7_0, expr4_0); - let expr6_0 = C::cond_br_zero(ctx, expr1_0); - let expr7_0 = constructor_cond_br(ctx, expr3_0, expr5_0, expr6_0); - let expr8_0 = constructor_with_flags_side_effect(ctx, &expr0_0, &expr7_0); - let expr9_0 = constructor_emit_side_effect(ctx, &expr8_0); - return Some(expr9_0); - } - } - } - &Opcode::Brnz => { - let pattern4_0 = C::value_list_slice(ctx, pattern2_1); - if let Some((pattern5_0, pattern5_1)) = C::value_slice_unwrap(ctx, pattern4_0) { - let pattern6_0 = C::value_type(ctx, pattern5_0); - let pattern7_0 = arg1; - let mut closure8 = || { - let expr0_0 = C::ty_int_ref_scalar_64(ctx, pattern6_0)?; - return Some(expr0_0); - }; - if let Some(pattern8_0) = closure8() { - // Rule at src/isa/aarch64/lower.isle line 2545. - let expr0_0 = constructor_flags_to_producesflags(ctx, pattern5_0); - let expr1_0 = constructor_put_in_reg_zext64(ctx, pattern5_0); - let expr2_0: u8 = 0i128 as u8; - let expr3_0 = C::branch_target(ctx, pattern7_0, expr2_0); - let expr4_0: u8 = 1i128 as u8; - let expr5_0 = C::branch_target(ctx, pattern7_0, expr4_0); - let expr6_0 = C::cond_br_not_zero(ctx, expr1_0); - let expr7_0 = constructor_cond_br(ctx, expr3_0, expr5_0, expr6_0); - let expr8_0 = constructor_with_flags_side_effect(ctx, &expr0_0, &expr7_0); - let expr9_0 = constructor_emit_side_effect(ctx, &expr8_0); - return Some(expr9_0); - } - } - } - _ => {} - } - } - return None; -} - -// Generated as internal constructor for term put_nonzero_in_reg_zext64. -pub fn constructor_put_nonzero_in_reg_zext64(ctx: &mut C, arg0: Value) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = C::value_type(ctx, pattern0_0); - if let Some(pattern2_0) = C::def_inst(ctx, pattern0_0) { - let pattern3_0 = C::inst_data(ctx, pattern2_0); - if let &InstructionData::UnaryImm { - opcode: ref pattern4_0, - imm: pattern4_1, - } = &pattern3_0 - { - if let &Opcode::Iconst = pattern4_0 { - if let Some(pattern6_0) = C::nonzero_u64_from_imm64(ctx, pattern4_1) { - // Rule at src/isa/aarch64/lower.isle line 810. - let expr0_0 = ImmExtend::Zero; - let expr1_0 = constructor_imm(ctx, pattern1_0, &expr0_0, pattern6_0); - return expr1_0; - } - } - } - } - let pattern0_0 = arg0; - // Rule at src/isa/aarch64/lower.isle line 805. - let expr0_0 = constructor_put_in_reg_zext64(ctx, pattern0_0); - let expr1_0 = constructor_trap_if_zero_divisor(ctx, expr0_0); - return expr1_0; -} - -// Generated as internal constructor for term put_nonzero_in_reg_sext64. -pub fn constructor_put_nonzero_in_reg_sext64(ctx: &mut C, arg0: Value) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = C::value_type(ctx, pattern0_0); - if let Some(pattern2_0) = C::def_inst(ctx, pattern0_0) { - let pattern3_0 = C::inst_data(ctx, pattern2_0); - if let &InstructionData::UnaryImm { - opcode: ref pattern4_0, - imm: pattern4_1, - } = &pattern3_0 - { - if let &Opcode::Iconst = pattern4_0 { - if let Some(pattern6_0) = C::nonzero_u64_from_imm64(ctx, pattern4_1) { - // Rule at src/isa/aarch64/lower.isle line 856. - let expr0_0 = ImmExtend::Sign; - let expr1_0 = constructor_imm(ctx, pattern1_0, &expr0_0, pattern6_0); - return expr1_0; - } - } - } - } - let pattern0_0 = arg0; - // Rule at src/isa/aarch64/lower.isle line 851. - let expr0_0 = constructor_put_in_reg_sext64(ctx, pattern0_0); - let expr1_0 = constructor_trap_if_zero_divisor(ctx, expr0_0); - return expr1_0; -} - -// Generated as internal constructor for term cmp_and_choose. -pub fn constructor_cmp_and_choose( - ctx: &mut C, - arg0: Type, - arg1: &Cond, - arg2: bool, - arg3: Value, - arg4: Value, -) -> ValueRegs { - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::fits_in_16(ctx, pattern0_0) { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - let pattern4_0 = arg3; - let pattern5_0 = arg4; - // Rule at src/isa/aarch64/lower.isle line 903. - let expr0_0 = C::put_in_reg(ctx, pattern4_0); - let expr1_0 = C::ty_bits(ctx, pattern1_0); - let expr2_0: u8 = 32i128 as u8; - let expr3_0 = constructor_extend(ctx, expr0_0, pattern3_0, expr1_0, expr2_0); - let expr4_0 = C::put_in_reg(ctx, pattern5_0); - let expr5_0 = C::ty_bits(ctx, pattern1_0); - let expr6_0: u8 = 32i128 as u8; - let expr7_0 = constructor_extend(ctx, expr4_0, pattern3_0, expr5_0, expr6_0); - let expr8_0 = constructor_operand_size(ctx, pattern1_0); - let expr9_0 = constructor_cmp(ctx, &expr8_0, expr3_0, expr7_0); - let expr10_0 = constructor_csel(ctx, pattern2_0, expr3_0, expr7_0); - let expr11_0 = constructor_with_flags_reg(ctx, &expr9_0, &expr10_0); - let expr12_0 = C::value_reg(ctx, expr11_0); - return expr12_0; - } - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::fits_in_64(ctx, pattern0_0) { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - let pattern4_0 = arg3; - let pattern5_0 = arg4; - // Rule at src/isa/aarch64/lower.isle line 895. - let expr0_0 = C::put_in_reg(ctx, pattern4_0); - let expr1_0 = C::put_in_reg(ctx, pattern5_0); - let expr2_0 = constructor_operand_size(ctx, pattern1_0); - let expr3_0 = constructor_cmp(ctx, &expr2_0, expr0_0, expr1_0); - let expr4_0 = constructor_csel(ctx, pattern2_0, expr0_0, expr1_0); - let expr5_0 = constructor_with_flags_reg(ctx, &expr3_0, &expr4_0); - let expr6_0 = C::value_reg(ctx, expr5_0); - return expr6_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "cmp_and_choose", "src/isa/aarch64/lower.isle line 894" - ); -} - -// Generated as internal constructor for term lower_shl128. -pub fn constructor_lower_shl128(ctx: &mut C, arg0: ValueRegs, arg1: Reg) -> ValueRegs { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/aarch64/lower.isle line 1151. - let expr0_0: usize = 0i128 as usize; - let expr1_0 = C::value_regs_get(ctx, pattern0_0, expr0_0); - let expr2_0: usize = 1i128 as usize; - let expr3_0 = C::value_regs_get(ctx, pattern0_0, expr2_0); - let expr4_0: Type = I64; - let expr5_0 = constructor_lsl(ctx, expr4_0, expr1_0, pattern1_0); - let expr6_0: Type = I64; - let expr7_0 = constructor_lsl(ctx, expr6_0, expr3_0, pattern1_0); - let expr8_0: Type = I32; - let expr9_0 = C::zero_reg(ctx); - let expr10_0 = constructor_orr_not(ctx, expr8_0, expr9_0, pattern1_0); - let expr11_0: Type = I64; - let expr12_0: Type = I64; - let expr13_0: u8 = 1i128 as u8; - let expr14_0 = C::imm_shift_from_u8(ctx, expr13_0); - let expr15_0 = constructor_lsr_imm(ctx, expr12_0, expr1_0, expr14_0); - let expr16_0 = constructor_lsr(ctx, expr11_0, expr15_0, expr10_0); - let expr17_0: Type = I64; - let expr18_0 = constructor_orr(ctx, expr17_0, expr7_0, expr16_0); - let expr19_0: Type = I64; - let expr20_0: Type = I64; - let expr21_0: u64 = 64i128 as u64; - let expr22_0 = C::u64_into_imm_logic(ctx, expr20_0, expr21_0); - let expr23_0 = constructor_tst_imm(ctx, expr19_0, pattern1_0, expr22_0); - let expr24_0 = Cond::Ne; - let expr25_0 = C::zero_reg(ctx); - let expr26_0 = constructor_csel(ctx, &expr24_0, expr25_0, expr5_0); - let expr27_0 = Cond::Ne; - let expr28_0 = constructor_csel(ctx, &expr27_0, expr5_0, expr18_0); - let expr29_0 = constructor_consumes_flags_concat(ctx, &expr26_0, &expr28_0); - let expr30_0 = constructor_with_flags(ctx, &expr23_0, &expr29_0); - return expr30_0; -} - -// Generated as internal constructor for term do_shift. -pub fn constructor_do_shift( - ctx: &mut C, - arg0: &ALUOp, - arg1: Type, - arg2: Reg, - arg3: Value, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - if let Some(pattern4_0) = C::def_inst(ctx, pattern3_0) { - let pattern5_0 = C::inst_data(ctx, pattern4_0); - if let &InstructionData::UnaryImm { - opcode: ref pattern6_0, - imm: pattern6_1, - } = &pattern5_0 - { - if let &Opcode::Iconst = pattern6_0 { - let mut closure8 = || { - let expr0_0 = C::imm_shift_from_imm64(ctx, pattern1_0, pattern6_1)?; - return Some(expr0_0); - }; - if let Some(pattern8_0) = closure8() { - // Rule at src/isa/aarch64/lower.isle line 1209. - let expr0_0 = constructor_alu_rr_imm_shift( - ctx, pattern0_0, pattern1_0, pattern2_0, pattern8_0, - ); - return expr0_0; - } - } - } - } - let pattern0_0 = arg0; - let pattern1_0 = arg1; - if pattern1_0 == I32 { - let pattern3_0 = arg2; - let pattern4_0 = arg3; - // Rule at src/isa/aarch64/lower.isle line 1200. - let expr0_0: Type = I32; - let expr1_0 = C::put_in_regs(ctx, pattern4_0); - let expr2_0: usize = 0i128 as usize; - let expr3_0 = C::value_regs_get(ctx, expr1_0, expr2_0); - let expr4_0 = constructor_alu_rrr(ctx, pattern0_0, expr0_0, pattern3_0, expr3_0); - return expr4_0; - } - if pattern1_0 == I64 { - let pattern3_0 = arg2; - let pattern4_0 = arg3; - // Rule at src/isa/aarch64/lower.isle line 1201. - let expr0_0: Type = I64; - let expr1_0 = C::put_in_regs(ctx, pattern4_0); - let expr2_0: usize = 0i128 as usize; - let expr3_0 = C::value_regs_get(ctx, expr1_0, expr2_0); - let expr4_0 = constructor_alu_rrr(ctx, pattern0_0, expr0_0, pattern3_0, expr3_0); - return expr4_0; - } - let pattern0_0 = arg0; - let pattern1_0 = arg1; - if let Some(pattern2_0) = C::fits_in_16(ctx, pattern1_0) { - let pattern3_0 = arg2; - let pattern4_0 = arg3; - // Rule at src/isa/aarch64/lower.isle line 1191. - let expr0_0 = C::put_in_regs(ctx, pattern4_0); - let expr1_0: usize = 0i128 as usize; - let expr2_0 = C::value_regs_get(ctx, expr0_0, expr1_0); - let expr3_0: Type = I32; - let expr4_0 = C::shift_mask(ctx, pattern2_0); - let expr5_0 = constructor_and_imm(ctx, expr3_0, expr2_0, expr4_0); - let expr6_0: Type = I32; - let expr7_0 = constructor_alu_rrr(ctx, pattern0_0, expr6_0, pattern3_0, expr5_0); - return expr7_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "do_shift", "src/isa/aarch64/lower.isle line 1180" - ); -} - -// Generated as internal constructor for term lower_ushr128. -pub fn constructor_lower_ushr128(ctx: &mut C, arg0: ValueRegs, arg1: Reg) -> ValueRegs { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/aarch64/lower.isle line 1244. - let expr0_0: usize = 0i128 as usize; - let expr1_0 = C::value_regs_get(ctx, pattern0_0, expr0_0); - let expr2_0: usize = 1i128 as usize; - let expr3_0 = C::value_regs_get(ctx, pattern0_0, expr2_0); - let expr4_0: Type = I64; - let expr5_0 = constructor_lsr(ctx, expr4_0, expr1_0, pattern1_0); - let expr6_0: Type = I64; - let expr7_0 = constructor_lsr(ctx, expr6_0, expr3_0, pattern1_0); - let expr8_0: Type = I32; - let expr9_0 = C::zero_reg(ctx); - let expr10_0 = constructor_orr_not(ctx, expr8_0, expr9_0, pattern1_0); - let expr11_0: Type = I64; - let expr12_0: Type = I64; - let expr13_0: u8 = 1i128 as u8; - let expr14_0 = C::imm_shift_from_u8(ctx, expr13_0); - let expr15_0 = constructor_lsl_imm(ctx, expr12_0, expr3_0, expr14_0); - let expr16_0 = constructor_lsl(ctx, expr11_0, expr15_0, expr10_0); - let expr17_0: Type = I64; - let expr18_0 = constructor_orr(ctx, expr17_0, expr5_0, expr16_0); - let expr19_0: Type = I64; - let expr20_0: Type = I64; - let expr21_0: u64 = 64i128 as u64; - let expr22_0 = C::u64_into_imm_logic(ctx, expr20_0, expr21_0); - let expr23_0 = constructor_tst_imm(ctx, expr19_0, pattern1_0, expr22_0); - let expr24_0 = Cond::Ne; - let expr25_0 = constructor_csel(ctx, &expr24_0, expr7_0, expr18_0); - let expr26_0 = Cond::Ne; - let expr27_0 = C::zero_reg(ctx); - let expr28_0 = constructor_csel(ctx, &expr26_0, expr27_0, expr7_0); - let expr29_0 = constructor_consumes_flags_concat(ctx, &expr25_0, &expr28_0); - let expr30_0 = constructor_with_flags(ctx, &expr23_0, &expr29_0); - return expr30_0; -} - -// Generated as internal constructor for term lower_sshr128. -pub fn constructor_lower_sshr128(ctx: &mut C, arg0: ValueRegs, arg1: Reg) -> ValueRegs { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/aarch64/lower.isle line 1295. - let expr0_0: usize = 0i128 as usize; - let expr1_0 = C::value_regs_get(ctx, pattern0_0, expr0_0); - let expr2_0: usize = 1i128 as usize; - let expr3_0 = C::value_regs_get(ctx, pattern0_0, expr2_0); - let expr4_0: Type = I64; - let expr5_0 = constructor_lsr(ctx, expr4_0, expr1_0, pattern1_0); - let expr6_0: Type = I64; - let expr7_0 = constructor_asr(ctx, expr6_0, expr3_0, pattern1_0); - let expr8_0: Type = I32; - let expr9_0 = C::zero_reg(ctx); - let expr10_0 = constructor_orr_not(ctx, expr8_0, expr9_0, pattern1_0); - let expr11_0: Type = I64; - let expr12_0: Type = I64; - let expr13_0: u8 = 1i128 as u8; - let expr14_0 = C::imm_shift_from_u8(ctx, expr13_0); - let expr15_0 = constructor_lsl_imm(ctx, expr12_0, expr3_0, expr14_0); - let expr16_0 = constructor_lsl(ctx, expr11_0, expr15_0, expr10_0); - let expr17_0: Type = I64; - let expr18_0: u8 = 63i128 as u8; - let expr19_0 = C::imm_shift_from_u8(ctx, expr18_0); - let expr20_0 = constructor_asr_imm(ctx, expr17_0, expr3_0, expr19_0); - let expr21_0: Type = I64; - let expr22_0 = constructor_orr(ctx, expr21_0, expr5_0, expr16_0); - let expr23_0: Type = I64; - let expr24_0: Type = I64; - let expr25_0: u64 = 64i128 as u64; - let expr26_0 = C::u64_into_imm_logic(ctx, expr24_0, expr25_0); - let expr27_0 = constructor_tst_imm(ctx, expr23_0, pattern1_0, expr26_0); - let expr28_0 = Cond::Ne; - let expr29_0 = constructor_csel(ctx, &expr28_0, expr7_0, expr22_0); - let expr30_0 = Cond::Ne; - let expr31_0 = constructor_csel(ctx, &expr30_0, expr20_0, expr7_0); - let expr32_0 = constructor_consumes_flags_concat(ctx, &expr29_0, &expr31_0); - let expr33_0 = constructor_with_flags(ctx, &expr27_0, &expr32_0); - return expr33_0; -} - -// Generated as internal constructor for term small_rotr. -pub fn constructor_small_rotr(ctx: &mut C, arg0: Type, arg1: Reg, arg2: Reg) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/aarch64/lower.isle line 1414. - let expr0_0: Type = I32; - let expr1_0 = C::rotr_mask(ctx, pattern0_0); - let expr2_0 = constructor_and_imm(ctx, expr0_0, pattern2_0, expr1_0); - let expr3_0: Type = I32; - let expr4_0 = C::ty_bits(ctx, pattern0_0); - let expr5_0 = C::u8_into_imm12(ctx, expr4_0); - let expr6_0 = constructor_sub_imm(ctx, expr3_0, expr2_0, expr5_0); - let expr7_0: Type = I32; - let expr8_0 = C::zero_reg(ctx); - let expr9_0 = constructor_sub(ctx, expr7_0, expr8_0, expr6_0); - let expr10_0: Type = I32; - let expr11_0 = constructor_lsr(ctx, expr10_0, pattern1_0, expr2_0); - let expr12_0: Type = I32; - let expr13_0 = constructor_lsl(ctx, expr12_0, pattern1_0, expr9_0); - let expr14_0: Type = I32; - let expr15_0 = constructor_orr(ctx, expr14_0, expr13_0, expr11_0); - return expr15_0; -} - -// Generated as internal constructor for term small_rotr_imm. -pub fn constructor_small_rotr_imm( - ctx: &mut C, - arg0: Type, - arg1: Reg, - arg2: ImmShift, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/aarch64/lower.isle line 1439. - let expr0_0: Type = I32; - let expr1_0 = constructor_lsr_imm(ctx, expr0_0, pattern1_0, pattern2_0); - let expr2_0: Type = I32; - let expr3_0 = C::rotr_opposite_amount(ctx, pattern0_0, pattern2_0); - let expr4_0 = constructor_lsl_imm(ctx, expr2_0, pattern1_0, expr3_0); - let expr5_0: Type = I32; - let expr6_0 = constructor_orr(ctx, expr5_0, expr4_0, expr1_0); - return expr6_0; -} - -// Generated as internal constructor for term lower_clz128. -pub fn constructor_lower_clz128(ctx: &mut C, arg0: ValueRegs) -> ValueRegs { - let pattern0_0 = arg0; - // Rule at src/isa/aarch64/lower.isle line 1504. - let expr0_0: Type = I64; - let expr1_0: usize = 1i128 as usize; - let expr2_0 = C::value_regs_get(ctx, pattern0_0, expr1_0); - let expr3_0 = constructor_a64_clz(ctx, expr0_0, expr2_0); - let expr4_0: Type = I64; - let expr5_0: usize = 0i128 as usize; - let expr6_0 = C::value_regs_get(ctx, pattern0_0, expr5_0); - let expr7_0 = constructor_a64_clz(ctx, expr4_0, expr6_0); - let expr8_0: Type = I64; - let expr9_0: u8 = 6i128 as u8; - let expr10_0 = C::imm_shift_from_u8(ctx, expr9_0); - let expr11_0 = constructor_lsr_imm(ctx, expr8_0, expr3_0, expr10_0); - let expr12_0: Type = I64; - let expr13_0 = constructor_madd(ctx, expr12_0, expr7_0, expr11_0, expr3_0); - let expr14_0: Type = I64; - let expr15_0 = ImmExtend::Zero; - let expr16_0: u64 = 0i128 as u64; - let expr17_0 = constructor_imm(ctx, expr14_0, &expr15_0, expr16_0); - let expr18_0 = C::value_regs(ctx, expr13_0, expr17_0); - return expr18_0; -} diff --git a/cranelift/codegen/isle_generated_code/isle_opt.rs b/cranelift/codegen/isle_generated_code/isle_opt.rs deleted file mode 100644 index 66b97f0684b3..000000000000 --- a/cranelift/codegen/isle_generated_code/isle_opt.rs +++ /dev/null @@ -1,5544 +0,0 @@ -// GENERATED BY ISLE. DO NOT EDIT! -// -// Generated automatically from the instruction-selection DSL code in: -// - src/prelude.isle -// - src/prelude_opt.isle -// - src/opts/algebraic.isle -// - src/opts/cprop.isle -// - /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle - -use super::*; // Pulls in all external types. -use std::marker::PhantomData; - -/// Context during lowering: an implementation of this trait -/// must be provided with all external constructors and extractors. -/// A mutable borrow is passed along through all lowering logic. -pub trait Context { - fn unit(&mut self) -> Unit; - fn value_type(&mut self, arg0: Value) -> Type; - fn u32_add(&mut self, arg0: u32, arg1: u32) -> u32; - fn s32_add_fallible(&mut self, arg0: u32, arg1: u32) -> Option; - fn u32_nonnegative(&mut self, arg0: u32) -> Option; - fn offset32(&mut self, arg0: Offset32) -> u32; - fn u32_lteq(&mut self, arg0: u32, arg1: u32) -> Option; - fn u8_lteq(&mut self, arg0: u8, arg1: u8) -> Option; - fn u8_lt(&mut self, arg0: u8, arg1: u8) -> Option; - fn simm32(&mut self, arg0: Imm64) -> Option; - fn uimm8(&mut self, arg0: Imm64) -> Option; - fn u8_and(&mut self, arg0: u8, arg1: u8) -> u8; - fn u8_as_u32(&mut self, arg0: u8) -> u32; - fn u8_as_u64(&mut self, arg0: u8) -> u64; - fn u16_as_u64(&mut self, arg0: u16) -> u64; - fn u32_as_u64(&mut self, arg0: u32) -> u64; - fn i64_as_u64(&mut self, arg0: i64) -> u64; - fn u64_add(&mut self, arg0: u64, arg1: u64) -> u64; - fn u64_sub(&mut self, arg0: u64, arg1: u64) -> u64; - fn u64_mul(&mut self, arg0: u64, arg1: u64) -> u64; - fn u64_sdiv(&mut self, arg0: u64, arg1: u64) -> Option; - fn u64_udiv(&mut self, arg0: u64, arg1: u64) -> Option; - fn u64_and(&mut self, arg0: u64, arg1: u64) -> u64; - fn u64_or(&mut self, arg0: u64, arg1: u64) -> u64; - fn u64_xor(&mut self, arg0: u64, arg1: u64) -> u64; - fn u64_not(&mut self, arg0: u64) -> u64; - fn u64_sextend_u32(&mut self, arg0: u64) -> u64; - fn u64_uextend_u32(&mut self, arg0: u64) -> u64; - fn u64_is_zero(&mut self, arg0: u64) -> bool; - fn u64_is_odd(&mut self, arg0: u64) -> bool; - fn ty_bits(&mut self, arg0: Type) -> u8; - fn ty_bits_u16(&mut self, arg0: Type) -> u16; - fn ty_bits_u64(&mut self, arg0: Type) -> u64; - fn ty_mask(&mut self, arg0: Type) -> u64; - fn ty_bytes(&mut self, arg0: Type) -> u16; - fn lane_type(&mut self, arg0: Type) -> Type; - fn mem_flags_trusted(&mut self) -> MemFlags; - fn intcc_reverse(&mut self, arg0: &IntCC) -> IntCC; - fn intcc_inverse(&mut self, arg0: &IntCC) -> IntCC; - fn floatcc_reverse(&mut self, arg0: &FloatCC) -> FloatCC; - fn floatcc_inverse(&mut self, arg0: &FloatCC) -> FloatCC; - fn fits_in_16(&mut self, arg0: Type) -> Option; - fn fits_in_32(&mut self, arg0: Type) -> Option; - fn lane_fits_in_32(&mut self, arg0: Type) -> Option; - fn fits_in_64(&mut self, arg0: Type) -> Option; - fn ty_32(&mut self, arg0: Type) -> Option; - fn ty_64(&mut self, arg0: Type) -> Option; - fn ty_int_ref_scalar_64(&mut self, arg0: Type) -> Option; - fn ty_32_or_64(&mut self, arg0: Type) -> Option; - fn ty_8_or_16(&mut self, arg0: Type) -> Option; - fn int_fits_in_32(&mut self, arg0: Type) -> Option; - fn ty_int_ref_64(&mut self, arg0: Type) -> Option; - fn ty_int(&mut self, arg0: Type) -> Option; - fn ty_scalar_float(&mut self, arg0: Type) -> Option; - fn ty_float_or_vec(&mut self, arg0: Type) -> Option; - fn ty_vector_float(&mut self, arg0: Type) -> Option; - fn ty_vector_not_float(&mut self, arg0: Type) -> Option; - fn ty_vec64(&mut self, arg0: Type) -> Option; - fn ty_vec64_ctor(&mut self, arg0: Type) -> Option; - fn ty_vec128(&mut self, arg0: Type) -> Option; - fn ty_dyn_vec64(&mut self, arg0: Type) -> Option; - fn ty_dyn_vec128(&mut self, arg0: Type) -> Option; - fn ty_vec64_int(&mut self, arg0: Type) -> Option; - fn ty_vec128_int(&mut self, arg0: Type) -> Option; - fn not_vec32x2(&mut self, arg0: Type) -> Option; - fn not_i64x2(&mut self, arg0: Type) -> Option<()>; - fn u8_from_uimm8(&mut self, arg0: Uimm8) -> u8; - fn u64_from_bool(&mut self, arg0: bool) -> u64; - fn u64_from_imm64(&mut self, arg0: Imm64) -> u64; - fn nonzero_u64_from_imm64(&mut self, arg0: Imm64) -> Option; - fn imm64(&mut self, arg0: u64) -> Imm64; - fn imm64_masked(&mut self, arg0: Type, arg1: u64) -> Imm64; - fn u64_from_ieee32(&mut self, arg0: Ieee32) -> u64; - fn u64_from_ieee64(&mut self, arg0: Ieee64) -> u64; - fn multi_lane(&mut self, arg0: Type) -> Option<(u32, u32)>; - fn dynamic_lane(&mut self, arg0: Type) -> Option<(u32, u32)>; - fn dynamic_int_lane(&mut self, arg0: Type) -> Option; - fn dynamic_fp_lane(&mut self, arg0: Type) -> Option; - fn ty_dyn64_int(&mut self, arg0: Type) -> Option; - fn ty_dyn128_int(&mut self, arg0: Type) -> Option; - fn offset32_to_u32(&mut self, arg0: Offset32) -> u32; - fn intcc_unsigned(&mut self, arg0: &IntCC) -> IntCC; - fn signed_cond_code(&mut self, arg0: &IntCC) -> Option; - fn trap_code_division_by_zero(&mut self) -> TrapCode; - fn trap_code_integer_overflow(&mut self) -> TrapCode; - fn trap_code_bad_conversion_to_integer(&mut self) -> TrapCode; - fn range(&mut self, arg0: usize, arg1: usize) -> Range; - fn range_view(&mut self, arg0: Range) -> RangeView; - type inst_data_etor_iter: ContextIter; - fn inst_data_etor(&mut self, arg0: Value) -> Self::inst_data_etor_iter; - fn make_inst_ctor(&mut self, arg0: Type, arg1: &InstructionData) -> Value; - fn value_array_2_ctor(&mut self, arg0: Value, arg1: Value) -> ValueArray2; - fn value_array_3_ctor(&mut self, arg0: Value, arg1: Value, arg2: Value) -> ValueArray3; - fn remat(&mut self, arg0: Value) -> Value; - fn subsume(&mut self, arg0: Value) -> Value; - fn unpack_value_array_2(&mut self, arg0: &ValueArray2) -> (Value, Value); - fn pack_value_array_2(&mut self, arg0: Value, arg1: Value) -> ValueArray2; - fn unpack_value_array_3(&mut self, arg0: &ValueArray3) -> (Value, Value, Value); - fn pack_value_array_3(&mut self, arg0: Value, arg1: Value, arg2: Value) -> ValueArray3; -} - -pub trait ContextIter { - type Context; - type Output; - fn next(&mut self, ctx: &mut Self::Context) -> Option; -} - -pub struct ContextIterWrapper, C: Context> { - iter: I, - _ctx: PhantomData, -} -impl, C: Context> From for ContextIterWrapper { - fn from(iter: I) -> Self { - Self { - iter, - _ctx: PhantomData, - } - } -} -impl, C: Context> ContextIter for ContextIterWrapper { - type Context = C; - type Output = Item; - fn next(&mut self, _ctx: &mut Self::Context) -> Option { - self.iter.next() - } -} - -// Generated as internal constructor for term simplify. -pub fn constructor_simplify( - ctx: &mut C, - arg0: Value, -) -> impl ContextIter { - let mut returns = ConstructorVec::new(); - let pattern0_0 = arg0; - let mut iter = C::inst_data_etor(ctx, pattern0_0); - while let Some((pattern1_0, pattern1_1)) = iter.next(ctx) { - if pattern1_0 == I32 { - if let &InstructionData::Binary { - opcode: ref pattern3_0, - args: ref pattern3_1, - } = &pattern1_1 - { - match pattern3_0 { - &Opcode::Band => { - let (pattern5_0, pattern5_1) = C::unpack_value_array_2(ctx, pattern3_1); - let mut iter = C::inst_data_etor(ctx, pattern5_0); - while let Some((pattern6_0, pattern6_1)) = iter.next(ctx) { - if pattern6_0 == I32 { - if let &InstructionData::UnaryImm { - opcode: ref pattern8_0, - imm: pattern8_1, - } = &pattern6_1 - { - if let &Opcode::Iconst = pattern8_0 { - let pattern10_0 = C::u64_from_imm64(ctx, pattern8_1); - if pattern10_0 == 4294967295i128 as u64 { - // Rule at src/opts/algebraic.isle line 122. - let expr0_0 = C::subsume(ctx, pattern5_1); - returns.push(expr0_0); - } - } - } - } - } - let mut iter = C::inst_data_etor(ctx, pattern5_1); - while let Some((pattern6_0, pattern6_1)) = iter.next(ctx) { - if pattern6_0 == I32 { - if let &InstructionData::UnaryImm { - opcode: ref pattern8_0, - imm: pattern8_1, - } = &pattern6_1 - { - if let &Opcode::Iconst = pattern8_0 { - let pattern10_0 = C::u64_from_imm64(ctx, pattern8_1); - if pattern10_0 == 4294967295i128 as u64 { - // Rule at src/opts/algebraic.isle line 121. - let expr0_0 = C::subsume(ctx, pattern5_0); - returns.push(expr0_0); - } - } - } - } - } - } - &Opcode::Bxor => { - let (pattern5_0, pattern5_1) = C::unpack_value_array_2(ctx, pattern3_1); - let mut iter = C::inst_data_etor(ctx, pattern5_0); - while let Some((pattern6_0, pattern6_1)) = iter.next(ctx) { - if pattern6_0 == I32 { - if let &InstructionData::Unary { - opcode: ref pattern8_0, - arg: pattern8_1, - } = &pattern6_1 - { - if let &Opcode::Bnot = pattern8_0 { - if pattern5_1 == pattern8_1 { - // Rule at src/opts/algebraic.isle line 115. - let expr0_0: Type = I32; - let expr1_0: u64 = 4294967295i128 as u64; - let expr2_0 = C::imm64(ctx, expr1_0); - let expr3_0 = constructor_iconst(ctx, expr0_0, expr2_0); - let expr4_0 = C::subsume(ctx, expr3_0); - returns.push(expr4_0); - } - } - } - } - } - let mut iter = C::inst_data_etor(ctx, pattern5_1); - while let Some((pattern6_0, pattern6_1)) = iter.next(ctx) { - if pattern6_0 == I32 { - if let &InstructionData::Unary { - opcode: ref pattern8_0, - arg: pattern8_1, - } = &pattern6_1 - { - if let &Opcode::Bnot = pattern8_0 { - if pattern8_1 == pattern5_0 { - // Rule at src/opts/algebraic.isle line 114. - let expr0_0: Type = I32; - let expr1_0: u64 = 4294967295i128 as u64; - let expr2_0 = C::imm64(ctx, expr1_0); - let expr3_0 = constructor_iconst(ctx, expr0_0, expr2_0); - let expr4_0 = C::subsume(ctx, expr3_0); - returns.push(expr4_0); - } - } - } - } - } - } - _ => {} - } - } - } - if pattern1_0 == I64 { - match &pattern1_1 { - &InstructionData::Unary { - opcode: ref pattern3_0, - arg: pattern3_1, - } => { - match pattern3_0 { - &Opcode::Uextend => { - let mut iter = C::inst_data_etor(ctx, pattern3_1); - while let Some((pattern5_0, pattern5_1)) = iter.next(ctx) { - if pattern5_0 == I32 { - if let &InstructionData::UnaryImm { - opcode: ref pattern7_0, - imm: pattern7_1, - } = &pattern5_1 - { - if let &Opcode::Iconst = pattern7_0 { - let pattern9_0 = C::u64_from_imm64(ctx, pattern7_1); - // Rule at src/opts/algebraic.isle line 10. - let expr0_0: Type = I64; - let expr1_0 = C::u64_uextend_u32(ctx, pattern9_0); - let expr2_0 = C::imm64(ctx, expr1_0); - let expr3_0 = constructor_iconst(ctx, expr0_0, expr2_0); - returns.push(expr3_0); - } - } - } - } - } - &Opcode::Sextend => { - let mut iter = C::inst_data_etor(ctx, pattern3_1); - while let Some((pattern5_0, pattern5_1)) = iter.next(ctx) { - if pattern5_0 == I32 { - if let &InstructionData::UnaryImm { - opcode: ref pattern7_0, - imm: pattern7_1, - } = &pattern5_1 - { - if let &Opcode::Iconst = pattern7_0 { - let pattern9_0 = C::u64_from_imm64(ctx, pattern7_1); - // Rule at src/opts/algebraic.isle line 12. - let expr0_0: Type = I64; - let expr1_0 = C::u64_sextend_u32(ctx, pattern9_0); - let expr2_0 = C::imm64(ctx, expr1_0); - let expr3_0 = constructor_iconst(ctx, expr0_0, expr2_0); - returns.push(expr3_0); - } - } - } - } - } - _ => {} - } - } - &InstructionData::Binary { - opcode: ref pattern3_0, - args: ref pattern3_1, - } => { - match pattern3_0 { - &Opcode::Band => { - let (pattern5_0, pattern5_1) = C::unpack_value_array_2(ctx, pattern3_1); - let mut iter = C::inst_data_etor(ctx, pattern5_0); - while let Some((pattern6_0, pattern6_1)) = iter.next(ctx) { - if pattern6_0 == I64 { - if let &InstructionData::UnaryImm { - opcode: ref pattern8_0, - imm: pattern8_1, - } = &pattern6_1 - { - if let &Opcode::Iconst = pattern8_0 { - let pattern10_0 = C::u64_from_imm64(ctx, pattern8_1); - if pattern10_0 == 18446744073709551615i128 as u64 { - // Rule at src/opts/algebraic.isle line 124. - let expr0_0 = C::subsume(ctx, pattern5_1); - returns.push(expr0_0); - } - } - } - } - } - let mut iter = C::inst_data_etor(ctx, pattern5_1); - while let Some((pattern6_0, pattern6_1)) = iter.next(ctx) { - if pattern6_0 == I64 { - if let &InstructionData::UnaryImm { - opcode: ref pattern8_0, - imm: pattern8_1, - } = &pattern6_1 - { - if let &Opcode::Iconst = pattern8_0 { - let pattern10_0 = C::u64_from_imm64(ctx, pattern8_1); - if pattern10_0 == 18446744073709551615i128 as u64 { - // Rule at src/opts/algebraic.isle line 123. - let expr0_0 = C::subsume(ctx, pattern5_0); - returns.push(expr0_0); - } - } - } - } - } - } - &Opcode::Bxor => { - let (pattern5_0, pattern5_1) = C::unpack_value_array_2(ctx, pattern3_1); - let mut iter = C::inst_data_etor(ctx, pattern5_0); - while let Some((pattern6_0, pattern6_1)) = iter.next(ctx) { - if pattern6_0 == I64 { - if let &InstructionData::Unary { - opcode: ref pattern8_0, - arg: pattern8_1, - } = &pattern6_1 - { - if let &Opcode::Bnot = pattern8_0 { - if pattern5_1 == pattern8_1 { - // Rule at src/opts/algebraic.isle line 117. - let expr0_0: Type = I64; - let expr1_0: u64 = 18446744073709551615i128 as u64; - let expr2_0 = C::imm64(ctx, expr1_0); - let expr3_0 = - constructor_iconst(ctx, expr0_0, expr2_0); - let expr4_0 = C::subsume(ctx, expr3_0); - returns.push(expr4_0); - } - } - } - } - } - let mut iter = C::inst_data_etor(ctx, pattern5_1); - while let Some((pattern6_0, pattern6_1)) = iter.next(ctx) { - if pattern6_0 == I64 { - if let &InstructionData::Unary { - opcode: ref pattern8_0, - arg: pattern8_1, - } = &pattern6_1 - { - if let &Opcode::Bnot = pattern8_0 { - if pattern8_1 == pattern5_0 { - // Rule at src/opts/algebraic.isle line 116. - let expr0_0: Type = I64; - let expr1_0: u64 = 18446744073709551615i128 as u64; - let expr2_0 = C::imm64(ctx, expr1_0); - let expr3_0 = - constructor_iconst(ctx, expr0_0, expr2_0); - let expr4_0 = C::subsume(ctx, expr3_0); - returns.push(expr4_0); - } - } - } - } - } - } - &Opcode::Ushr => { - let (pattern5_0, pattern5_1) = C::unpack_value_array_2(ctx, pattern3_1); - let mut iter = C::inst_data_etor(ctx, pattern5_0); - while let Some((pattern6_0, pattern6_1)) = iter.next(ctx) { - if pattern6_0 == I64 { - if let &InstructionData::Binary { - opcode: ref pattern8_0, - args: ref pattern8_1, - } = &pattern6_1 - { - if let &Opcode::Ishl = pattern8_0 { - let (pattern10_0, pattern10_1) = - C::unpack_value_array_2(ctx, pattern8_1); - let mut iter = C::inst_data_etor(ctx, pattern10_0); - while let Some((pattern11_0, pattern11_1)) = - iter.next(ctx) - { - if pattern11_0 == I64 { - if let &InstructionData::Unary { - opcode: ref pattern13_0, - arg: pattern13_1, - } = &pattern11_1 - { - if let &Opcode::Uextend = pattern13_0 { - let pattern15_0 = - C::value_type(ctx, pattern13_1); - if pattern15_0 == I32 { - let mut iter = C::inst_data_etor( - ctx, - pattern10_1, - ); - while let Some(( - pattern17_0, - pattern17_1, - )) = iter.next(ctx) - { - if let &InstructionData::UnaryImm { opcode: ref pattern18_0, imm: pattern18_1 } = &pattern17_1 { - if let &Opcode::Iconst = pattern18_0 { - if let Some(pattern20_0) = C::simm32(ctx, pattern18_1) { - if pattern20_0 == 32i128 as u32 { - let mut iter = C::inst_data_etor(ctx, pattern5_1); - while let Some((pattern22_0, pattern22_1)) = iter.next(ctx) { - if let &InstructionData::UnaryImm { opcode: ref pattern23_0, imm: pattern23_1 } = &pattern22_1 { - if let &Opcode::Iconst = pattern23_0 { - if let Some(pattern25_0) = C::simm32(ctx, pattern23_1) { - if pattern25_0 == 32i128 as u32 { - // Rule at src/opts/algebraic.isle line 148. - let expr0_0: Type = I64; - let expr1_0 = constructor_uextend(ctx, expr0_0, pattern13_1); - returns.push(expr1_0); - } - } - } - } - } - } - } - } - } - } - } - } - } - } - } - } - } - } - } - } - &Opcode::Sshr => { - let (pattern5_0, pattern5_1) = C::unpack_value_array_2(ctx, pattern3_1); - let mut iter = C::inst_data_etor(ctx, pattern5_0); - while let Some((pattern6_0, pattern6_1)) = iter.next(ctx) { - if pattern6_0 == I64 { - if let &InstructionData::Binary { - opcode: ref pattern8_0, - args: ref pattern8_1, - } = &pattern6_1 - { - if let &Opcode::Ishl = pattern8_0 { - let (pattern10_0, pattern10_1) = - C::unpack_value_array_2(ctx, pattern8_1); - let mut iter = C::inst_data_etor(ctx, pattern10_0); - while let Some((pattern11_0, pattern11_1)) = - iter.next(ctx) - { - if pattern11_0 == I64 { - if let &InstructionData::Unary { - opcode: ref pattern13_0, - arg: pattern13_1, - } = &pattern11_1 - { - if let &Opcode::Uextend = pattern13_0 { - let pattern15_0 = - C::value_type(ctx, pattern13_1); - if pattern15_0 == I32 { - let mut iter = C::inst_data_etor( - ctx, - pattern10_1, - ); - while let Some(( - pattern17_0, - pattern17_1, - )) = iter.next(ctx) - { - if let &InstructionData::UnaryImm { opcode: ref pattern18_0, imm: pattern18_1 } = &pattern17_1 { - if let &Opcode::Iconst = pattern18_0 { - if let Some(pattern20_0) = C::simm32(ctx, pattern18_1) { - if pattern20_0 == 32i128 as u32 { - let mut iter = C::inst_data_etor(ctx, pattern5_1); - while let Some((pattern22_0, pattern22_1)) = iter.next(ctx) { - if let &InstructionData::UnaryImm { opcode: ref pattern23_0, imm: pattern23_1 } = &pattern22_1 { - if let &Opcode::Iconst = pattern23_0 { - if let Some(pattern25_0) = C::simm32(ctx, pattern23_1) { - if pattern25_0 == 32i128 as u32 { - // Rule at src/opts/algebraic.isle line 151. - let expr0_0: Type = I64; - let expr1_0 = constructor_sextend(ctx, expr0_0, pattern13_1); - returns.push(expr1_0); - } - } - } - } - } - } - } - } - } - } - } - } - } - } - } - } - } - } - } - } - _ => {} - } - } - _ => {} - } - } - match &pattern1_1 { - &InstructionData::Unary { - opcode: ref pattern2_0, - arg: pattern2_1, - } => { - if let &Opcode::Bnot = pattern2_0 { - let mut iter = C::inst_data_etor(ctx, pattern2_1); - while let Some((pattern4_0, pattern4_1)) = iter.next(ctx) { - if pattern4_0 == pattern1_0 { - match &pattern4_1 { - &InstructionData::Unary { - opcode: ref pattern6_0, - arg: pattern6_1, - } => { - if let &Opcode::Bnot = pattern6_0 { - // Rule at src/opts/algebraic.isle line 131. - let expr0_0 = C::subsume(ctx, pattern6_1); - returns.push(expr0_0); - } - } - &InstructionData::Binary { - opcode: ref pattern6_0, - args: ref pattern6_1, - } => { - if let &Opcode::Bor = pattern6_0 { - let (pattern8_0, pattern8_1) = - C::unpack_value_array_2(ctx, pattern6_1); - // Rule at src/opts/algebraic.isle line 135. - let expr0_0 = constructor_bnot(ctx, pattern1_0, pattern8_0); - let expr1_0 = constructor_bnot(ctx, pattern1_0, pattern8_1); - let expr2_0 = - constructor_band(ctx, pattern1_0, expr0_0, expr1_0); - returns.push(expr2_0); - } - } - _ => {} - } - } - if let &InstructionData::Binary { - opcode: ref pattern5_0, - args: ref pattern5_1, - } = &pattern4_1 - { - if let &Opcode::Band = pattern5_0 { - let (pattern7_0, pattern7_1) = - C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/opts/algebraic.isle line 138. - let expr0_0 = constructor_bnot(ctx, pattern1_0, pattern7_0); - let expr1_0 = constructor_bnot(ctx, pattern1_0, pattern7_1); - let expr2_0 = constructor_bor(ctx, pattern1_0, expr0_0, expr1_0); - returns.push(expr2_0); - } - } - } - // Rule at src/opts/algebraic.isle line 180. - let expr0_0 = C::remat(ctx, pattern0_0); - returns.push(expr0_0); - } - } - &InstructionData::UnaryIeee32 { - opcode: ref pattern2_0, - imm: pattern2_1, - } => { - if let &Opcode::F32const = pattern2_0 { - // Rule at src/opts/algebraic.isle line 184. - let expr0_0 = C::remat(ctx, pattern0_0); - returns.push(expr0_0); - } - } - &InstructionData::UnaryIeee64 { - opcode: ref pattern2_0, - imm: pattern2_1, - } => { - if let &Opcode::F64const = pattern2_0 { - // Rule at src/opts/algebraic.isle line 186. - let expr0_0 = C::remat(ctx, pattern0_0); - returns.push(expr0_0); - } - } - &InstructionData::UnaryImm { - opcode: ref pattern2_0, - imm: pattern2_1, - } => { - if let &Opcode::Iconst = pattern2_0 { - // Rule at src/opts/algebraic.isle line 182. - let expr0_0 = C::remat(ctx, pattern0_0); - returns.push(expr0_0); - } - } - &InstructionData::Binary { - opcode: ref pattern2_0, - args: ref pattern2_1, - } => { - match pattern2_0 { - &Opcode::Iadd => { - let (pattern4_0, pattern4_1) = C::unpack_value_array_2(ctx, pattern2_1); - let mut iter = C::inst_data_etor(ctx, pattern4_0); - while let Some((pattern5_0, pattern5_1)) = iter.next(ctx) { - if pattern5_0 == pattern1_0 { - match &pattern5_1 { - &InstructionData::UnaryImm { - opcode: ref pattern7_0, - imm: pattern7_1, - } => { - if let &Opcode::Iconst = pattern7_0 { - let pattern9_0 = C::u64_from_imm64(ctx, pattern7_1); - if pattern9_0 == 0i128 as u64 { - // Rule at src/opts/algebraic.isle line 20. - let expr0_0 = C::subsume(ctx, pattern4_1); - returns.push(expr0_0); - } - // Rule at src/opts/cprop.isle line 62. - let expr0_0 = constructor_iadd( - ctx, pattern1_0, pattern4_1, pattern4_0, - ); - returns.push(expr0_0); - } - } - &InstructionData::Binary { - opcode: ref pattern7_0, - args: ref pattern7_1, - } => { - match pattern7_0 { - &Opcode::Iadd => { - let (pattern9_0, pattern9_1) = - C::unpack_value_array_2(ctx, pattern7_1); - let mut iter = C::inst_data_etor(ctx, pattern9_1); - while let Some((pattern10_0, pattern10_1)) = - iter.next(ctx) - { - if pattern10_0 == pattern1_0 { - if let &InstructionData::UnaryImm { - opcode: ref pattern12_0, - imm: pattern12_1, - } = &pattern10_1 - { - if let &Opcode::Iconst = pattern12_0 { - let mut iter = C::inst_data_etor( - ctx, pattern4_1, - ); - while let Some(( - pattern14_0, - pattern14_1, - )) = iter.next(ctx) - { - if pattern14_0 == pattern1_0 { - if let &InstructionData::UnaryImm { opcode: ref pattern16_0, imm: pattern16_1 } = &pattern14_1 { - if let &Opcode::Iconst = pattern16_0 { - // Rule at src/opts/cprop.isle line 89. - let expr0_0 = constructor_iadd(ctx, pattern1_0, pattern9_1, pattern4_1); - let expr1_0 = constructor_iadd(ctx, pattern1_0, pattern9_0, expr0_0); - returns.push(expr1_0); - } - } - } - } - } - } - } - } - } - &Opcode::Isub => { - let (pattern9_0, pattern9_1) = - C::unpack_value_array_2(ctx, pattern7_1); - let mut iter = C::inst_data_etor(ctx, pattern9_0); - while let Some((pattern10_0, pattern10_1)) = - iter.next(ctx) - { - if pattern10_0 == pattern1_0 { - if let &InstructionData::UnaryImm { - opcode: ref pattern12_0, - imm: pattern12_1, - } = &pattern10_1 - { - if let &Opcode::Iconst = pattern12_0 { - let pattern14_0 = C::u64_from_imm64( - ctx, - pattern12_1, - ); - let mut iter = C::inst_data_etor( - ctx, pattern4_1, - ); - while let Some(( - pattern15_0, - pattern15_1, - )) = iter.next(ctx) - { - if pattern15_0 == pattern1_0 { - if let &InstructionData::UnaryImm { opcode: ref pattern17_0, imm: pattern17_1 } = &pattern15_1 { - if let &Opcode::Iconst = pattern17_0 { - let pattern19_0 = C::u64_from_imm64(ctx, pattern17_1); - // Rule at src/opts/cprop.isle line 115. - let expr0_0 = C::u64_add(ctx, pattern14_0, pattern19_0); - let expr1_0 = C::imm64_masked(ctx, pattern1_0, expr0_0); - let expr2_0 = constructor_iconst(ctx, pattern1_0, expr1_0); - let expr3_0 = constructor_isub(ctx, pattern1_0, expr2_0, pattern9_1); - returns.push(expr3_0); - } - } - } - } - } - } - } - } - let mut iter = C::inst_data_etor(ctx, pattern9_1); - while let Some((pattern10_0, pattern10_1)) = - iter.next(ctx) - { - if pattern10_0 == pattern1_0 { - if let &InstructionData::UnaryImm { - opcode: ref pattern12_0, - imm: pattern12_1, - } = &pattern10_1 - { - if let &Opcode::Iconst = pattern12_0 { - let pattern14_0 = C::u64_from_imm64( - ctx, - pattern12_1, - ); - let mut iter = C::inst_data_etor( - ctx, pattern4_1, - ); - while let Some(( - pattern15_0, - pattern15_1, - )) = iter.next(ctx) - { - if pattern15_0 == pattern1_0 { - if let &InstructionData::UnaryImm { opcode: ref pattern17_0, imm: pattern17_1 } = &pattern15_1 { - if let &Opcode::Iconst = pattern17_0 { - let pattern19_0 = C::u64_from_imm64(ctx, pattern17_1); - // Rule at src/opts/cprop.isle line 111. - let expr0_0 = C::u64_sub(ctx, pattern19_0, pattern14_0); - let expr1_0 = C::imm64_masked(ctx, pattern1_0, expr0_0); - let expr2_0 = constructor_iconst(ctx, pattern1_0, expr1_0); - let expr3_0 = constructor_iadd(ctx, pattern1_0, pattern9_0, expr2_0); - returns.push(expr3_0); - } - } - } - } - } - } - } - } - } - _ => {} - } - } - _ => {} - } - } - if let &InstructionData::UnaryImm { - opcode: ref pattern6_0, - imm: pattern6_1, - } = &pattern5_1 - { - if let &Opcode::Iconst = pattern6_0 { - // Rule at src/opts/algebraic.isle line 160. - let expr0_0 = C::remat(ctx, pattern0_0); - returns.push(expr0_0); - } - } - } - let mut iter = C::inst_data_etor(ctx, pattern4_1); - while let Some((pattern5_0, pattern5_1)) = iter.next(ctx) { - if pattern5_0 == pattern1_0 { - if let &InstructionData::UnaryImm { - opcode: ref pattern7_0, - imm: pattern7_1, - } = &pattern5_1 - { - if let &Opcode::Iconst = pattern7_0 { - let pattern9_0 = C::u64_from_imm64(ctx, pattern7_1); - if pattern9_0 == 0i128 as u64 { - // Rule at src/opts/algebraic.isle line 16. - let expr0_0 = C::subsume(ctx, pattern4_0); - returns.push(expr0_0); - } - } - } - } - if let &InstructionData::UnaryImm { - opcode: ref pattern6_0, - imm: pattern6_1, - } = &pattern5_1 - { - if let &Opcode::Iconst = pattern6_0 { - // Rule at src/opts/algebraic.isle line 162. - let expr0_0 = C::remat(ctx, pattern0_0); - returns.push(expr0_0); - } - } - } - } - &Opcode::Isub => { - let (pattern4_0, pattern4_1) = C::unpack_value_array_2(ctx, pattern2_1); - let mut iter = C::inst_data_etor(ctx, pattern4_0); - while let Some((pattern5_0, pattern5_1)) = iter.next(ctx) { - if pattern5_0 == pattern1_0 { - match &pattern5_1 { - &InstructionData::UnaryImm { - opcode: ref pattern7_0, - imm: pattern7_1, - } => { - if let &Opcode::Iconst = pattern7_0 { - let pattern9_0 = C::u64_from_imm64(ctx, pattern7_1); - if pattern9_0 == 0i128 as u64 { - // Rule at src/opts/algebraic.isle line 30. - let expr0_0 = - constructor_ineg(ctx, pattern1_0, pattern4_1); - returns.push(expr0_0); - } - // Rule at src/opts/cprop.isle line 67. - let expr0_0 = constructor_isub( - ctx, pattern1_0, pattern4_1, pattern4_0, - ); - let expr1_0 = - constructor_ineg(ctx, pattern1_0, expr0_0); - returns.push(expr1_0); - } - } - &InstructionData::Binary { - opcode: ref pattern7_0, - args: ref pattern7_1, - } => { - match pattern7_0 { - &Opcode::Iadd => { - let (pattern9_0, pattern9_1) = - C::unpack_value_array_2(ctx, pattern7_1); - let mut iter = C::inst_data_etor(ctx, pattern9_1); - while let Some((pattern10_0, pattern10_1)) = - iter.next(ctx) - { - if pattern10_0 == pattern1_0 { - if let &InstructionData::UnaryImm { - opcode: ref pattern12_0, - imm: pattern12_1, - } = &pattern10_1 - { - if let &Opcode::Iconst = pattern12_0 { - let pattern14_0 = C::u64_from_imm64( - ctx, - pattern12_1, - ); - let mut iter = C::inst_data_etor( - ctx, pattern4_1, - ); - while let Some(( - pattern15_0, - pattern15_1, - )) = iter.next(ctx) - { - if pattern15_0 == pattern1_0 { - if let &InstructionData::UnaryImm { opcode: ref pattern17_0, imm: pattern17_1 } = &pattern15_1 { - if let &Opcode::Iconst = pattern17_0 { - let pattern19_0 = C::u64_from_imm64(ctx, pattern17_1); - // Rule at src/opts/cprop.isle line 107. - let expr0_0 = C::u64_sub(ctx, pattern19_0, pattern14_0); - let expr1_0 = C::imm64_masked(ctx, pattern1_0, expr0_0); - let expr2_0 = constructor_iconst(ctx, pattern1_0, expr1_0); - let expr3_0 = constructor_isub(ctx, pattern1_0, pattern9_0, expr2_0); - returns.push(expr3_0); - } - } - } - } - } - } - } - } - } - &Opcode::Isub => { - let (pattern9_0, pattern9_1) = - C::unpack_value_array_2(ctx, pattern7_1); - let mut iter = C::inst_data_etor(ctx, pattern9_0); - while let Some((pattern10_0, pattern10_1)) = - iter.next(ctx) - { - if pattern10_0 == pattern1_0 { - if let &InstructionData::UnaryImm { - opcode: ref pattern12_0, - imm: pattern12_1, - } = &pattern10_1 - { - if let &Opcode::Iconst = pattern12_0 { - let pattern14_0 = C::u64_from_imm64( - ctx, - pattern12_1, - ); - let mut iter = C::inst_data_etor( - ctx, pattern4_1, - ); - while let Some(( - pattern15_0, - pattern15_1, - )) = iter.next(ctx) - { - if pattern15_0 == pattern1_0 { - if let &InstructionData::UnaryImm { opcode: ref pattern17_0, imm: pattern17_1 } = &pattern15_1 { - if let &Opcode::Iconst = pattern17_0 { - let pattern19_0 = C::u64_from_imm64(ctx, pattern17_1); - // Rule at src/opts/cprop.isle line 103. - let expr0_0 = C::u64_sub(ctx, pattern14_0, pattern19_0); - let expr1_0 = C::imm64_masked(ctx, pattern1_0, expr0_0); - let expr2_0 = constructor_iconst(ctx, pattern1_0, expr1_0); - let expr3_0 = constructor_isub(ctx, pattern1_0, expr2_0, pattern9_1); - returns.push(expr3_0); - } - } - } - } - } - } - } - } - let mut iter = C::inst_data_etor(ctx, pattern9_1); - while let Some((pattern10_0, pattern10_1)) = - iter.next(ctx) - { - if pattern10_0 == pattern1_0 { - if let &InstructionData::UnaryImm { - opcode: ref pattern12_0, - imm: pattern12_1, - } = &pattern10_1 - { - if let &Opcode::Iconst = pattern12_0 { - let pattern14_0 = C::u64_from_imm64( - ctx, - pattern12_1, - ); - let mut iter = C::inst_data_etor( - ctx, pattern4_1, - ); - while let Some(( - pattern15_0, - pattern15_1, - )) = iter.next(ctx) - { - if pattern15_0 == pattern1_0 { - if let &InstructionData::UnaryImm { opcode: ref pattern17_0, imm: pattern17_1 } = &pattern15_1 { - if let &Opcode::Iconst = pattern17_0 { - let pattern19_0 = C::u64_from_imm64(ctx, pattern17_1); - // Rule at src/opts/cprop.isle line 99. - let expr0_0 = C::u64_add(ctx, pattern14_0, pattern19_0); - let expr1_0 = C::imm64_masked(ctx, pattern1_0, expr0_0); - let expr2_0 = constructor_iconst(ctx, pattern1_0, expr1_0); - let expr3_0 = constructor_isub(ctx, pattern1_0, pattern9_0, expr2_0); - returns.push(expr3_0); - } - } - } - } - } - } - } - } - } - _ => {} - } - } - _ => {} - } - } - if let &InstructionData::UnaryImm { - opcode: ref pattern6_0, - imm: pattern6_1, - } = &pattern5_1 - { - if let &Opcode::Iconst = pattern6_0 { - // Rule at src/opts/algebraic.isle line 164. - let expr0_0 = C::remat(ctx, pattern0_0); - returns.push(expr0_0); - } - } - } - let mut iter = C::inst_data_etor(ctx, pattern4_1); - while let Some((pattern5_0, pattern5_1)) = iter.next(ctx) { - if pattern5_0 == pattern1_0 { - if let &InstructionData::UnaryImm { - opcode: ref pattern7_0, - imm: pattern7_1, - } = &pattern5_1 - { - if let &Opcode::Iconst = pattern7_0 { - let pattern9_0 = C::u64_from_imm64(ctx, pattern7_1); - if pattern9_0 == 0i128 as u64 { - // Rule at src/opts/algebraic.isle line 25. - let expr0_0 = C::subsume(ctx, pattern4_0); - returns.push(expr0_0); - } - } - } - } - if let &InstructionData::UnaryImm { - opcode: ref pattern6_0, - imm: pattern6_1, - } = &pattern5_1 - { - if let &Opcode::Iconst = pattern6_0 { - // Rule at src/opts/algebraic.isle line 166. - let expr0_0 = C::remat(ctx, pattern0_0); - returns.push(expr0_0); - } - } - } - } - &Opcode::Imul => { - let (pattern4_0, pattern4_1) = C::unpack_value_array_2(ctx, pattern2_1); - let mut iter = C::inst_data_etor(ctx, pattern4_0); - while let Some((pattern5_0, pattern5_1)) = iter.next(ctx) { - if pattern5_0 == pattern1_0 { - match &pattern5_1 { - &InstructionData::UnaryImm { - opcode: ref pattern7_0, - imm: pattern7_1, - } => { - if let &Opcode::Iconst = pattern7_0 { - let pattern9_0 = C::u64_from_imm64(ctx, pattern7_1); - if pattern9_0 == 0i128 as u64 { - // Rule at src/opts/algebraic.isle line 50. - let expr0_0: u64 = 0i128 as u64; - let expr1_0 = C::imm64(ctx, expr0_0); - let expr2_0 = - constructor_iconst(ctx, pattern1_0, expr1_0); - returns.push(expr2_0); - } - if pattern9_0 == 1i128 as u64 { - // Rule at src/opts/algebraic.isle line 40. - let expr0_0 = C::subsume(ctx, pattern4_1); - returns.push(expr0_0); - } - // Rule at src/opts/cprop.isle line 70. - let expr0_0 = constructor_imul( - ctx, pattern1_0, pattern4_1, pattern4_0, - ); - returns.push(expr0_0); - } - } - &InstructionData::Binary { - opcode: ref pattern7_0, - args: ref pattern7_1, - } => { - if let &Opcode::Imul = pattern7_0 { - let (pattern9_0, pattern9_1) = - C::unpack_value_array_2(ctx, pattern7_1); - let mut iter = C::inst_data_etor(ctx, pattern9_1); - while let Some((pattern10_0, pattern10_1)) = - iter.next(ctx) - { - if pattern10_0 == pattern1_0 { - if let &InstructionData::UnaryImm { - opcode: ref pattern12_0, - imm: pattern12_1, - } = &pattern10_1 - { - if let &Opcode::Iconst = pattern12_0 { - let mut iter = - C::inst_data_etor(ctx, pattern4_1); - while let Some(( - pattern14_0, - pattern14_1, - )) = iter.next(ctx) - { - if pattern14_0 == pattern1_0 { - if let &InstructionData::UnaryImm { opcode: ref pattern16_0, imm: pattern16_1 } = &pattern14_1 { - if let &Opcode::Iconst = pattern16_0 { - // Rule at src/opts/cprop.isle line 120. - let expr0_0 = constructor_imul(ctx, pattern1_0, pattern9_1, pattern4_1); - let expr1_0 = constructor_imul(ctx, pattern1_0, pattern9_0, expr0_0); - returns.push(expr1_0); - } - } - } - } - } - } - } - } - } - } - _ => {} - } - } - if let &InstructionData::UnaryImm { - opcode: ref pattern6_0, - imm: pattern6_1, - } = &pattern5_1 - { - if let &Opcode::Iconst = pattern6_0 { - if let Some(pattern8_0) = C::simm32(ctx, pattern6_1) { - if pattern8_0 == 2i128 as u32 { - // Rule at src/opts/algebraic.isle line 144. - let expr0_0 = constructor_iadd( - ctx, pattern1_0, pattern4_1, pattern4_1, - ); - returns.push(expr0_0); - } - } - } - } - } - let mut iter = C::inst_data_etor(ctx, pattern4_1); - while let Some((pattern5_0, pattern5_1)) = iter.next(ctx) { - if pattern5_0 == pattern1_0 { - if let &InstructionData::UnaryImm { - opcode: ref pattern7_0, - imm: pattern7_1, - } = &pattern5_1 - { - if let &Opcode::Iconst = pattern7_0 { - let pattern9_0 = C::u64_from_imm64(ctx, pattern7_1); - if pattern9_0 == 0i128 as u64 { - // Rule at src/opts/algebraic.isle line 46. - let expr0_0: u64 = 0i128 as u64; - let expr1_0 = C::imm64(ctx, expr0_0); - let expr2_0 = - constructor_iconst(ctx, pattern1_0, expr1_0); - returns.push(expr2_0); - } - if pattern9_0 == 1i128 as u64 { - // Rule at src/opts/algebraic.isle line 36. - let expr0_0 = C::subsume(ctx, pattern4_0); - returns.push(expr0_0); - } - } - } - } - if let &InstructionData::UnaryImm { - opcode: ref pattern6_0, - imm: pattern6_1, - } = &pattern5_1 - { - if let &Opcode::Iconst = pattern6_0 { - if let Some(pattern8_0) = C::simm32(ctx, pattern6_1) { - if pattern8_0 == 2i128 as u32 { - // Rule at src/opts/algebraic.isle line 142. - let expr0_0 = constructor_iadd( - ctx, pattern1_0, pattern4_0, pattern4_0, - ); - returns.push(expr0_0); - } - } - } - } - } - } - &Opcode::Udiv => { - let (pattern4_0, pattern4_1) = C::unpack_value_array_2(ctx, pattern2_1); - let mut iter = C::inst_data_etor(ctx, pattern4_1); - while let Some((pattern5_0, pattern5_1)) = iter.next(ctx) { - if pattern5_0 == pattern1_0 { - if let &InstructionData::UnaryImm { - opcode: ref pattern7_0, - imm: pattern7_1, - } = &pattern5_1 - { - if let &Opcode::Iconst = pattern7_0 { - let pattern9_0 = C::u64_from_imm64(ctx, pattern7_1); - if pattern9_0 == 1i128 as u64 { - // Rule at src/opts/algebraic.isle line 60. - let expr0_0 = C::subsume(ctx, pattern4_0); - returns.push(expr0_0); - } - } - } - } - } - } - &Opcode::Sdiv => { - let (pattern4_0, pattern4_1) = C::unpack_value_array_2(ctx, pattern2_1); - let mut iter = C::inst_data_etor(ctx, pattern4_1); - while let Some((pattern5_0, pattern5_1)) = iter.next(ctx) { - if pattern5_0 == pattern1_0 { - if let &InstructionData::UnaryImm { - opcode: ref pattern7_0, - imm: pattern7_1, - } = &pattern5_1 - { - if let &Opcode::Iconst = pattern7_0 { - let pattern9_0 = C::u64_from_imm64(ctx, pattern7_1); - if pattern9_0 == 1i128 as u64 { - // Rule at src/opts/algebraic.isle line 56. - let expr0_0 = C::subsume(ctx, pattern4_0); - returns.push(expr0_0); - } - } - } - } - } - } - &Opcode::Band => { - let (pattern4_0, pattern4_1) = C::unpack_value_array_2(ctx, pattern2_1); - if pattern4_1 == pattern4_0 { - // Rule at src/opts/algebraic.isle line 120. - returns.push(pattern4_0); - } - let mut iter = C::inst_data_etor(ctx, pattern4_0); - while let Some((pattern5_0, pattern5_1)) = iter.next(ctx) { - if pattern5_0 == pattern1_0 { - match &pattern5_1 { - &InstructionData::UnaryImm { - opcode: ref pattern7_0, - imm: pattern7_1, - } => { - if let &Opcode::Iconst = pattern7_0 { - let pattern9_0 = C::u64_from_imm64(ctx, pattern7_1); - if pattern9_0 == 0i128 as u64 { - // Rule at src/opts/algebraic.isle line 128. - let expr0_0: u64 = 0i128 as u64; - let expr1_0 = C::imm64(ctx, expr0_0); - let expr2_0 = - constructor_iconst(ctx, pattern1_0, expr1_0); - returns.push(expr2_0); - } - // Rule at src/opts/cprop.isle line 77. - let expr0_0 = constructor_band( - ctx, pattern1_0, pattern4_1, pattern4_0, - ); - returns.push(expr0_0); - } - } - &InstructionData::Binary { - opcode: ref pattern7_0, - args: ref pattern7_1, - } => { - if let &Opcode::Band = pattern7_0 { - let (pattern9_0, pattern9_1) = - C::unpack_value_array_2(ctx, pattern7_1); - let mut iter = C::inst_data_etor(ctx, pattern9_1); - while let Some((pattern10_0, pattern10_1)) = - iter.next(ctx) - { - if pattern10_0 == pattern1_0 { - if let &InstructionData::UnaryImm { - opcode: ref pattern12_0, - imm: pattern12_1, - } = &pattern10_1 - { - if let &Opcode::Iconst = pattern12_0 { - let mut iter = - C::inst_data_etor(ctx, pattern4_1); - while let Some(( - pattern14_0, - pattern14_1, - )) = iter.next(ctx) - { - if pattern14_0 == pattern1_0 { - if let &InstructionData::UnaryImm { opcode: ref pattern16_0, imm: pattern16_1 } = &pattern14_1 { - if let &Opcode::Iconst = pattern16_0 { - // Rule at src/opts/cprop.isle line 126. - let expr0_0 = constructor_band(ctx, pattern1_0, pattern9_1, pattern4_1); - let expr1_0 = constructor_band(ctx, pattern1_0, pattern9_0, expr0_0); - returns.push(expr1_0); - } - } - } - } - } - } - } - } - } - } - _ => {} - } - } - if let &InstructionData::UnaryImm { - opcode: ref pattern6_0, - imm: pattern6_1, - } = &pattern5_1 - { - if let &Opcode::Iconst = pattern6_0 { - // Rule at src/opts/algebraic.isle line 168. - let expr0_0 = C::remat(ctx, pattern0_0); - returns.push(expr0_0); - } - } - } - let mut iter = C::inst_data_etor(ctx, pattern4_1); - while let Some((pattern5_0, pattern5_1)) = iter.next(ctx) { - if pattern5_0 == pattern1_0 { - if let &InstructionData::UnaryImm { - opcode: ref pattern7_0, - imm: pattern7_1, - } = &pattern5_1 - { - if let &Opcode::Iconst = pattern7_0 { - let pattern9_0 = C::u64_from_imm64(ctx, pattern7_1); - if pattern9_0 == 0i128 as u64 { - // Rule at src/opts/algebraic.isle line 127. - let expr0_0: u64 = 0i128 as u64; - let expr1_0 = C::imm64(ctx, expr0_0); - let expr2_0 = - constructor_iconst(ctx, pattern1_0, expr1_0); - returns.push(expr2_0); - } - } - } - } - if let &InstructionData::UnaryImm { - opcode: ref pattern6_0, - imm: pattern6_1, - } = &pattern5_1 - { - if let &Opcode::Iconst = pattern6_0 { - // Rule at src/opts/algebraic.isle line 170. - let expr0_0 = C::remat(ctx, pattern0_0); - returns.push(expr0_0); - } - } - } - } - &Opcode::Bor => { - let (pattern4_0, pattern4_1) = C::unpack_value_array_2(ctx, pattern2_1); - if pattern4_1 == pattern4_0 { - // Rule at src/opts/algebraic.isle line 96. - let expr0_0 = C::subsume(ctx, pattern4_0); - returns.push(expr0_0); - } - let mut iter = C::inst_data_etor(ctx, pattern4_0); - while let Some((pattern5_0, pattern5_1)) = iter.next(ctx) { - if pattern5_0 == pattern1_0 { - match &pattern5_1 { - &InstructionData::UnaryImm { - opcode: ref pattern7_0, - imm: pattern7_1, - } => { - if let &Opcode::Iconst = pattern7_0 { - let pattern9_0 = C::u64_from_imm64(ctx, pattern7_1); - if pattern9_0 == 0i128 as u64 { - // Rule at src/opts/algebraic.isle line 92. - let expr0_0 = C::subsume(ctx, pattern4_1); - returns.push(expr0_0); - } - // Rule at src/opts/cprop.isle line 74. - let expr0_0 = constructor_bor( - ctx, pattern1_0, pattern4_1, pattern4_0, - ); - returns.push(expr0_0); - } - } - &InstructionData::Binary { - opcode: ref pattern7_0, - args: ref pattern7_1, - } => { - if let &Opcode::Bor = pattern7_0 { - let (pattern9_0, pattern9_1) = - C::unpack_value_array_2(ctx, pattern7_1); - let mut iter = C::inst_data_etor(ctx, pattern9_1); - while let Some((pattern10_0, pattern10_1)) = - iter.next(ctx) - { - if pattern10_0 == pattern1_0 { - if let &InstructionData::UnaryImm { - opcode: ref pattern12_0, - imm: pattern12_1, - } = &pattern10_1 - { - if let &Opcode::Iconst = pattern12_0 { - let mut iter = - C::inst_data_etor(ctx, pattern4_1); - while let Some(( - pattern14_0, - pattern14_1, - )) = iter.next(ctx) - { - if pattern14_0 == pattern1_0 { - if let &InstructionData::UnaryImm { opcode: ref pattern16_0, imm: pattern16_1 } = &pattern14_1 { - if let &Opcode::Iconst = pattern16_0 { - // Rule at src/opts/cprop.isle line 123. - let expr0_0 = constructor_bor(ctx, pattern1_0, pattern9_1, pattern4_1); - let expr1_0 = constructor_bor(ctx, pattern1_0, pattern9_0, expr0_0); - returns.push(expr1_0); - } - } - } - } - } - } - } - } - } - } - _ => {} - } - } - if let &InstructionData::UnaryImm { - opcode: ref pattern6_0, - imm: pattern6_1, - } = &pattern5_1 - { - if let &Opcode::Iconst = pattern6_0 { - // Rule at src/opts/algebraic.isle line 172. - let expr0_0 = C::remat(ctx, pattern0_0); - returns.push(expr0_0); - } - } - } - let mut iter = C::inst_data_etor(ctx, pattern4_1); - while let Some((pattern5_0, pattern5_1)) = iter.next(ctx) { - if pattern5_0 == pattern1_0 { - if let &InstructionData::UnaryImm { - opcode: ref pattern7_0, - imm: pattern7_1, - } = &pattern5_1 - { - if let &Opcode::Iconst = pattern7_0 { - let pattern9_0 = C::u64_from_imm64(ctx, pattern7_1); - if pattern9_0 == 0i128 as u64 { - // Rule at src/opts/algebraic.isle line 88. - let expr0_0 = C::subsume(ctx, pattern4_0); - returns.push(expr0_0); - } - } - } - } - if let &InstructionData::UnaryImm { - opcode: ref pattern6_0, - imm: pattern6_1, - } = &pattern5_1 - { - if let &Opcode::Iconst = pattern6_0 { - // Rule at src/opts/algebraic.isle line 174. - let expr0_0 = C::remat(ctx, pattern0_0); - returns.push(expr0_0); - } - } - } - } - &Opcode::Bxor => { - let (pattern4_0, pattern4_1) = C::unpack_value_array_2(ctx, pattern2_1); - let mut iter = C::inst_data_etor(ctx, pattern4_0); - while let Some((pattern5_0, pattern5_1)) = iter.next(ctx) { - if pattern5_0 == pattern1_0 { - match &pattern5_1 { - &InstructionData::UnaryImm { - opcode: ref pattern7_0, - imm: pattern7_1, - } => { - if let &Opcode::Iconst = pattern7_0 { - let pattern9_0 = C::u64_from_imm64(ctx, pattern7_1); - if pattern9_0 == 0i128 as u64 { - // Rule at src/opts/algebraic.isle line 104. - let expr0_0 = C::subsume(ctx, pattern4_1); - returns.push(expr0_0); - } - // Rule at src/opts/cprop.isle line 80. - let expr0_0 = constructor_bxor( - ctx, pattern1_0, pattern4_1, pattern4_0, - ); - returns.push(expr0_0); - } - } - &InstructionData::Binary { - opcode: ref pattern7_0, - args: ref pattern7_1, - } => { - if let &Opcode::Bxor = pattern7_0 { - let (pattern9_0, pattern9_1) = - C::unpack_value_array_2(ctx, pattern7_1); - let mut iter = C::inst_data_etor(ctx, pattern9_1); - while let Some((pattern10_0, pattern10_1)) = - iter.next(ctx) - { - if pattern10_0 == pattern1_0 { - if let &InstructionData::UnaryImm { - opcode: ref pattern12_0, - imm: pattern12_1, - } = &pattern10_1 - { - if let &Opcode::Iconst = pattern12_0 { - let mut iter = - C::inst_data_etor(ctx, pattern4_1); - while let Some(( - pattern14_0, - pattern14_1, - )) = iter.next(ctx) - { - if pattern14_0 == pattern1_0 { - if let &InstructionData::UnaryImm { opcode: ref pattern16_0, imm: pattern16_1 } = &pattern14_1 { - if let &Opcode::Iconst = pattern16_0 { - // Rule at src/opts/cprop.isle line 129. - let expr0_0 = constructor_bxor(ctx, pattern1_0, pattern9_1, pattern4_1); - let expr1_0 = constructor_bxor(ctx, pattern1_0, pattern9_0, expr0_0); - returns.push(expr1_0); - } - } - } - } - } - } - } - } - } - } - _ => {} - } - } - if let &InstructionData::UnaryImm { - opcode: ref pattern6_0, - imm: pattern6_1, - } = &pattern5_1 - { - if let &Opcode::Iconst = pattern6_0 { - // Rule at src/opts/algebraic.isle line 176. - let expr0_0 = C::remat(ctx, pattern0_0); - returns.push(expr0_0); - } - } - } - let mut iter = C::inst_data_etor(ctx, pattern4_1); - while let Some((pattern5_0, pattern5_1)) = iter.next(ctx) { - if pattern5_0 == pattern1_0 { - if let &InstructionData::UnaryImm { - opcode: ref pattern7_0, - imm: pattern7_1, - } = &pattern5_1 - { - if let &Opcode::Iconst = pattern7_0 { - let pattern9_0 = C::u64_from_imm64(ctx, pattern7_1); - if pattern9_0 == 0i128 as u64 { - // Rule at src/opts/algebraic.isle line 100. - let expr0_0 = C::subsume(ctx, pattern4_0); - returns.push(expr0_0); - } - } - } - } - if let &InstructionData::UnaryImm { - opcode: ref pattern6_0, - imm: pattern6_1, - } = &pattern5_1 - { - if let &Opcode::Iconst = pattern6_0 { - // Rule at src/opts/algebraic.isle line 178. - let expr0_0 = C::remat(ctx, pattern0_0); - returns.push(expr0_0); - } - } - } - } - &Opcode::Rotl => { - let (pattern4_0, pattern4_1) = C::unpack_value_array_2(ctx, pattern2_1); - let mut iter = C::inst_data_etor(ctx, pattern4_1); - while let Some((pattern5_0, pattern5_1)) = iter.next(ctx) { - if pattern5_0 == pattern1_0 { - if let &InstructionData::UnaryImm { - opcode: ref pattern7_0, - imm: pattern7_1, - } = &pattern5_1 - { - if let &Opcode::Iconst = pattern7_0 { - let pattern9_0 = C::u64_from_imm64(ctx, pattern7_1); - if pattern9_0 == 0i128 as u64 { - // Rule at src/opts/algebraic.isle line 82. - let expr0_0 = C::subsume(ctx, pattern4_0); - returns.push(expr0_0); - } - } - } - } - } - } - &Opcode::Rotr => { - let (pattern4_0, pattern4_1) = C::unpack_value_array_2(ctx, pattern2_1); - let mut iter = C::inst_data_etor(ctx, pattern4_1); - while let Some((pattern5_0, pattern5_1)) = iter.next(ctx) { - if pattern5_0 == pattern1_0 { - if let &InstructionData::UnaryImm { - opcode: ref pattern7_0, - imm: pattern7_1, - } = &pattern5_1 - { - if let &Opcode::Iconst = pattern7_0 { - let pattern9_0 = C::u64_from_imm64(ctx, pattern7_1); - if pattern9_0 == 0i128 as u64 { - // Rule at src/opts/algebraic.isle line 78. - let expr0_0 = C::subsume(ctx, pattern4_0); - returns.push(expr0_0); - } - } - } - } - } - } - &Opcode::Ishl => { - let (pattern4_0, pattern4_1) = C::unpack_value_array_2(ctx, pattern2_1); - let mut iter = C::inst_data_etor(ctx, pattern4_1); - while let Some((pattern5_0, pattern5_1)) = iter.next(ctx) { - if pattern5_0 == pattern1_0 { - if let &InstructionData::UnaryImm { - opcode: ref pattern7_0, - imm: pattern7_1, - } = &pattern5_1 - { - if let &Opcode::Iconst = pattern7_0 { - let pattern9_0 = C::u64_from_imm64(ctx, pattern7_1); - if pattern9_0 == 0i128 as u64 { - // Rule at src/opts/algebraic.isle line 66. - let expr0_0 = C::subsume(ctx, pattern4_0); - returns.push(expr0_0); - } - } - } - } - } - } - &Opcode::Ushr => { - let (pattern4_0, pattern4_1) = C::unpack_value_array_2(ctx, pattern2_1); - let mut iter = C::inst_data_etor(ctx, pattern4_1); - while let Some((pattern5_0, pattern5_1)) = iter.next(ctx) { - if pattern5_0 == pattern1_0 { - if let &InstructionData::UnaryImm { - opcode: ref pattern7_0, - imm: pattern7_1, - } = &pattern5_1 - { - if let &Opcode::Iconst = pattern7_0 { - let pattern9_0 = C::u64_from_imm64(ctx, pattern7_1); - if pattern9_0 == 0i128 as u64 { - // Rule at src/opts/algebraic.isle line 70. - let expr0_0 = C::subsume(ctx, pattern4_0); - returns.push(expr0_0); - } - } - } - } - } - } - &Opcode::Sshr => { - let (pattern4_0, pattern4_1) = C::unpack_value_array_2(ctx, pattern2_1); - let mut iter = C::inst_data_etor(ctx, pattern4_1); - while let Some((pattern5_0, pattern5_1)) = iter.next(ctx) { - if pattern5_0 == pattern1_0 { - if let &InstructionData::UnaryImm { - opcode: ref pattern7_0, - imm: pattern7_1, - } = &pattern5_1 - { - if let &Opcode::Iconst = pattern7_0 { - let pattern9_0 = C::u64_from_imm64(ctx, pattern7_1); - if pattern9_0 == 0i128 as u64 { - // Rule at src/opts/algebraic.isle line 74. - let expr0_0 = C::subsume(ctx, pattern4_0); - returns.push(expr0_0); - } - } - } - } - } - } - _ => {} - } - } - &InstructionData::IntCompare { - opcode: ref pattern2_0, - args: ref pattern2_1, - cond: ref pattern2_2, - } => { - if let &Opcode::Icmp = pattern2_0 { - let (pattern4_0, pattern4_1) = C::unpack_value_array_2(ctx, pattern2_1); - let mut iter = C::inst_data_etor(ctx, pattern4_0); - while let Some((pattern5_0, pattern5_1)) = iter.next(ctx) { - if let &InstructionData::Unary { - opcode: ref pattern6_0, - arg: pattern6_1, - } = &pattern5_1 - { - if let &Opcode::Uextend = pattern6_0 { - let mut iter = C::inst_data_etor(ctx, pattern6_1); - while let Some((pattern8_0, pattern8_1)) = iter.next(ctx) { - if pattern8_0 == pattern1_0 { - if let &InstructionData::IntCompare { - opcode: ref pattern10_0, - args: ref pattern10_1, - cond: ref pattern10_2, - } = &pattern8_1 - { - if let &Opcode::Icmp = pattern10_0 { - let (pattern12_0, pattern12_1) = - C::unpack_value_array_2(ctx, pattern10_1); - let mut iter = C::inst_data_etor(ctx, pattern4_1); - while let Some((pattern13_0, pattern13_1)) = - iter.next(ctx) - { - if let &InstructionData::UnaryImm { - opcode: ref pattern14_0, - imm: pattern14_1, - } = &pattern13_1 - { - if let &Opcode::Iconst = pattern14_0 { - let pattern16_0 = - C::u64_from_imm64(ctx, pattern14_1); - if pattern16_0 == 0i128 as u64 { - match pattern2_2 { - &IntCC::Equal => { - // Rule at src/opts/algebraic.isle line 196. - let expr0_0 = - C::intcc_inverse( - ctx, - pattern10_2, - ); - let expr1_0 = - constructor_icmp( - ctx, - pattern1_0, - &expr0_0, - pattern12_0, - pattern12_1, - ); - let expr2_0 = C::subsume( - ctx, expr1_0, - ); - returns.push(expr2_0); - } - &IntCC::NotEqual => { - // Rule at src/opts/algebraic.isle line 190. - let expr0_0 = C::subsume( - ctx, pattern6_1, - ); - returns.push(expr0_0); - } - _ => {} - } - } - } - } - } - } - } - } - } - } - } - } - } - } - &InstructionData::Ternary { - opcode: ref pattern2_0, - args: ref pattern2_1, - } => { - if let &Opcode::Select = pattern2_0 { - let (pattern4_0, pattern4_1, pattern4_2) = - C::unpack_value_array_3(ctx, pattern2_1); - let mut iter = C::inst_data_etor(ctx, pattern4_0); - while let Some((pattern5_0, pattern5_1)) = iter.next(ctx) { - match &pattern5_1 { - &InstructionData::Unary { - opcode: ref pattern6_0, - arg: pattern6_1, - } => { - if let &Opcode::Uextend = pattern6_0 { - let mut iter = C::inst_data_etor(ctx, pattern6_1); - while let Some((pattern8_0, pattern8_1)) = iter.next(ctx) { - if let &InstructionData::IntCompare { - opcode: ref pattern9_0, - args: ref pattern9_1, - cond: ref pattern9_2, - } = &pattern8_1 - { - if let &Opcode::Icmp = pattern9_0 { - let (pattern11_0, pattern11_1) = - C::unpack_value_array_2(ctx, pattern9_1); - // Rule at src/opts/algebraic.isle line 204. - let expr0_0 = constructor_select( - ctx, pattern1_0, pattern6_1, pattern4_1, - pattern4_2, - ); - returns.push(expr0_0); - } - } - } - } - } - &InstructionData::UnaryImm { - opcode: ref pattern6_0, - imm: pattern6_1, - } => { - if let &Opcode::Iconst = pattern6_0 { - let pattern8_0 = C::u64_from_imm64(ctx, pattern6_1); - if pattern8_0 == 0i128 as u64 { - // Rule at src/opts/cprop.isle line 136. - returns.push(pattern4_2); - } - let pattern9_0 = C::u64_is_zero(ctx, pattern8_0); - if pattern9_0 == false { - // Rule at src/opts/cprop.isle line 133. - returns.push(pattern4_1); - } - } - } - _ => {} - } - } - } - } - _ => {} - } - if let Some(pattern2_0) = C::fits_in_64(ctx, pattern1_0) { - match &pattern1_1 { - &InstructionData::Unary { - opcode: ref pattern3_0, - arg: pattern3_1, - } => { - if let &Opcode::Bnot = pattern3_0 { - let mut iter = C::inst_data_etor(ctx, pattern3_1); - while let Some((pattern5_0, pattern5_1)) = iter.next(ctx) { - if pattern5_0 == pattern2_0 { - if let &InstructionData::UnaryImm { - opcode: ref pattern7_0, - imm: pattern7_1, - } = &pattern5_1 - { - if let &Opcode::Iconst = pattern7_0 { - let pattern9_0 = C::u64_from_imm64(ctx, pattern7_1); - // Rule at src/opts/cprop.isle line 53. - let expr0_0 = C::u64_not(ctx, pattern9_0); - let expr1_0 = C::imm64_masked(ctx, pattern2_0, expr0_0); - let expr2_0 = constructor_iconst(ctx, pattern2_0, expr1_0); - let expr3_0 = C::subsume(ctx, expr2_0); - returns.push(expr3_0); - } - } - } - } - } - } - &InstructionData::Binary { - opcode: ref pattern3_0, - args: ref pattern3_1, - } => { - match pattern3_0 { - &Opcode::Iadd => { - let (pattern5_0, pattern5_1) = C::unpack_value_array_2(ctx, pattern3_1); - let mut iter = C::inst_data_etor(ctx, pattern5_0); - while let Some((pattern6_0, pattern6_1)) = iter.next(ctx) { - if pattern6_0 == pattern2_0 { - if let &InstructionData::UnaryImm { - opcode: ref pattern8_0, - imm: pattern8_1, - } = &pattern6_1 - { - if let &Opcode::Iconst = pattern8_0 { - let pattern10_0 = C::u64_from_imm64(ctx, pattern8_1); - let mut iter = C::inst_data_etor(ctx, pattern5_1); - while let Some((pattern11_0, pattern11_1)) = - iter.next(ctx) - { - if pattern11_0 == pattern2_0 { - if let &InstructionData::UnaryImm { - opcode: ref pattern13_0, - imm: pattern13_1, - } = &pattern11_1 - { - if let &Opcode::Iconst = pattern13_0 { - let pattern15_0 = - C::u64_from_imm64(ctx, pattern13_1); - // Rule at src/opts/cprop.isle line 3. - let expr0_0 = C::u64_add( - ctx, - pattern10_0, - pattern15_0, - ); - let expr1_0 = C::imm64_masked( - ctx, pattern2_0, expr0_0, - ); - let expr2_0 = constructor_iconst( - ctx, pattern2_0, expr1_0, - ); - let expr3_0 = C::subsume(ctx, expr2_0); - returns.push(expr3_0); - } - } - } - } - } - } - } - } - } - &Opcode::Isub => { - let (pattern5_0, pattern5_1) = C::unpack_value_array_2(ctx, pattern3_1); - let mut iter = C::inst_data_etor(ctx, pattern5_0); - while let Some((pattern6_0, pattern6_1)) = iter.next(ctx) { - if pattern6_0 == pattern2_0 { - if let &InstructionData::UnaryImm { - opcode: ref pattern8_0, - imm: pattern8_1, - } = &pattern6_1 - { - if let &Opcode::Iconst = pattern8_0 { - let pattern10_0 = C::u64_from_imm64(ctx, pattern8_1); - let mut iter = C::inst_data_etor(ctx, pattern5_1); - while let Some((pattern11_0, pattern11_1)) = - iter.next(ctx) - { - if pattern11_0 == pattern2_0 { - if let &InstructionData::UnaryImm { - opcode: ref pattern13_0, - imm: pattern13_1, - } = &pattern11_1 - { - if let &Opcode::Iconst = pattern13_0 { - let pattern15_0 = - C::u64_from_imm64(ctx, pattern13_1); - // Rule at src/opts/cprop.isle line 9. - let expr0_0 = C::u64_sub( - ctx, - pattern10_0, - pattern15_0, - ); - let expr1_0 = C::imm64_masked( - ctx, pattern2_0, expr0_0, - ); - let expr2_0 = constructor_iconst( - ctx, pattern2_0, expr1_0, - ); - let expr3_0 = C::subsume(ctx, expr2_0); - returns.push(expr3_0); - } - } - } - } - } - } - } - } - } - &Opcode::Imul => { - let (pattern5_0, pattern5_1) = C::unpack_value_array_2(ctx, pattern3_1); - let mut iter = C::inst_data_etor(ctx, pattern5_0); - while let Some((pattern6_0, pattern6_1)) = iter.next(ctx) { - if pattern6_0 == pattern2_0 { - if let &InstructionData::UnaryImm { - opcode: ref pattern8_0, - imm: pattern8_1, - } = &pattern6_1 - { - if let &Opcode::Iconst = pattern8_0 { - let pattern10_0 = C::u64_from_imm64(ctx, pattern8_1); - let mut iter = C::inst_data_etor(ctx, pattern5_1); - while let Some((pattern11_0, pattern11_1)) = - iter.next(ctx) - { - if pattern11_0 == pattern2_0 { - if let &InstructionData::UnaryImm { - opcode: ref pattern13_0, - imm: pattern13_1, - } = &pattern11_1 - { - if let &Opcode::Iconst = pattern13_0 { - let pattern15_0 = - C::u64_from_imm64(ctx, pattern13_1); - // Rule at src/opts/cprop.isle line 15. - let expr0_0 = C::u64_mul( - ctx, - pattern10_0, - pattern15_0, - ); - let expr1_0 = C::imm64_masked( - ctx, pattern2_0, expr0_0, - ); - let expr2_0 = constructor_iconst( - ctx, pattern2_0, expr1_0, - ); - let expr3_0 = C::subsume(ctx, expr2_0); - returns.push(expr3_0); - } - } - } - } - } - } - } - } - } - &Opcode::Udiv => { - let (pattern5_0, pattern5_1) = C::unpack_value_array_2(ctx, pattern3_1); - let mut iter = C::inst_data_etor(ctx, pattern5_0); - while let Some((pattern6_0, pattern6_1)) = iter.next(ctx) { - if pattern6_0 == pattern2_0 { - if let &InstructionData::UnaryImm { - opcode: ref pattern8_0, - imm: pattern8_1, - } = &pattern6_1 - { - if let &Opcode::Iconst = pattern8_0 { - let pattern10_0 = C::u64_from_imm64(ctx, pattern8_1); - let mut iter = C::inst_data_etor(ctx, pattern5_1); - while let Some((pattern11_0, pattern11_1)) = - iter.next(ctx) - { - if pattern11_0 == pattern2_0 { - if let &InstructionData::UnaryImm { - opcode: ref pattern13_0, - imm: pattern13_1, - } = &pattern11_1 - { - if let &Opcode::Iconst = pattern13_0 { - let pattern15_0 = - C::u64_from_imm64(ctx, pattern13_1); - let mut closure16 = || { - let expr0_0 = C::u64_udiv( - ctx, - pattern10_0, - pattern15_0, - )?; - return Some(expr0_0); - }; - if let Some(pattern16_0) = closure16() { - // Rule at src/opts/cprop.isle line 28. - let expr0_0 = C::imm64_masked( - ctx, - pattern2_0, - pattern16_0, - ); - let expr1_0 = constructor_iconst( - ctx, pattern2_0, expr0_0, - ); - let expr2_0 = - C::subsume(ctx, expr1_0); - returns.push(expr2_0); - } - } - } - } - } - } - } - } - } - } - &Opcode::Sdiv => { - let (pattern5_0, pattern5_1) = C::unpack_value_array_2(ctx, pattern3_1); - let mut iter = C::inst_data_etor(ctx, pattern5_0); - while let Some((pattern6_0, pattern6_1)) = iter.next(ctx) { - if pattern6_0 == pattern2_0 { - if let &InstructionData::UnaryImm { - opcode: ref pattern8_0, - imm: pattern8_1, - } = &pattern6_1 - { - if let &Opcode::Iconst = pattern8_0 { - let pattern10_0 = C::u64_from_imm64(ctx, pattern8_1); - let mut iter = C::inst_data_etor(ctx, pattern5_1); - while let Some((pattern11_0, pattern11_1)) = - iter.next(ctx) - { - if pattern11_0 == pattern2_0 { - if let &InstructionData::UnaryImm { - opcode: ref pattern13_0, - imm: pattern13_1, - } = &pattern11_1 - { - if let &Opcode::Iconst = pattern13_0 { - let pattern15_0 = - C::u64_from_imm64(ctx, pattern13_1); - let mut closure16 = || { - let expr0_0 = C::u64_sdiv( - ctx, - pattern10_0, - pattern15_0, - )?; - return Some(expr0_0); - }; - if let Some(pattern16_0) = closure16() { - // Rule at src/opts/cprop.isle line 21. - let expr0_0 = C::imm64_masked( - ctx, - pattern2_0, - pattern16_0, - ); - let expr1_0 = constructor_iconst( - ctx, pattern2_0, expr0_0, - ); - let expr2_0 = - C::subsume(ctx, expr1_0); - returns.push(expr2_0); - } - } - } - } - } - } - } - } - } - } - &Opcode::Band => { - let (pattern5_0, pattern5_1) = C::unpack_value_array_2(ctx, pattern3_1); - let mut iter = C::inst_data_etor(ctx, pattern5_0); - while let Some((pattern6_0, pattern6_1)) = iter.next(ctx) { - if pattern6_0 == pattern2_0 { - if let &InstructionData::UnaryImm { - opcode: ref pattern8_0, - imm: pattern8_1, - } = &pattern6_1 - { - if let &Opcode::Iconst = pattern8_0 { - let pattern10_0 = C::u64_from_imm64(ctx, pattern8_1); - let mut iter = C::inst_data_etor(ctx, pattern5_1); - while let Some((pattern11_0, pattern11_1)) = - iter.next(ctx) - { - if pattern11_0 == pattern2_0 { - if let &InstructionData::UnaryImm { - opcode: ref pattern13_0, - imm: pattern13_1, - } = &pattern11_1 - { - if let &Opcode::Iconst = pattern13_0 { - let pattern15_0 = - C::u64_from_imm64(ctx, pattern13_1); - // Rule at src/opts/cprop.isle line 41. - let expr0_0 = C::u64_and( - ctx, - pattern10_0, - pattern15_0, - ); - let expr1_0 = C::imm64_masked( - ctx, pattern2_0, expr0_0, - ); - let expr2_0 = constructor_iconst( - ctx, pattern2_0, expr1_0, - ); - let expr3_0 = C::subsume(ctx, expr2_0); - returns.push(expr3_0); - } - } - } - } - } - } - } - } - } - &Opcode::Bor => { - let (pattern5_0, pattern5_1) = C::unpack_value_array_2(ctx, pattern3_1); - let mut iter = C::inst_data_etor(ctx, pattern5_0); - while let Some((pattern6_0, pattern6_1)) = iter.next(ctx) { - if pattern6_0 == pattern2_0 { - if let &InstructionData::UnaryImm { - opcode: ref pattern8_0, - imm: pattern8_1, - } = &pattern6_1 - { - if let &Opcode::Iconst = pattern8_0 { - let pattern10_0 = C::u64_from_imm64(ctx, pattern8_1); - let mut iter = C::inst_data_etor(ctx, pattern5_1); - while let Some((pattern11_0, pattern11_1)) = - iter.next(ctx) - { - if pattern11_0 == pattern2_0 { - if let &InstructionData::UnaryImm { - opcode: ref pattern13_0, - imm: pattern13_1, - } = &pattern11_1 - { - if let &Opcode::Iconst = pattern13_0 { - let pattern15_0 = - C::u64_from_imm64(ctx, pattern13_1); - // Rule at src/opts/cprop.isle line 35. - let expr0_0 = C::u64_or( - ctx, - pattern10_0, - pattern15_0, - ); - let expr1_0 = C::imm64_masked( - ctx, pattern2_0, expr0_0, - ); - let expr2_0 = constructor_iconst( - ctx, pattern2_0, expr1_0, - ); - let expr3_0 = C::subsume(ctx, expr2_0); - returns.push(expr3_0); - } - } - } - } - } - } - } - } - } - &Opcode::Bxor => { - let (pattern5_0, pattern5_1) = C::unpack_value_array_2(ctx, pattern3_1); - if pattern5_1 == pattern5_0 { - // Rule at src/opts/algebraic.isle line 110. - let expr0_0: u64 = 0i128 as u64; - let expr1_0 = C::imm64(ctx, expr0_0); - let expr2_0 = constructor_iconst(ctx, pattern2_0, expr1_0); - let expr3_0 = C::subsume(ctx, expr2_0); - returns.push(expr3_0); - } - let mut iter = C::inst_data_etor(ctx, pattern5_0); - while let Some((pattern6_0, pattern6_1)) = iter.next(ctx) { - if pattern6_0 == pattern2_0 { - if let &InstructionData::UnaryImm { - opcode: ref pattern8_0, - imm: pattern8_1, - } = &pattern6_1 - { - if let &Opcode::Iconst = pattern8_0 { - let pattern10_0 = C::u64_from_imm64(ctx, pattern8_1); - let mut iter = C::inst_data_etor(ctx, pattern5_1); - while let Some((pattern11_0, pattern11_1)) = - iter.next(ctx) - { - if pattern11_0 == pattern2_0 { - if let &InstructionData::UnaryImm { - opcode: ref pattern13_0, - imm: pattern13_1, - } = &pattern11_1 - { - if let &Opcode::Iconst = pattern13_0 { - let pattern15_0 = - C::u64_from_imm64(ctx, pattern13_1); - // Rule at src/opts/cprop.isle line 47. - let expr0_0 = C::u64_xor( - ctx, - pattern10_0, - pattern15_0, - ); - let expr1_0 = C::imm64_masked( - ctx, pattern2_0, expr0_0, - ); - let expr2_0 = constructor_iconst( - ctx, pattern2_0, expr1_0, - ); - let expr3_0 = C::subsume(ctx, expr2_0); - returns.push(expr3_0); - } - } - } - } - } - } - } - } - } - _ => {} - } - } - _ => {} - } - } - if let Some(pattern2_0) = C::ty_int(ctx, pattern1_0) { - if let &InstructionData::IntCompare { - opcode: ref pattern3_0, - args: ref pattern3_1, - cond: ref pattern3_2, - } = &pattern1_1 - { - if let &Opcode::Icmp = pattern3_0 { - let (pattern5_0, pattern5_1) = C::unpack_value_array_2(ctx, pattern3_1); - if pattern5_1 == pattern5_0 { - match pattern3_2 { - &IntCC::Equal => { - // Rule at src/opts/algebraic.isle line 213. - let expr0_0: u64 = 1i128 as u64; - let expr1_0 = C::imm64(ctx, expr0_0); - let expr2_0 = constructor_iconst(ctx, pattern2_0, expr1_0); - returns.push(expr2_0); - } - &IntCC::NotEqual => { - // Rule at src/opts/algebraic.isle line 216. - let expr0_0: u64 = 0i128 as u64; - let expr1_0 = C::imm64(ctx, expr0_0); - let expr2_0 = constructor_iconst(ctx, pattern2_0, expr1_0); - returns.push(expr2_0); - } - &IntCC::SignedGreaterThan => { - // Rule at src/opts/algebraic.isle line 225. - let expr0_0: u64 = 0i128 as u64; - let expr1_0 = C::imm64(ctx, expr0_0); - let expr2_0 = constructor_iconst(ctx, pattern2_0, expr1_0); - returns.push(expr2_0); - } - &IntCC::SignedGreaterThanOrEqual => { - // Rule at src/opts/algebraic.isle line 228. - let expr0_0: u64 = 1i128 as u64; - let expr1_0 = C::imm64(ctx, expr0_0); - let expr2_0 = constructor_iconst(ctx, pattern2_0, expr1_0); - returns.push(expr2_0); - } - &IntCC::SignedLessThan => { - // Rule at src/opts/algebraic.isle line 237. - let expr0_0: u64 = 0i128 as u64; - let expr1_0 = C::imm64(ctx, expr0_0); - let expr2_0 = constructor_iconst(ctx, pattern2_0, expr1_0); - returns.push(expr2_0); - } - &IntCC::SignedLessThanOrEqual => { - // Rule at src/opts/algebraic.isle line 240. - let expr0_0: u64 = 1i128 as u64; - let expr1_0 = C::imm64(ctx, expr0_0); - let expr2_0 = constructor_iconst(ctx, pattern2_0, expr1_0); - returns.push(expr2_0); - } - &IntCC::UnsignedGreaterThan => { - // Rule at src/opts/algebraic.isle line 219. - let expr0_0: u64 = 0i128 as u64; - let expr1_0 = C::imm64(ctx, expr0_0); - let expr2_0 = constructor_iconst(ctx, pattern2_0, expr1_0); - returns.push(expr2_0); - } - &IntCC::UnsignedGreaterThanOrEqual => { - // Rule at src/opts/algebraic.isle line 222. - let expr0_0: u64 = 1i128 as u64; - let expr1_0 = C::imm64(ctx, expr0_0); - let expr2_0 = constructor_iconst(ctx, pattern2_0, expr1_0); - returns.push(expr2_0); - } - &IntCC::UnsignedLessThan => { - // Rule at src/opts/algebraic.isle line 231. - let expr0_0: u64 = 0i128 as u64; - let expr1_0 = C::imm64(ctx, expr0_0); - let expr2_0 = constructor_iconst(ctx, pattern2_0, expr1_0); - returns.push(expr2_0); - } - &IntCC::UnsignedLessThanOrEqual => { - // Rule at src/opts/algebraic.isle line 234. - let expr0_0: u64 = 1i128 as u64; - let expr1_0 = C::imm64(ctx, expr0_0); - let expr2_0 = constructor_iconst(ctx, pattern2_0, expr1_0); - returns.push(expr2_0); - } - _ => {} - } - } - } - } - } - } - return ContextIterWrapper::from(returns.into_iter()); -} - -// Generated as internal constructor for term br_table. -pub fn constructor_br_table( - ctx: &mut C, - arg0: Type, - arg1: Value, - arg2: Block, - arg3: JumpTable, -) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 348. - let expr0_0 = Opcode::BrTable; - let expr1_0 = InstructionData::BranchTable { - opcode: expr0_0, - arg: pattern1_0, - destination: pattern2_0, - table: pattern3_0, - }; - let expr2_0 = C::make_inst_ctor(ctx, pattern0_0, &expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term debugtrap. -pub fn constructor_debugtrap(ctx: &mut C, arg0: Type) -> Value { - let pattern0_0 = arg0; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 357. - let expr0_0 = Opcode::Debugtrap; - let expr1_0 = InstructionData::NullAry { opcode: expr0_0 }; - let expr2_0 = C::make_inst_ctor(ctx, pattern0_0, &expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term trap. -pub fn constructor_trap(ctx: &mut C, arg0: Type, arg1: &TrapCode) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 366. - let expr0_0 = Opcode::Trap; - let expr1_0 = InstructionData::Trap { - opcode: expr0_0, - code: pattern1_0.clone(), - }; - let expr2_0 = C::make_inst_ctor(ctx, pattern0_0, &expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term trapz. -pub fn constructor_trapz( - ctx: &mut C, - arg0: Type, - arg1: Value, - arg2: &TrapCode, -) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 375. - let expr0_0 = Opcode::Trapz; - let expr1_0 = InstructionData::CondTrap { - opcode: expr0_0, - arg: pattern1_0, - code: pattern2_0.clone(), - }; - let expr2_0 = C::make_inst_ctor(ctx, pattern0_0, &expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term resumable_trap. -pub fn constructor_resumable_trap(ctx: &mut C, arg0: Type, arg1: &TrapCode) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 384. - let expr0_0 = Opcode::ResumableTrap; - let expr1_0 = InstructionData::Trap { - opcode: expr0_0, - code: pattern1_0.clone(), - }; - let expr2_0 = C::make_inst_ctor(ctx, pattern0_0, &expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term trapnz. -pub fn constructor_trapnz( - ctx: &mut C, - arg0: Type, - arg1: Value, - arg2: &TrapCode, -) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 393. - let expr0_0 = Opcode::Trapnz; - let expr1_0 = InstructionData::CondTrap { - opcode: expr0_0, - arg: pattern1_0, - code: pattern2_0.clone(), - }; - let expr2_0 = C::make_inst_ctor(ctx, pattern0_0, &expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term resumable_trapnz. -pub fn constructor_resumable_trapnz( - ctx: &mut C, - arg0: Type, - arg1: Value, - arg2: &TrapCode, -) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 402. - let expr0_0 = Opcode::ResumableTrapnz; - let expr1_0 = InstructionData::CondTrap { - opcode: expr0_0, - arg: pattern1_0, - code: pattern2_0.clone(), - }; - let expr2_0 = C::make_inst_ctor(ctx, pattern0_0, &expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term func_addr. -pub fn constructor_func_addr(ctx: &mut C, arg0: Type, arg1: FuncRef) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 411. - let expr0_0 = Opcode::FuncAddr; - let expr1_0 = InstructionData::FuncAddr { - opcode: expr0_0, - func_ref: pattern1_0, - }; - let expr2_0 = C::make_inst_ctor(ctx, pattern0_0, &expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term splat. -pub fn constructor_splat(ctx: &mut C, arg0: Type, arg1: Value) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 420. - let expr0_0 = Opcode::Splat; - let expr1_0 = InstructionData::Unary { - opcode: expr0_0, - arg: pattern1_0, - }; - let expr2_0 = C::make_inst_ctor(ctx, pattern0_0, &expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term swizzle. -pub fn constructor_swizzle(ctx: &mut C, arg0: Type, arg1: Value, arg2: Value) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 429. - let expr0_0 = Opcode::Swizzle; - let expr1_0 = C::value_array_2_ctor(ctx, pattern1_0, pattern2_0); - let expr2_0 = InstructionData::Binary { - opcode: expr0_0, - args: expr1_0, - }; - let expr3_0 = C::make_inst_ctor(ctx, pattern0_0, &expr2_0); - return expr3_0; -} - -// Generated as internal constructor for term insertlane. -pub fn constructor_insertlane( - ctx: &mut C, - arg0: Type, - arg1: Value, - arg2: Value, - arg3: Uimm8, -) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 438. - let expr0_0 = Opcode::Insertlane; - let expr1_0 = C::value_array_2_ctor(ctx, pattern1_0, pattern2_0); - let expr2_0 = InstructionData::TernaryImm8 { - opcode: expr0_0, - args: expr1_0, - imm: pattern3_0, - }; - let expr3_0 = C::make_inst_ctor(ctx, pattern0_0, &expr2_0); - return expr3_0; -} - -// Generated as internal constructor for term extractlane. -pub fn constructor_extractlane( - ctx: &mut C, - arg0: Type, - arg1: Value, - arg2: Uimm8, -) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 447. - let expr0_0 = Opcode::Extractlane; - let expr1_0 = InstructionData::BinaryImm8 { - opcode: expr0_0, - arg: pattern1_0, - imm: pattern2_0, - }; - let expr2_0 = C::make_inst_ctor(ctx, pattern0_0, &expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term smin. -pub fn constructor_smin(ctx: &mut C, arg0: Type, arg1: Value, arg2: Value) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 456. - let expr0_0 = Opcode::Smin; - let expr1_0 = C::value_array_2_ctor(ctx, pattern1_0, pattern2_0); - let expr2_0 = InstructionData::Binary { - opcode: expr0_0, - args: expr1_0, - }; - let expr3_0 = C::make_inst_ctor(ctx, pattern0_0, &expr2_0); - return expr3_0; -} - -// Generated as internal constructor for term umin. -pub fn constructor_umin(ctx: &mut C, arg0: Type, arg1: Value, arg2: Value) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 465. - let expr0_0 = Opcode::Umin; - let expr1_0 = C::value_array_2_ctor(ctx, pattern1_0, pattern2_0); - let expr2_0 = InstructionData::Binary { - opcode: expr0_0, - args: expr1_0, - }; - let expr3_0 = C::make_inst_ctor(ctx, pattern0_0, &expr2_0); - return expr3_0; -} - -// Generated as internal constructor for term smax. -pub fn constructor_smax(ctx: &mut C, arg0: Type, arg1: Value, arg2: Value) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 474. - let expr0_0 = Opcode::Smax; - let expr1_0 = C::value_array_2_ctor(ctx, pattern1_0, pattern2_0); - let expr2_0 = InstructionData::Binary { - opcode: expr0_0, - args: expr1_0, - }; - let expr3_0 = C::make_inst_ctor(ctx, pattern0_0, &expr2_0); - return expr3_0; -} - -// Generated as internal constructor for term umax. -pub fn constructor_umax(ctx: &mut C, arg0: Type, arg1: Value, arg2: Value) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 483. - let expr0_0 = Opcode::Umax; - let expr1_0 = C::value_array_2_ctor(ctx, pattern1_0, pattern2_0); - let expr2_0 = InstructionData::Binary { - opcode: expr0_0, - args: expr1_0, - }; - let expr3_0 = C::make_inst_ctor(ctx, pattern0_0, &expr2_0); - return expr3_0; -} - -// Generated as internal constructor for term avg_round. -pub fn constructor_avg_round( - ctx: &mut C, - arg0: Type, - arg1: Value, - arg2: Value, -) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 492. - let expr0_0 = Opcode::AvgRound; - let expr1_0 = C::value_array_2_ctor(ctx, pattern1_0, pattern2_0); - let expr2_0 = InstructionData::Binary { - opcode: expr0_0, - args: expr1_0, - }; - let expr3_0 = C::make_inst_ctor(ctx, pattern0_0, &expr2_0); - return expr3_0; -} - -// Generated as internal constructor for term uadd_sat. -pub fn constructor_uadd_sat( - ctx: &mut C, - arg0: Type, - arg1: Value, - arg2: Value, -) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 501. - let expr0_0 = Opcode::UaddSat; - let expr1_0 = C::value_array_2_ctor(ctx, pattern1_0, pattern2_0); - let expr2_0 = InstructionData::Binary { - opcode: expr0_0, - args: expr1_0, - }; - let expr3_0 = C::make_inst_ctor(ctx, pattern0_0, &expr2_0); - return expr3_0; -} - -// Generated as internal constructor for term sadd_sat. -pub fn constructor_sadd_sat( - ctx: &mut C, - arg0: Type, - arg1: Value, - arg2: Value, -) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 510. - let expr0_0 = Opcode::SaddSat; - let expr1_0 = C::value_array_2_ctor(ctx, pattern1_0, pattern2_0); - let expr2_0 = InstructionData::Binary { - opcode: expr0_0, - args: expr1_0, - }; - let expr3_0 = C::make_inst_ctor(ctx, pattern0_0, &expr2_0); - return expr3_0; -} - -// Generated as internal constructor for term usub_sat. -pub fn constructor_usub_sat( - ctx: &mut C, - arg0: Type, - arg1: Value, - arg2: Value, -) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 519. - let expr0_0 = Opcode::UsubSat; - let expr1_0 = C::value_array_2_ctor(ctx, pattern1_0, pattern2_0); - let expr2_0 = InstructionData::Binary { - opcode: expr0_0, - args: expr1_0, - }; - let expr3_0 = C::make_inst_ctor(ctx, pattern0_0, &expr2_0); - return expr3_0; -} - -// Generated as internal constructor for term ssub_sat. -pub fn constructor_ssub_sat( - ctx: &mut C, - arg0: Type, - arg1: Value, - arg2: Value, -) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 528. - let expr0_0 = Opcode::SsubSat; - let expr1_0 = C::value_array_2_ctor(ctx, pattern1_0, pattern2_0); - let expr2_0 = InstructionData::Binary { - opcode: expr0_0, - args: expr1_0, - }; - let expr3_0 = C::make_inst_ctor(ctx, pattern0_0, &expr2_0); - return expr3_0; -} - -// Generated as internal constructor for term load. -pub fn constructor_load( - ctx: &mut C, - arg0: Type, - arg1: MemFlags, - arg2: Value, - arg3: Offset32, -) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 537. - let expr0_0 = Opcode::Load; - let expr1_0 = InstructionData::Load { - opcode: expr0_0, - arg: pattern2_0, - flags: pattern1_0, - offset: pattern3_0, - }; - let expr2_0 = C::make_inst_ctor(ctx, pattern0_0, &expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term store. -pub fn constructor_store( - ctx: &mut C, - arg0: Type, - arg1: MemFlags, - arg2: Value, - arg3: Value, - arg4: Offset32, -) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - let pattern4_0 = arg4; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 546. - let expr0_0 = Opcode::Store; - let expr1_0 = C::value_array_2_ctor(ctx, pattern2_0, pattern3_0); - let expr2_0 = InstructionData::Store { - opcode: expr0_0, - args: expr1_0, - flags: pattern1_0, - offset: pattern4_0, - }; - let expr3_0 = C::make_inst_ctor(ctx, pattern0_0, &expr2_0); - return expr3_0; -} - -// Generated as internal constructor for term uload8. -pub fn constructor_uload8( - ctx: &mut C, - arg0: Type, - arg1: MemFlags, - arg2: Value, - arg3: Offset32, -) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 555. - let expr0_0 = Opcode::Uload8; - let expr1_0 = InstructionData::Load { - opcode: expr0_0, - arg: pattern2_0, - flags: pattern1_0, - offset: pattern3_0, - }; - let expr2_0 = C::make_inst_ctor(ctx, pattern0_0, &expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term sload8. -pub fn constructor_sload8( - ctx: &mut C, - arg0: Type, - arg1: MemFlags, - arg2: Value, - arg3: Offset32, -) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 564. - let expr0_0 = Opcode::Sload8; - let expr1_0 = InstructionData::Load { - opcode: expr0_0, - arg: pattern2_0, - flags: pattern1_0, - offset: pattern3_0, - }; - let expr2_0 = C::make_inst_ctor(ctx, pattern0_0, &expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term istore8. -pub fn constructor_istore8( - ctx: &mut C, - arg0: Type, - arg1: MemFlags, - arg2: Value, - arg3: Value, - arg4: Offset32, -) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - let pattern4_0 = arg4; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 573. - let expr0_0 = Opcode::Istore8; - let expr1_0 = C::value_array_2_ctor(ctx, pattern2_0, pattern3_0); - let expr2_0 = InstructionData::Store { - opcode: expr0_0, - args: expr1_0, - flags: pattern1_0, - offset: pattern4_0, - }; - let expr3_0 = C::make_inst_ctor(ctx, pattern0_0, &expr2_0); - return expr3_0; -} - -// Generated as internal constructor for term uload16. -pub fn constructor_uload16( - ctx: &mut C, - arg0: Type, - arg1: MemFlags, - arg2: Value, - arg3: Offset32, -) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 582. - let expr0_0 = Opcode::Uload16; - let expr1_0 = InstructionData::Load { - opcode: expr0_0, - arg: pattern2_0, - flags: pattern1_0, - offset: pattern3_0, - }; - let expr2_0 = C::make_inst_ctor(ctx, pattern0_0, &expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term sload16. -pub fn constructor_sload16( - ctx: &mut C, - arg0: Type, - arg1: MemFlags, - arg2: Value, - arg3: Offset32, -) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 591. - let expr0_0 = Opcode::Sload16; - let expr1_0 = InstructionData::Load { - opcode: expr0_0, - arg: pattern2_0, - flags: pattern1_0, - offset: pattern3_0, - }; - let expr2_0 = C::make_inst_ctor(ctx, pattern0_0, &expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term istore16. -pub fn constructor_istore16( - ctx: &mut C, - arg0: Type, - arg1: MemFlags, - arg2: Value, - arg3: Value, - arg4: Offset32, -) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - let pattern4_0 = arg4; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 600. - let expr0_0 = Opcode::Istore16; - let expr1_0 = C::value_array_2_ctor(ctx, pattern2_0, pattern3_0); - let expr2_0 = InstructionData::Store { - opcode: expr0_0, - args: expr1_0, - flags: pattern1_0, - offset: pattern4_0, - }; - let expr3_0 = C::make_inst_ctor(ctx, pattern0_0, &expr2_0); - return expr3_0; -} - -// Generated as internal constructor for term uload32. -pub fn constructor_uload32( - ctx: &mut C, - arg0: Type, - arg1: MemFlags, - arg2: Value, - arg3: Offset32, -) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 609. - let expr0_0 = Opcode::Uload32; - let expr1_0 = InstructionData::Load { - opcode: expr0_0, - arg: pattern2_0, - flags: pattern1_0, - offset: pattern3_0, - }; - let expr2_0 = C::make_inst_ctor(ctx, pattern0_0, &expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term sload32. -pub fn constructor_sload32( - ctx: &mut C, - arg0: Type, - arg1: MemFlags, - arg2: Value, - arg3: Offset32, -) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 618. - let expr0_0 = Opcode::Sload32; - let expr1_0 = InstructionData::Load { - opcode: expr0_0, - arg: pattern2_0, - flags: pattern1_0, - offset: pattern3_0, - }; - let expr2_0 = C::make_inst_ctor(ctx, pattern0_0, &expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term istore32. -pub fn constructor_istore32( - ctx: &mut C, - arg0: Type, - arg1: MemFlags, - arg2: Value, - arg3: Value, - arg4: Offset32, -) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - let pattern4_0 = arg4; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 627. - let expr0_0 = Opcode::Istore32; - let expr1_0 = C::value_array_2_ctor(ctx, pattern2_0, pattern3_0); - let expr2_0 = InstructionData::Store { - opcode: expr0_0, - args: expr1_0, - flags: pattern1_0, - offset: pattern4_0, - }; - let expr3_0 = C::make_inst_ctor(ctx, pattern0_0, &expr2_0); - return expr3_0; -} - -// Generated as internal constructor for term uload8x8. -pub fn constructor_uload8x8( - ctx: &mut C, - arg0: Type, - arg1: MemFlags, - arg2: Value, - arg3: Offset32, -) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 636. - let expr0_0 = Opcode::Uload8x8; - let expr1_0 = InstructionData::Load { - opcode: expr0_0, - arg: pattern2_0, - flags: pattern1_0, - offset: pattern3_0, - }; - let expr2_0 = C::make_inst_ctor(ctx, pattern0_0, &expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term sload8x8. -pub fn constructor_sload8x8( - ctx: &mut C, - arg0: Type, - arg1: MemFlags, - arg2: Value, - arg3: Offset32, -) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 645. - let expr0_0 = Opcode::Sload8x8; - let expr1_0 = InstructionData::Load { - opcode: expr0_0, - arg: pattern2_0, - flags: pattern1_0, - offset: pattern3_0, - }; - let expr2_0 = C::make_inst_ctor(ctx, pattern0_0, &expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term uload16x4. -pub fn constructor_uload16x4( - ctx: &mut C, - arg0: Type, - arg1: MemFlags, - arg2: Value, - arg3: Offset32, -) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 654. - let expr0_0 = Opcode::Uload16x4; - let expr1_0 = InstructionData::Load { - opcode: expr0_0, - arg: pattern2_0, - flags: pattern1_0, - offset: pattern3_0, - }; - let expr2_0 = C::make_inst_ctor(ctx, pattern0_0, &expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term sload16x4. -pub fn constructor_sload16x4( - ctx: &mut C, - arg0: Type, - arg1: MemFlags, - arg2: Value, - arg3: Offset32, -) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 663. - let expr0_0 = Opcode::Sload16x4; - let expr1_0 = InstructionData::Load { - opcode: expr0_0, - arg: pattern2_0, - flags: pattern1_0, - offset: pattern3_0, - }; - let expr2_0 = C::make_inst_ctor(ctx, pattern0_0, &expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term uload32x2. -pub fn constructor_uload32x2( - ctx: &mut C, - arg0: Type, - arg1: MemFlags, - arg2: Value, - arg3: Offset32, -) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 672. - let expr0_0 = Opcode::Uload32x2; - let expr1_0 = InstructionData::Load { - opcode: expr0_0, - arg: pattern2_0, - flags: pattern1_0, - offset: pattern3_0, - }; - let expr2_0 = C::make_inst_ctor(ctx, pattern0_0, &expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term sload32x2. -pub fn constructor_sload32x2( - ctx: &mut C, - arg0: Type, - arg1: MemFlags, - arg2: Value, - arg3: Offset32, -) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 681. - let expr0_0 = Opcode::Sload32x2; - let expr1_0 = InstructionData::Load { - opcode: expr0_0, - arg: pattern2_0, - flags: pattern1_0, - offset: pattern3_0, - }; - let expr2_0 = C::make_inst_ctor(ctx, pattern0_0, &expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term stack_load. -pub fn constructor_stack_load( - ctx: &mut C, - arg0: Type, - arg1: StackSlot, - arg2: Offset32, -) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 690. - let expr0_0 = Opcode::StackLoad; - let expr1_0 = InstructionData::StackLoad { - opcode: expr0_0, - stack_slot: pattern1_0, - offset: pattern2_0, - }; - let expr2_0 = C::make_inst_ctor(ctx, pattern0_0, &expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term stack_store. -pub fn constructor_stack_store( - ctx: &mut C, - arg0: Type, - arg1: Value, - arg2: StackSlot, - arg3: Offset32, -) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 699. - let expr0_0 = Opcode::StackStore; - let expr1_0 = InstructionData::StackStore { - opcode: expr0_0, - arg: pattern1_0, - stack_slot: pattern2_0, - offset: pattern3_0, - }; - let expr2_0 = C::make_inst_ctor(ctx, pattern0_0, &expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term stack_addr. -pub fn constructor_stack_addr( - ctx: &mut C, - arg0: Type, - arg1: StackSlot, - arg2: Offset32, -) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 708. - let expr0_0 = Opcode::StackAddr; - let expr1_0 = InstructionData::StackLoad { - opcode: expr0_0, - stack_slot: pattern1_0, - offset: pattern2_0, - }; - let expr2_0 = C::make_inst_ctor(ctx, pattern0_0, &expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term dynamic_stack_load. -pub fn constructor_dynamic_stack_load( - ctx: &mut C, - arg0: Type, - arg1: DynamicStackSlot, -) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 717. - let expr0_0 = Opcode::DynamicStackLoad; - let expr1_0 = InstructionData::DynamicStackLoad { - opcode: expr0_0, - dynamic_stack_slot: pattern1_0, - }; - let expr2_0 = C::make_inst_ctor(ctx, pattern0_0, &expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term dynamic_stack_store. -pub fn constructor_dynamic_stack_store( - ctx: &mut C, - arg0: Type, - arg1: Value, - arg2: DynamicStackSlot, -) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 726. - let expr0_0 = Opcode::DynamicStackStore; - let expr1_0 = InstructionData::DynamicStackStore { - opcode: expr0_0, - arg: pattern1_0, - dynamic_stack_slot: pattern2_0, - }; - let expr2_0 = C::make_inst_ctor(ctx, pattern0_0, &expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term dynamic_stack_addr. -pub fn constructor_dynamic_stack_addr( - ctx: &mut C, - arg0: Type, - arg1: DynamicStackSlot, -) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 735. - let expr0_0 = Opcode::DynamicStackAddr; - let expr1_0 = InstructionData::DynamicStackLoad { - opcode: expr0_0, - dynamic_stack_slot: pattern1_0, - }; - let expr2_0 = C::make_inst_ctor(ctx, pattern0_0, &expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term global_value. -pub fn constructor_global_value(ctx: &mut C, arg0: Type, arg1: GlobalValue) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 744. - let expr0_0 = Opcode::GlobalValue; - let expr1_0 = InstructionData::UnaryGlobalValue { - opcode: expr0_0, - global_value: pattern1_0, - }; - let expr2_0 = C::make_inst_ctor(ctx, pattern0_0, &expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term symbol_value. -pub fn constructor_symbol_value(ctx: &mut C, arg0: Type, arg1: GlobalValue) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 753. - let expr0_0 = Opcode::SymbolValue; - let expr1_0 = InstructionData::UnaryGlobalValue { - opcode: expr0_0, - global_value: pattern1_0, - }; - let expr2_0 = C::make_inst_ctor(ctx, pattern0_0, &expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term tls_value. -pub fn constructor_tls_value(ctx: &mut C, arg0: Type, arg1: GlobalValue) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 762. - let expr0_0 = Opcode::TlsValue; - let expr1_0 = InstructionData::UnaryGlobalValue { - opcode: expr0_0, - global_value: pattern1_0, - }; - let expr2_0 = C::make_inst_ctor(ctx, pattern0_0, &expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term get_pinned_reg. -pub fn constructor_get_pinned_reg(ctx: &mut C, arg0: Type) -> Value { - let pattern0_0 = arg0; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 771. - let expr0_0 = Opcode::GetPinnedReg; - let expr1_0 = InstructionData::NullAry { opcode: expr0_0 }; - let expr2_0 = C::make_inst_ctor(ctx, pattern0_0, &expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term set_pinned_reg. -pub fn constructor_set_pinned_reg(ctx: &mut C, arg0: Type, arg1: Value) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 780. - let expr0_0 = Opcode::SetPinnedReg; - let expr1_0 = InstructionData::Unary { - opcode: expr0_0, - arg: pattern1_0, - }; - let expr2_0 = C::make_inst_ctor(ctx, pattern0_0, &expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term get_frame_pointer. -pub fn constructor_get_frame_pointer(ctx: &mut C, arg0: Type) -> Value { - let pattern0_0 = arg0; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 789. - let expr0_0 = Opcode::GetFramePointer; - let expr1_0 = InstructionData::NullAry { opcode: expr0_0 }; - let expr2_0 = C::make_inst_ctor(ctx, pattern0_0, &expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term get_stack_pointer. -pub fn constructor_get_stack_pointer(ctx: &mut C, arg0: Type) -> Value { - let pattern0_0 = arg0; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 798. - let expr0_0 = Opcode::GetStackPointer; - let expr1_0 = InstructionData::NullAry { opcode: expr0_0 }; - let expr2_0 = C::make_inst_ctor(ctx, pattern0_0, &expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term get_return_address. -pub fn constructor_get_return_address(ctx: &mut C, arg0: Type) -> Value { - let pattern0_0 = arg0; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 807. - let expr0_0 = Opcode::GetReturnAddress; - let expr1_0 = InstructionData::NullAry { opcode: expr0_0 }; - let expr2_0 = C::make_inst_ctor(ctx, pattern0_0, &expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term table_addr. -pub fn constructor_table_addr( - ctx: &mut C, - arg0: Type, - arg1: Table, - arg2: Value, - arg3: Offset32, -) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 816. - let expr0_0 = Opcode::TableAddr; - let expr1_0 = InstructionData::TableAddr { - opcode: expr0_0, - arg: pattern2_0, - table: pattern1_0, - offset: pattern3_0, - }; - let expr2_0 = C::make_inst_ctor(ctx, pattern0_0, &expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term iconst. -pub fn constructor_iconst(ctx: &mut C, arg0: Type, arg1: Imm64) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 825. - let expr0_0 = Opcode::Iconst; - let expr1_0 = InstructionData::UnaryImm { - opcode: expr0_0, - imm: pattern1_0, - }; - let expr2_0 = C::make_inst_ctor(ctx, pattern0_0, &expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term f32const. -pub fn constructor_f32const(ctx: &mut C, arg0: Type, arg1: Ieee32) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 834. - let expr0_0 = Opcode::F32const; - let expr1_0 = InstructionData::UnaryIeee32 { - opcode: expr0_0, - imm: pattern1_0, - }; - let expr2_0 = C::make_inst_ctor(ctx, pattern0_0, &expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term f64const. -pub fn constructor_f64const(ctx: &mut C, arg0: Type, arg1: Ieee64) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 843. - let expr0_0 = Opcode::F64const; - let expr1_0 = InstructionData::UnaryIeee64 { - opcode: expr0_0, - imm: pattern1_0, - }; - let expr2_0 = C::make_inst_ctor(ctx, pattern0_0, &expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term vconst. -pub fn constructor_vconst(ctx: &mut C, arg0: Type, arg1: Constant) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 852. - let expr0_0 = Opcode::Vconst; - let expr1_0 = InstructionData::UnaryConst { - opcode: expr0_0, - constant_handle: pattern1_0, - }; - let expr2_0 = C::make_inst_ctor(ctx, pattern0_0, &expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term shuffle. -pub fn constructor_shuffle( - ctx: &mut C, - arg0: Type, - arg1: Value, - arg2: Value, - arg3: Immediate, -) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 861. - let expr0_0 = Opcode::Shuffle; - let expr1_0 = C::value_array_2_ctor(ctx, pattern1_0, pattern2_0); - let expr2_0 = InstructionData::Shuffle { - opcode: expr0_0, - args: expr1_0, - imm: pattern3_0, - }; - let expr3_0 = C::make_inst_ctor(ctx, pattern0_0, &expr2_0); - return expr3_0; -} - -// Generated as internal constructor for term null. -pub fn constructor_null(ctx: &mut C, arg0: Type) -> Value { - let pattern0_0 = arg0; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 870. - let expr0_0 = Opcode::Null; - let expr1_0 = InstructionData::NullAry { opcode: expr0_0 }; - let expr2_0 = C::make_inst_ctor(ctx, pattern0_0, &expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term nop. -pub fn constructor_nop(ctx: &mut C, arg0: Type) -> Value { - let pattern0_0 = arg0; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 879. - let expr0_0 = Opcode::Nop; - let expr1_0 = InstructionData::NullAry { opcode: expr0_0 }; - let expr2_0 = C::make_inst_ctor(ctx, pattern0_0, &expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term select. -pub fn constructor_select( - ctx: &mut C, - arg0: Type, - arg1: Value, - arg2: Value, - arg3: Value, -) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 888. - let expr0_0 = Opcode::Select; - let expr1_0 = C::value_array_3_ctor(ctx, pattern1_0, pattern2_0, pattern3_0); - let expr2_0 = InstructionData::Ternary { - opcode: expr0_0, - args: expr1_0, - }; - let expr3_0 = C::make_inst_ctor(ctx, pattern0_0, &expr2_0); - return expr3_0; -} - -// Generated as internal constructor for term select_spectre_guard. -pub fn constructor_select_spectre_guard( - ctx: &mut C, - arg0: Type, - arg1: Value, - arg2: Value, - arg3: Value, -) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 897. - let expr0_0 = Opcode::SelectSpectreGuard; - let expr1_0 = C::value_array_3_ctor(ctx, pattern1_0, pattern2_0, pattern3_0); - let expr2_0 = InstructionData::Ternary { - opcode: expr0_0, - args: expr1_0, - }; - let expr3_0 = C::make_inst_ctor(ctx, pattern0_0, &expr2_0); - return expr3_0; -} - -// Generated as internal constructor for term bitselect. -pub fn constructor_bitselect( - ctx: &mut C, - arg0: Type, - arg1: Value, - arg2: Value, - arg3: Value, -) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 906. - let expr0_0 = Opcode::Bitselect; - let expr1_0 = C::value_array_3_ctor(ctx, pattern1_0, pattern2_0, pattern3_0); - let expr2_0 = InstructionData::Ternary { - opcode: expr0_0, - args: expr1_0, - }; - let expr3_0 = C::make_inst_ctor(ctx, pattern0_0, &expr2_0); - return expr3_0; -} - -// Generated as internal constructor for term vselect. -pub fn constructor_vselect( - ctx: &mut C, - arg0: Type, - arg1: Value, - arg2: Value, - arg3: Value, -) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 915. - let expr0_0 = Opcode::Vselect; - let expr1_0 = C::value_array_3_ctor(ctx, pattern1_0, pattern2_0, pattern3_0); - let expr2_0 = InstructionData::Ternary { - opcode: expr0_0, - args: expr1_0, - }; - let expr3_0 = C::make_inst_ctor(ctx, pattern0_0, &expr2_0); - return expr3_0; -} - -// Generated as internal constructor for term vany_true. -pub fn constructor_vany_true(ctx: &mut C, arg0: Type, arg1: Value) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 924. - let expr0_0 = Opcode::VanyTrue; - let expr1_0 = InstructionData::Unary { - opcode: expr0_0, - arg: pattern1_0, - }; - let expr2_0 = C::make_inst_ctor(ctx, pattern0_0, &expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term vall_true. -pub fn constructor_vall_true(ctx: &mut C, arg0: Type, arg1: Value) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 933. - let expr0_0 = Opcode::VallTrue; - let expr1_0 = InstructionData::Unary { - opcode: expr0_0, - arg: pattern1_0, - }; - let expr2_0 = C::make_inst_ctor(ctx, pattern0_0, &expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term vhigh_bits. -pub fn constructor_vhigh_bits(ctx: &mut C, arg0: Type, arg1: Value) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 942. - let expr0_0 = Opcode::VhighBits; - let expr1_0 = InstructionData::Unary { - opcode: expr0_0, - arg: pattern1_0, - }; - let expr2_0 = C::make_inst_ctor(ctx, pattern0_0, &expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term icmp. -pub fn constructor_icmp( - ctx: &mut C, - arg0: Type, - arg1: &IntCC, - arg2: Value, - arg3: Value, -) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 951. - let expr0_0 = Opcode::Icmp; - let expr1_0 = C::value_array_2_ctor(ctx, pattern2_0, pattern3_0); - let expr2_0 = InstructionData::IntCompare { - opcode: expr0_0, - args: expr1_0, - cond: pattern1_0.clone(), - }; - let expr3_0 = C::make_inst_ctor(ctx, pattern0_0, &expr2_0); - return expr3_0; -} - -// Generated as internal constructor for term icmp_imm. -pub fn constructor_icmp_imm( - ctx: &mut C, - arg0: Type, - arg1: &IntCC, - arg2: Value, - arg3: Imm64, -) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 960. - let expr0_0 = Opcode::IcmpImm; - let expr1_0 = InstructionData::IntCompareImm { - opcode: expr0_0, - arg: pattern2_0, - cond: pattern1_0.clone(), - imm: pattern3_0, - }; - let expr2_0 = C::make_inst_ctor(ctx, pattern0_0, &expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term iadd. -pub fn constructor_iadd(ctx: &mut C, arg0: Type, arg1: Value, arg2: Value) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 969. - let expr0_0 = Opcode::Iadd; - let expr1_0 = C::value_array_2_ctor(ctx, pattern1_0, pattern2_0); - let expr2_0 = InstructionData::Binary { - opcode: expr0_0, - args: expr1_0, - }; - let expr3_0 = C::make_inst_ctor(ctx, pattern0_0, &expr2_0); - return expr3_0; -} - -// Generated as internal constructor for term isub. -pub fn constructor_isub(ctx: &mut C, arg0: Type, arg1: Value, arg2: Value) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 978. - let expr0_0 = Opcode::Isub; - let expr1_0 = C::value_array_2_ctor(ctx, pattern1_0, pattern2_0); - let expr2_0 = InstructionData::Binary { - opcode: expr0_0, - args: expr1_0, - }; - let expr3_0 = C::make_inst_ctor(ctx, pattern0_0, &expr2_0); - return expr3_0; -} - -// Generated as internal constructor for term ineg. -pub fn constructor_ineg(ctx: &mut C, arg0: Type, arg1: Value) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 987. - let expr0_0 = Opcode::Ineg; - let expr1_0 = InstructionData::Unary { - opcode: expr0_0, - arg: pattern1_0, - }; - let expr2_0 = C::make_inst_ctor(ctx, pattern0_0, &expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term iabs. -pub fn constructor_iabs(ctx: &mut C, arg0: Type, arg1: Value) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 996. - let expr0_0 = Opcode::Iabs; - let expr1_0 = InstructionData::Unary { - opcode: expr0_0, - arg: pattern1_0, - }; - let expr2_0 = C::make_inst_ctor(ctx, pattern0_0, &expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term imul. -pub fn constructor_imul(ctx: &mut C, arg0: Type, arg1: Value, arg2: Value) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 1005. - let expr0_0 = Opcode::Imul; - let expr1_0 = C::value_array_2_ctor(ctx, pattern1_0, pattern2_0); - let expr2_0 = InstructionData::Binary { - opcode: expr0_0, - args: expr1_0, - }; - let expr3_0 = C::make_inst_ctor(ctx, pattern0_0, &expr2_0); - return expr3_0; -} - -// Generated as internal constructor for term umulhi. -pub fn constructor_umulhi(ctx: &mut C, arg0: Type, arg1: Value, arg2: Value) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 1014. - let expr0_0 = Opcode::Umulhi; - let expr1_0 = C::value_array_2_ctor(ctx, pattern1_0, pattern2_0); - let expr2_0 = InstructionData::Binary { - opcode: expr0_0, - args: expr1_0, - }; - let expr3_0 = C::make_inst_ctor(ctx, pattern0_0, &expr2_0); - return expr3_0; -} - -// Generated as internal constructor for term smulhi. -pub fn constructor_smulhi(ctx: &mut C, arg0: Type, arg1: Value, arg2: Value) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 1023. - let expr0_0 = Opcode::Smulhi; - let expr1_0 = C::value_array_2_ctor(ctx, pattern1_0, pattern2_0); - let expr2_0 = InstructionData::Binary { - opcode: expr0_0, - args: expr1_0, - }; - let expr3_0 = C::make_inst_ctor(ctx, pattern0_0, &expr2_0); - return expr3_0; -} - -// Generated as internal constructor for term sqmul_round_sat. -pub fn constructor_sqmul_round_sat( - ctx: &mut C, - arg0: Type, - arg1: Value, - arg2: Value, -) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 1032. - let expr0_0 = Opcode::SqmulRoundSat; - let expr1_0 = C::value_array_2_ctor(ctx, pattern1_0, pattern2_0); - let expr2_0 = InstructionData::Binary { - opcode: expr0_0, - args: expr1_0, - }; - let expr3_0 = C::make_inst_ctor(ctx, pattern0_0, &expr2_0); - return expr3_0; -} - -// Generated as internal constructor for term udiv. -pub fn constructor_udiv(ctx: &mut C, arg0: Type, arg1: Value, arg2: Value) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 1041. - let expr0_0 = Opcode::Udiv; - let expr1_0 = C::value_array_2_ctor(ctx, pattern1_0, pattern2_0); - let expr2_0 = InstructionData::Binary { - opcode: expr0_0, - args: expr1_0, - }; - let expr3_0 = C::make_inst_ctor(ctx, pattern0_0, &expr2_0); - return expr3_0; -} - -// Generated as internal constructor for term sdiv. -pub fn constructor_sdiv(ctx: &mut C, arg0: Type, arg1: Value, arg2: Value) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 1050. - let expr0_0 = Opcode::Sdiv; - let expr1_0 = C::value_array_2_ctor(ctx, pattern1_0, pattern2_0); - let expr2_0 = InstructionData::Binary { - opcode: expr0_0, - args: expr1_0, - }; - let expr3_0 = C::make_inst_ctor(ctx, pattern0_0, &expr2_0); - return expr3_0; -} - -// Generated as internal constructor for term urem. -pub fn constructor_urem(ctx: &mut C, arg0: Type, arg1: Value, arg2: Value) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 1059. - let expr0_0 = Opcode::Urem; - let expr1_0 = C::value_array_2_ctor(ctx, pattern1_0, pattern2_0); - let expr2_0 = InstructionData::Binary { - opcode: expr0_0, - args: expr1_0, - }; - let expr3_0 = C::make_inst_ctor(ctx, pattern0_0, &expr2_0); - return expr3_0; -} - -// Generated as internal constructor for term srem. -pub fn constructor_srem(ctx: &mut C, arg0: Type, arg1: Value, arg2: Value) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 1068. - let expr0_0 = Opcode::Srem; - let expr1_0 = C::value_array_2_ctor(ctx, pattern1_0, pattern2_0); - let expr2_0 = InstructionData::Binary { - opcode: expr0_0, - args: expr1_0, - }; - let expr3_0 = C::make_inst_ctor(ctx, pattern0_0, &expr2_0); - return expr3_0; -} - -// Generated as internal constructor for term iadd_imm. -pub fn constructor_iadd_imm( - ctx: &mut C, - arg0: Type, - arg1: Value, - arg2: Imm64, -) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 1077. - let expr0_0 = Opcode::IaddImm; - let expr1_0 = InstructionData::BinaryImm64 { - opcode: expr0_0, - arg: pattern1_0, - imm: pattern2_0, - }; - let expr2_0 = C::make_inst_ctor(ctx, pattern0_0, &expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term imul_imm. -pub fn constructor_imul_imm( - ctx: &mut C, - arg0: Type, - arg1: Value, - arg2: Imm64, -) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 1086. - let expr0_0 = Opcode::ImulImm; - let expr1_0 = InstructionData::BinaryImm64 { - opcode: expr0_0, - arg: pattern1_0, - imm: pattern2_0, - }; - let expr2_0 = C::make_inst_ctor(ctx, pattern0_0, &expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term udiv_imm. -pub fn constructor_udiv_imm( - ctx: &mut C, - arg0: Type, - arg1: Value, - arg2: Imm64, -) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 1095. - let expr0_0 = Opcode::UdivImm; - let expr1_0 = InstructionData::BinaryImm64 { - opcode: expr0_0, - arg: pattern1_0, - imm: pattern2_0, - }; - let expr2_0 = C::make_inst_ctor(ctx, pattern0_0, &expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term sdiv_imm. -pub fn constructor_sdiv_imm( - ctx: &mut C, - arg0: Type, - arg1: Value, - arg2: Imm64, -) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 1104. - let expr0_0 = Opcode::SdivImm; - let expr1_0 = InstructionData::BinaryImm64 { - opcode: expr0_0, - arg: pattern1_0, - imm: pattern2_0, - }; - let expr2_0 = C::make_inst_ctor(ctx, pattern0_0, &expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term urem_imm. -pub fn constructor_urem_imm( - ctx: &mut C, - arg0: Type, - arg1: Value, - arg2: Imm64, -) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 1113. - let expr0_0 = Opcode::UremImm; - let expr1_0 = InstructionData::BinaryImm64 { - opcode: expr0_0, - arg: pattern1_0, - imm: pattern2_0, - }; - let expr2_0 = C::make_inst_ctor(ctx, pattern0_0, &expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term srem_imm. -pub fn constructor_srem_imm( - ctx: &mut C, - arg0: Type, - arg1: Value, - arg2: Imm64, -) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 1122. - let expr0_0 = Opcode::SremImm; - let expr1_0 = InstructionData::BinaryImm64 { - opcode: expr0_0, - arg: pattern1_0, - imm: pattern2_0, - }; - let expr2_0 = C::make_inst_ctor(ctx, pattern0_0, &expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term irsub_imm. -pub fn constructor_irsub_imm( - ctx: &mut C, - arg0: Type, - arg1: Value, - arg2: Imm64, -) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 1131. - let expr0_0 = Opcode::IrsubImm; - let expr1_0 = InstructionData::BinaryImm64 { - opcode: expr0_0, - arg: pattern1_0, - imm: pattern2_0, - }; - let expr2_0 = C::make_inst_ctor(ctx, pattern0_0, &expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term iadd_cin. -pub fn constructor_iadd_cin( - ctx: &mut C, - arg0: Type, - arg1: Value, - arg2: Value, - arg3: Value, -) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 1140. - let expr0_0 = Opcode::IaddCin; - let expr1_0 = C::value_array_3_ctor(ctx, pattern1_0, pattern2_0, pattern3_0); - let expr2_0 = InstructionData::Ternary { - opcode: expr0_0, - args: expr1_0, - }; - let expr3_0 = C::make_inst_ctor(ctx, pattern0_0, &expr2_0); - return expr3_0; -} - -// Generated as internal constructor for term iadd_cout. -pub fn constructor_iadd_cout( - ctx: &mut C, - arg0: Type, - arg1: Value, - arg2: Value, -) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 1149. - let expr0_0 = Opcode::IaddCout; - let expr1_0 = C::value_array_2_ctor(ctx, pattern1_0, pattern2_0); - let expr2_0 = InstructionData::Binary { - opcode: expr0_0, - args: expr1_0, - }; - let expr3_0 = C::make_inst_ctor(ctx, pattern0_0, &expr2_0); - return expr3_0; -} - -// Generated as internal constructor for term iadd_carry. -pub fn constructor_iadd_carry( - ctx: &mut C, - arg0: Type, - arg1: Value, - arg2: Value, - arg3: Value, -) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 1158. - let expr0_0 = Opcode::IaddCarry; - let expr1_0 = C::value_array_3_ctor(ctx, pattern1_0, pattern2_0, pattern3_0); - let expr2_0 = InstructionData::Ternary { - opcode: expr0_0, - args: expr1_0, - }; - let expr3_0 = C::make_inst_ctor(ctx, pattern0_0, &expr2_0); - return expr3_0; -} - -// Generated as internal constructor for term uadd_overflow_trap. -pub fn constructor_uadd_overflow_trap( - ctx: &mut C, - arg0: Type, - arg1: Value, - arg2: Value, - arg3: &TrapCode, -) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 1167. - let expr0_0 = Opcode::UaddOverflowTrap; - let expr1_0 = C::value_array_2_ctor(ctx, pattern1_0, pattern2_0); - let expr2_0 = InstructionData::IntAddTrap { - opcode: expr0_0, - args: expr1_0, - code: pattern3_0.clone(), - }; - let expr3_0 = C::make_inst_ctor(ctx, pattern0_0, &expr2_0); - return expr3_0; -} - -// Generated as internal constructor for term isub_bin. -pub fn constructor_isub_bin( - ctx: &mut C, - arg0: Type, - arg1: Value, - arg2: Value, - arg3: Value, -) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 1176. - let expr0_0 = Opcode::IsubBin; - let expr1_0 = C::value_array_3_ctor(ctx, pattern1_0, pattern2_0, pattern3_0); - let expr2_0 = InstructionData::Ternary { - opcode: expr0_0, - args: expr1_0, - }; - let expr3_0 = C::make_inst_ctor(ctx, pattern0_0, &expr2_0); - return expr3_0; -} - -// Generated as internal constructor for term isub_bout. -pub fn constructor_isub_bout( - ctx: &mut C, - arg0: Type, - arg1: Value, - arg2: Value, -) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 1185. - let expr0_0 = Opcode::IsubBout; - let expr1_0 = C::value_array_2_ctor(ctx, pattern1_0, pattern2_0); - let expr2_0 = InstructionData::Binary { - opcode: expr0_0, - args: expr1_0, - }; - let expr3_0 = C::make_inst_ctor(ctx, pattern0_0, &expr2_0); - return expr3_0; -} - -// Generated as internal constructor for term isub_borrow. -pub fn constructor_isub_borrow( - ctx: &mut C, - arg0: Type, - arg1: Value, - arg2: Value, - arg3: Value, -) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 1194. - let expr0_0 = Opcode::IsubBorrow; - let expr1_0 = C::value_array_3_ctor(ctx, pattern1_0, pattern2_0, pattern3_0); - let expr2_0 = InstructionData::Ternary { - opcode: expr0_0, - args: expr1_0, - }; - let expr3_0 = C::make_inst_ctor(ctx, pattern0_0, &expr2_0); - return expr3_0; -} - -// Generated as internal constructor for term band. -pub fn constructor_band(ctx: &mut C, arg0: Type, arg1: Value, arg2: Value) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 1203. - let expr0_0 = Opcode::Band; - let expr1_0 = C::value_array_2_ctor(ctx, pattern1_0, pattern2_0); - let expr2_0 = InstructionData::Binary { - opcode: expr0_0, - args: expr1_0, - }; - let expr3_0 = C::make_inst_ctor(ctx, pattern0_0, &expr2_0); - return expr3_0; -} - -// Generated as internal constructor for term bor. -pub fn constructor_bor(ctx: &mut C, arg0: Type, arg1: Value, arg2: Value) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 1212. - let expr0_0 = Opcode::Bor; - let expr1_0 = C::value_array_2_ctor(ctx, pattern1_0, pattern2_0); - let expr2_0 = InstructionData::Binary { - opcode: expr0_0, - args: expr1_0, - }; - let expr3_0 = C::make_inst_ctor(ctx, pattern0_0, &expr2_0); - return expr3_0; -} - -// Generated as internal constructor for term bxor. -pub fn constructor_bxor(ctx: &mut C, arg0: Type, arg1: Value, arg2: Value) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 1221. - let expr0_0 = Opcode::Bxor; - let expr1_0 = C::value_array_2_ctor(ctx, pattern1_0, pattern2_0); - let expr2_0 = InstructionData::Binary { - opcode: expr0_0, - args: expr1_0, - }; - let expr3_0 = C::make_inst_ctor(ctx, pattern0_0, &expr2_0); - return expr3_0; -} - -// Generated as internal constructor for term bnot. -pub fn constructor_bnot(ctx: &mut C, arg0: Type, arg1: Value) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 1230. - let expr0_0 = Opcode::Bnot; - let expr1_0 = InstructionData::Unary { - opcode: expr0_0, - arg: pattern1_0, - }; - let expr2_0 = C::make_inst_ctor(ctx, pattern0_0, &expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term band_not. -pub fn constructor_band_not( - ctx: &mut C, - arg0: Type, - arg1: Value, - arg2: Value, -) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 1239. - let expr0_0 = Opcode::BandNot; - let expr1_0 = C::value_array_2_ctor(ctx, pattern1_0, pattern2_0); - let expr2_0 = InstructionData::Binary { - opcode: expr0_0, - args: expr1_0, - }; - let expr3_0 = C::make_inst_ctor(ctx, pattern0_0, &expr2_0); - return expr3_0; -} - -// Generated as internal constructor for term bor_not. -pub fn constructor_bor_not(ctx: &mut C, arg0: Type, arg1: Value, arg2: Value) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 1248. - let expr0_0 = Opcode::BorNot; - let expr1_0 = C::value_array_2_ctor(ctx, pattern1_0, pattern2_0); - let expr2_0 = InstructionData::Binary { - opcode: expr0_0, - args: expr1_0, - }; - let expr3_0 = C::make_inst_ctor(ctx, pattern0_0, &expr2_0); - return expr3_0; -} - -// Generated as internal constructor for term bxor_not. -pub fn constructor_bxor_not( - ctx: &mut C, - arg0: Type, - arg1: Value, - arg2: Value, -) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 1257. - let expr0_0 = Opcode::BxorNot; - let expr1_0 = C::value_array_2_ctor(ctx, pattern1_0, pattern2_0); - let expr2_0 = InstructionData::Binary { - opcode: expr0_0, - args: expr1_0, - }; - let expr3_0 = C::make_inst_ctor(ctx, pattern0_0, &expr2_0); - return expr3_0; -} - -// Generated as internal constructor for term band_imm. -pub fn constructor_band_imm( - ctx: &mut C, - arg0: Type, - arg1: Value, - arg2: Imm64, -) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 1266. - let expr0_0 = Opcode::BandImm; - let expr1_0 = InstructionData::BinaryImm64 { - opcode: expr0_0, - arg: pattern1_0, - imm: pattern2_0, - }; - let expr2_0 = C::make_inst_ctor(ctx, pattern0_0, &expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term bor_imm. -pub fn constructor_bor_imm(ctx: &mut C, arg0: Type, arg1: Value, arg2: Imm64) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 1275. - let expr0_0 = Opcode::BorImm; - let expr1_0 = InstructionData::BinaryImm64 { - opcode: expr0_0, - arg: pattern1_0, - imm: pattern2_0, - }; - let expr2_0 = C::make_inst_ctor(ctx, pattern0_0, &expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term bxor_imm. -pub fn constructor_bxor_imm( - ctx: &mut C, - arg0: Type, - arg1: Value, - arg2: Imm64, -) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 1284. - let expr0_0 = Opcode::BxorImm; - let expr1_0 = InstructionData::BinaryImm64 { - opcode: expr0_0, - arg: pattern1_0, - imm: pattern2_0, - }; - let expr2_0 = C::make_inst_ctor(ctx, pattern0_0, &expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term rotl. -pub fn constructor_rotl(ctx: &mut C, arg0: Type, arg1: Value, arg2: Value) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 1293. - let expr0_0 = Opcode::Rotl; - let expr1_0 = C::value_array_2_ctor(ctx, pattern1_0, pattern2_0); - let expr2_0 = InstructionData::Binary { - opcode: expr0_0, - args: expr1_0, - }; - let expr3_0 = C::make_inst_ctor(ctx, pattern0_0, &expr2_0); - return expr3_0; -} - -// Generated as internal constructor for term rotr. -pub fn constructor_rotr(ctx: &mut C, arg0: Type, arg1: Value, arg2: Value) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 1302. - let expr0_0 = Opcode::Rotr; - let expr1_0 = C::value_array_2_ctor(ctx, pattern1_0, pattern2_0); - let expr2_0 = InstructionData::Binary { - opcode: expr0_0, - args: expr1_0, - }; - let expr3_0 = C::make_inst_ctor(ctx, pattern0_0, &expr2_0); - return expr3_0; -} - -// Generated as internal constructor for term rotl_imm. -pub fn constructor_rotl_imm( - ctx: &mut C, - arg0: Type, - arg1: Value, - arg2: Imm64, -) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 1311. - let expr0_0 = Opcode::RotlImm; - let expr1_0 = InstructionData::BinaryImm64 { - opcode: expr0_0, - arg: pattern1_0, - imm: pattern2_0, - }; - let expr2_0 = C::make_inst_ctor(ctx, pattern0_0, &expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term rotr_imm. -pub fn constructor_rotr_imm( - ctx: &mut C, - arg0: Type, - arg1: Value, - arg2: Imm64, -) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 1320. - let expr0_0 = Opcode::RotrImm; - let expr1_0 = InstructionData::BinaryImm64 { - opcode: expr0_0, - arg: pattern1_0, - imm: pattern2_0, - }; - let expr2_0 = C::make_inst_ctor(ctx, pattern0_0, &expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term ishl. -pub fn constructor_ishl(ctx: &mut C, arg0: Type, arg1: Value, arg2: Value) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 1329. - let expr0_0 = Opcode::Ishl; - let expr1_0 = C::value_array_2_ctor(ctx, pattern1_0, pattern2_0); - let expr2_0 = InstructionData::Binary { - opcode: expr0_0, - args: expr1_0, - }; - let expr3_0 = C::make_inst_ctor(ctx, pattern0_0, &expr2_0); - return expr3_0; -} - -// Generated as internal constructor for term ushr. -pub fn constructor_ushr(ctx: &mut C, arg0: Type, arg1: Value, arg2: Value) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 1338. - let expr0_0 = Opcode::Ushr; - let expr1_0 = C::value_array_2_ctor(ctx, pattern1_0, pattern2_0); - let expr2_0 = InstructionData::Binary { - opcode: expr0_0, - args: expr1_0, - }; - let expr3_0 = C::make_inst_ctor(ctx, pattern0_0, &expr2_0); - return expr3_0; -} - -// Generated as internal constructor for term sshr. -pub fn constructor_sshr(ctx: &mut C, arg0: Type, arg1: Value, arg2: Value) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 1347. - let expr0_0 = Opcode::Sshr; - let expr1_0 = C::value_array_2_ctor(ctx, pattern1_0, pattern2_0); - let expr2_0 = InstructionData::Binary { - opcode: expr0_0, - args: expr1_0, - }; - let expr3_0 = C::make_inst_ctor(ctx, pattern0_0, &expr2_0); - return expr3_0; -} - -// Generated as internal constructor for term ishl_imm. -pub fn constructor_ishl_imm( - ctx: &mut C, - arg0: Type, - arg1: Value, - arg2: Imm64, -) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 1356. - let expr0_0 = Opcode::IshlImm; - let expr1_0 = InstructionData::BinaryImm64 { - opcode: expr0_0, - arg: pattern1_0, - imm: pattern2_0, - }; - let expr2_0 = C::make_inst_ctor(ctx, pattern0_0, &expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term ushr_imm. -pub fn constructor_ushr_imm( - ctx: &mut C, - arg0: Type, - arg1: Value, - arg2: Imm64, -) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 1365. - let expr0_0 = Opcode::UshrImm; - let expr1_0 = InstructionData::BinaryImm64 { - opcode: expr0_0, - arg: pattern1_0, - imm: pattern2_0, - }; - let expr2_0 = C::make_inst_ctor(ctx, pattern0_0, &expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term sshr_imm. -pub fn constructor_sshr_imm( - ctx: &mut C, - arg0: Type, - arg1: Value, - arg2: Imm64, -) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 1374. - let expr0_0 = Opcode::SshrImm; - let expr1_0 = InstructionData::BinaryImm64 { - opcode: expr0_0, - arg: pattern1_0, - imm: pattern2_0, - }; - let expr2_0 = C::make_inst_ctor(ctx, pattern0_0, &expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term bitrev. -pub fn constructor_bitrev(ctx: &mut C, arg0: Type, arg1: Value) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 1383. - let expr0_0 = Opcode::Bitrev; - let expr1_0 = InstructionData::Unary { - opcode: expr0_0, - arg: pattern1_0, - }; - let expr2_0 = C::make_inst_ctor(ctx, pattern0_0, &expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term clz. -pub fn constructor_clz(ctx: &mut C, arg0: Type, arg1: Value) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 1392. - let expr0_0 = Opcode::Clz; - let expr1_0 = InstructionData::Unary { - opcode: expr0_0, - arg: pattern1_0, - }; - let expr2_0 = C::make_inst_ctor(ctx, pattern0_0, &expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term cls. -pub fn constructor_cls(ctx: &mut C, arg0: Type, arg1: Value) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 1401. - let expr0_0 = Opcode::Cls; - let expr1_0 = InstructionData::Unary { - opcode: expr0_0, - arg: pattern1_0, - }; - let expr2_0 = C::make_inst_ctor(ctx, pattern0_0, &expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term ctz. -pub fn constructor_ctz(ctx: &mut C, arg0: Type, arg1: Value) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 1410. - let expr0_0 = Opcode::Ctz; - let expr1_0 = InstructionData::Unary { - opcode: expr0_0, - arg: pattern1_0, - }; - let expr2_0 = C::make_inst_ctor(ctx, pattern0_0, &expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term bswap. -pub fn constructor_bswap(ctx: &mut C, arg0: Type, arg1: Value) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 1419. - let expr0_0 = Opcode::Bswap; - let expr1_0 = InstructionData::Unary { - opcode: expr0_0, - arg: pattern1_0, - }; - let expr2_0 = C::make_inst_ctor(ctx, pattern0_0, &expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term popcnt. -pub fn constructor_popcnt(ctx: &mut C, arg0: Type, arg1: Value) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 1428. - let expr0_0 = Opcode::Popcnt; - let expr1_0 = InstructionData::Unary { - opcode: expr0_0, - arg: pattern1_0, - }; - let expr2_0 = C::make_inst_ctor(ctx, pattern0_0, &expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term fcmp. -pub fn constructor_fcmp( - ctx: &mut C, - arg0: Type, - arg1: &FloatCC, - arg2: Value, - arg3: Value, -) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 1437. - let expr0_0 = Opcode::Fcmp; - let expr1_0 = C::value_array_2_ctor(ctx, pattern2_0, pattern3_0); - let expr2_0 = InstructionData::FloatCompare { - opcode: expr0_0, - args: expr1_0, - cond: pattern1_0.clone(), - }; - let expr3_0 = C::make_inst_ctor(ctx, pattern0_0, &expr2_0); - return expr3_0; -} - -// Generated as internal constructor for term fadd. -pub fn constructor_fadd(ctx: &mut C, arg0: Type, arg1: Value, arg2: Value) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 1446. - let expr0_0 = Opcode::Fadd; - let expr1_0 = C::value_array_2_ctor(ctx, pattern1_0, pattern2_0); - let expr2_0 = InstructionData::Binary { - opcode: expr0_0, - args: expr1_0, - }; - let expr3_0 = C::make_inst_ctor(ctx, pattern0_0, &expr2_0); - return expr3_0; -} - -// Generated as internal constructor for term fsub. -pub fn constructor_fsub(ctx: &mut C, arg0: Type, arg1: Value, arg2: Value) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 1455. - let expr0_0 = Opcode::Fsub; - let expr1_0 = C::value_array_2_ctor(ctx, pattern1_0, pattern2_0); - let expr2_0 = InstructionData::Binary { - opcode: expr0_0, - args: expr1_0, - }; - let expr3_0 = C::make_inst_ctor(ctx, pattern0_0, &expr2_0); - return expr3_0; -} - -// Generated as internal constructor for term fmul. -pub fn constructor_fmul(ctx: &mut C, arg0: Type, arg1: Value, arg2: Value) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 1464. - let expr0_0 = Opcode::Fmul; - let expr1_0 = C::value_array_2_ctor(ctx, pattern1_0, pattern2_0); - let expr2_0 = InstructionData::Binary { - opcode: expr0_0, - args: expr1_0, - }; - let expr3_0 = C::make_inst_ctor(ctx, pattern0_0, &expr2_0); - return expr3_0; -} - -// Generated as internal constructor for term fdiv. -pub fn constructor_fdiv(ctx: &mut C, arg0: Type, arg1: Value, arg2: Value) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 1473. - let expr0_0 = Opcode::Fdiv; - let expr1_0 = C::value_array_2_ctor(ctx, pattern1_0, pattern2_0); - let expr2_0 = InstructionData::Binary { - opcode: expr0_0, - args: expr1_0, - }; - let expr3_0 = C::make_inst_ctor(ctx, pattern0_0, &expr2_0); - return expr3_0; -} - -// Generated as internal constructor for term sqrt. -pub fn constructor_sqrt(ctx: &mut C, arg0: Type, arg1: Value) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 1482. - let expr0_0 = Opcode::Sqrt; - let expr1_0 = InstructionData::Unary { - opcode: expr0_0, - arg: pattern1_0, - }; - let expr2_0 = C::make_inst_ctor(ctx, pattern0_0, &expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term fma. -pub fn constructor_fma( - ctx: &mut C, - arg0: Type, - arg1: Value, - arg2: Value, - arg3: Value, -) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 1491. - let expr0_0 = Opcode::Fma; - let expr1_0 = C::value_array_3_ctor(ctx, pattern1_0, pattern2_0, pattern3_0); - let expr2_0 = InstructionData::Ternary { - opcode: expr0_0, - args: expr1_0, - }; - let expr3_0 = C::make_inst_ctor(ctx, pattern0_0, &expr2_0); - return expr3_0; -} - -// Generated as internal constructor for term fneg. -pub fn constructor_fneg(ctx: &mut C, arg0: Type, arg1: Value) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 1500. - let expr0_0 = Opcode::Fneg; - let expr1_0 = InstructionData::Unary { - opcode: expr0_0, - arg: pattern1_0, - }; - let expr2_0 = C::make_inst_ctor(ctx, pattern0_0, &expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term fabs. -pub fn constructor_fabs(ctx: &mut C, arg0: Type, arg1: Value) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 1509. - let expr0_0 = Opcode::Fabs; - let expr1_0 = InstructionData::Unary { - opcode: expr0_0, - arg: pattern1_0, - }; - let expr2_0 = C::make_inst_ctor(ctx, pattern0_0, &expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term fcopysign. -pub fn constructor_fcopysign( - ctx: &mut C, - arg0: Type, - arg1: Value, - arg2: Value, -) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 1518. - let expr0_0 = Opcode::Fcopysign; - let expr1_0 = C::value_array_2_ctor(ctx, pattern1_0, pattern2_0); - let expr2_0 = InstructionData::Binary { - opcode: expr0_0, - args: expr1_0, - }; - let expr3_0 = C::make_inst_ctor(ctx, pattern0_0, &expr2_0); - return expr3_0; -} - -// Generated as internal constructor for term fmin. -pub fn constructor_fmin(ctx: &mut C, arg0: Type, arg1: Value, arg2: Value) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 1527. - let expr0_0 = Opcode::Fmin; - let expr1_0 = C::value_array_2_ctor(ctx, pattern1_0, pattern2_0); - let expr2_0 = InstructionData::Binary { - opcode: expr0_0, - args: expr1_0, - }; - let expr3_0 = C::make_inst_ctor(ctx, pattern0_0, &expr2_0); - return expr3_0; -} - -// Generated as internal constructor for term fmin_pseudo. -pub fn constructor_fmin_pseudo( - ctx: &mut C, - arg0: Type, - arg1: Value, - arg2: Value, -) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 1536. - let expr0_0 = Opcode::FminPseudo; - let expr1_0 = C::value_array_2_ctor(ctx, pattern1_0, pattern2_0); - let expr2_0 = InstructionData::Binary { - opcode: expr0_0, - args: expr1_0, - }; - let expr3_0 = C::make_inst_ctor(ctx, pattern0_0, &expr2_0); - return expr3_0; -} - -// Generated as internal constructor for term fmax. -pub fn constructor_fmax(ctx: &mut C, arg0: Type, arg1: Value, arg2: Value) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 1545. - let expr0_0 = Opcode::Fmax; - let expr1_0 = C::value_array_2_ctor(ctx, pattern1_0, pattern2_0); - let expr2_0 = InstructionData::Binary { - opcode: expr0_0, - args: expr1_0, - }; - let expr3_0 = C::make_inst_ctor(ctx, pattern0_0, &expr2_0); - return expr3_0; -} - -// Generated as internal constructor for term fmax_pseudo. -pub fn constructor_fmax_pseudo( - ctx: &mut C, - arg0: Type, - arg1: Value, - arg2: Value, -) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 1554. - let expr0_0 = Opcode::FmaxPseudo; - let expr1_0 = C::value_array_2_ctor(ctx, pattern1_0, pattern2_0); - let expr2_0 = InstructionData::Binary { - opcode: expr0_0, - args: expr1_0, - }; - let expr3_0 = C::make_inst_ctor(ctx, pattern0_0, &expr2_0); - return expr3_0; -} - -// Generated as internal constructor for term ceil. -pub fn constructor_ceil(ctx: &mut C, arg0: Type, arg1: Value) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 1563. - let expr0_0 = Opcode::Ceil; - let expr1_0 = InstructionData::Unary { - opcode: expr0_0, - arg: pattern1_0, - }; - let expr2_0 = C::make_inst_ctor(ctx, pattern0_0, &expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term floor. -pub fn constructor_floor(ctx: &mut C, arg0: Type, arg1: Value) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 1572. - let expr0_0 = Opcode::Floor; - let expr1_0 = InstructionData::Unary { - opcode: expr0_0, - arg: pattern1_0, - }; - let expr2_0 = C::make_inst_ctor(ctx, pattern0_0, &expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term trunc. -pub fn constructor_trunc(ctx: &mut C, arg0: Type, arg1: Value) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 1581. - let expr0_0 = Opcode::Trunc; - let expr1_0 = InstructionData::Unary { - opcode: expr0_0, - arg: pattern1_0, - }; - let expr2_0 = C::make_inst_ctor(ctx, pattern0_0, &expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term nearest. -pub fn constructor_nearest(ctx: &mut C, arg0: Type, arg1: Value) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 1590. - let expr0_0 = Opcode::Nearest; - let expr1_0 = InstructionData::Unary { - opcode: expr0_0, - arg: pattern1_0, - }; - let expr2_0 = C::make_inst_ctor(ctx, pattern0_0, &expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term is_null. -pub fn constructor_is_null(ctx: &mut C, arg0: Type, arg1: Value) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 1599. - let expr0_0 = Opcode::IsNull; - let expr1_0 = InstructionData::Unary { - opcode: expr0_0, - arg: pattern1_0, - }; - let expr2_0 = C::make_inst_ctor(ctx, pattern0_0, &expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term is_invalid. -pub fn constructor_is_invalid(ctx: &mut C, arg0: Type, arg1: Value) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 1608. - let expr0_0 = Opcode::IsInvalid; - let expr1_0 = InstructionData::Unary { - opcode: expr0_0, - arg: pattern1_0, - }; - let expr2_0 = C::make_inst_ctor(ctx, pattern0_0, &expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term bitcast. -pub fn constructor_bitcast( - ctx: &mut C, - arg0: Type, - arg1: MemFlags, - arg2: Value, -) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 1617. - let expr0_0 = Opcode::Bitcast; - let expr1_0 = InstructionData::LoadNoOffset { - opcode: expr0_0, - arg: pattern2_0, - flags: pattern1_0, - }; - let expr2_0 = C::make_inst_ctor(ctx, pattern0_0, &expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term scalar_to_vector. -pub fn constructor_scalar_to_vector(ctx: &mut C, arg0: Type, arg1: Value) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 1626. - let expr0_0 = Opcode::ScalarToVector; - let expr1_0 = InstructionData::Unary { - opcode: expr0_0, - arg: pattern1_0, - }; - let expr2_0 = C::make_inst_ctor(ctx, pattern0_0, &expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term bmask. -pub fn constructor_bmask(ctx: &mut C, arg0: Type, arg1: Value) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 1635. - let expr0_0 = Opcode::Bmask; - let expr1_0 = InstructionData::Unary { - opcode: expr0_0, - arg: pattern1_0, - }; - let expr2_0 = C::make_inst_ctor(ctx, pattern0_0, &expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term ireduce. -pub fn constructor_ireduce(ctx: &mut C, arg0: Type, arg1: Value) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 1644. - let expr0_0 = Opcode::Ireduce; - let expr1_0 = InstructionData::Unary { - opcode: expr0_0, - arg: pattern1_0, - }; - let expr2_0 = C::make_inst_ctor(ctx, pattern0_0, &expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term snarrow. -pub fn constructor_snarrow(ctx: &mut C, arg0: Type, arg1: Value, arg2: Value) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 1653. - let expr0_0 = Opcode::Snarrow; - let expr1_0 = C::value_array_2_ctor(ctx, pattern1_0, pattern2_0); - let expr2_0 = InstructionData::Binary { - opcode: expr0_0, - args: expr1_0, - }; - let expr3_0 = C::make_inst_ctor(ctx, pattern0_0, &expr2_0); - return expr3_0; -} - -// Generated as internal constructor for term unarrow. -pub fn constructor_unarrow(ctx: &mut C, arg0: Type, arg1: Value, arg2: Value) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 1662. - let expr0_0 = Opcode::Unarrow; - let expr1_0 = C::value_array_2_ctor(ctx, pattern1_0, pattern2_0); - let expr2_0 = InstructionData::Binary { - opcode: expr0_0, - args: expr1_0, - }; - let expr3_0 = C::make_inst_ctor(ctx, pattern0_0, &expr2_0); - return expr3_0; -} - -// Generated as internal constructor for term uunarrow. -pub fn constructor_uunarrow( - ctx: &mut C, - arg0: Type, - arg1: Value, - arg2: Value, -) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 1671. - let expr0_0 = Opcode::Uunarrow; - let expr1_0 = C::value_array_2_ctor(ctx, pattern1_0, pattern2_0); - let expr2_0 = InstructionData::Binary { - opcode: expr0_0, - args: expr1_0, - }; - let expr3_0 = C::make_inst_ctor(ctx, pattern0_0, &expr2_0); - return expr3_0; -} - -// Generated as internal constructor for term swiden_low. -pub fn constructor_swiden_low(ctx: &mut C, arg0: Type, arg1: Value) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 1680. - let expr0_0 = Opcode::SwidenLow; - let expr1_0 = InstructionData::Unary { - opcode: expr0_0, - arg: pattern1_0, - }; - let expr2_0 = C::make_inst_ctor(ctx, pattern0_0, &expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term swiden_high. -pub fn constructor_swiden_high(ctx: &mut C, arg0: Type, arg1: Value) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 1689. - let expr0_0 = Opcode::SwidenHigh; - let expr1_0 = InstructionData::Unary { - opcode: expr0_0, - arg: pattern1_0, - }; - let expr2_0 = C::make_inst_ctor(ctx, pattern0_0, &expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term uwiden_low. -pub fn constructor_uwiden_low(ctx: &mut C, arg0: Type, arg1: Value) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 1698. - let expr0_0 = Opcode::UwidenLow; - let expr1_0 = InstructionData::Unary { - opcode: expr0_0, - arg: pattern1_0, - }; - let expr2_0 = C::make_inst_ctor(ctx, pattern0_0, &expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term uwiden_high. -pub fn constructor_uwiden_high(ctx: &mut C, arg0: Type, arg1: Value) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 1707. - let expr0_0 = Opcode::UwidenHigh; - let expr1_0 = InstructionData::Unary { - opcode: expr0_0, - arg: pattern1_0, - }; - let expr2_0 = C::make_inst_ctor(ctx, pattern0_0, &expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term iadd_pairwise. -pub fn constructor_iadd_pairwise( - ctx: &mut C, - arg0: Type, - arg1: Value, - arg2: Value, -) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 1716. - let expr0_0 = Opcode::IaddPairwise; - let expr1_0 = C::value_array_2_ctor(ctx, pattern1_0, pattern2_0); - let expr2_0 = InstructionData::Binary { - opcode: expr0_0, - args: expr1_0, - }; - let expr3_0 = C::make_inst_ctor(ctx, pattern0_0, &expr2_0); - return expr3_0; -} - -// Generated as internal constructor for term widening_pairwise_dot_product_s. -pub fn constructor_widening_pairwise_dot_product_s( - ctx: &mut C, - arg0: Type, - arg1: Value, - arg2: Value, -) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 1725. - let expr0_0 = Opcode::WideningPairwiseDotProductS; - let expr1_0 = C::value_array_2_ctor(ctx, pattern1_0, pattern2_0); - let expr2_0 = InstructionData::Binary { - opcode: expr0_0, - args: expr1_0, - }; - let expr3_0 = C::make_inst_ctor(ctx, pattern0_0, &expr2_0); - return expr3_0; -} - -// Generated as internal constructor for term uextend. -pub fn constructor_uextend(ctx: &mut C, arg0: Type, arg1: Value) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 1734. - let expr0_0 = Opcode::Uextend; - let expr1_0 = InstructionData::Unary { - opcode: expr0_0, - arg: pattern1_0, - }; - let expr2_0 = C::make_inst_ctor(ctx, pattern0_0, &expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term sextend. -pub fn constructor_sextend(ctx: &mut C, arg0: Type, arg1: Value) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 1743. - let expr0_0 = Opcode::Sextend; - let expr1_0 = InstructionData::Unary { - opcode: expr0_0, - arg: pattern1_0, - }; - let expr2_0 = C::make_inst_ctor(ctx, pattern0_0, &expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term fpromote. -pub fn constructor_fpromote(ctx: &mut C, arg0: Type, arg1: Value) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 1752. - let expr0_0 = Opcode::Fpromote; - let expr1_0 = InstructionData::Unary { - opcode: expr0_0, - arg: pattern1_0, - }; - let expr2_0 = C::make_inst_ctor(ctx, pattern0_0, &expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term fdemote. -pub fn constructor_fdemote(ctx: &mut C, arg0: Type, arg1: Value) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 1761. - let expr0_0 = Opcode::Fdemote; - let expr1_0 = InstructionData::Unary { - opcode: expr0_0, - arg: pattern1_0, - }; - let expr2_0 = C::make_inst_ctor(ctx, pattern0_0, &expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term fvdemote. -pub fn constructor_fvdemote(ctx: &mut C, arg0: Type, arg1: Value) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 1770. - let expr0_0 = Opcode::Fvdemote; - let expr1_0 = InstructionData::Unary { - opcode: expr0_0, - arg: pattern1_0, - }; - let expr2_0 = C::make_inst_ctor(ctx, pattern0_0, &expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term fvpromote_low. -pub fn constructor_fvpromote_low(ctx: &mut C, arg0: Type, arg1: Value) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 1779. - let expr0_0 = Opcode::FvpromoteLow; - let expr1_0 = InstructionData::Unary { - opcode: expr0_0, - arg: pattern1_0, - }; - let expr2_0 = C::make_inst_ctor(ctx, pattern0_0, &expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term fcvt_to_uint. -pub fn constructor_fcvt_to_uint(ctx: &mut C, arg0: Type, arg1: Value) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 1788. - let expr0_0 = Opcode::FcvtToUint; - let expr1_0 = InstructionData::Unary { - opcode: expr0_0, - arg: pattern1_0, - }; - let expr2_0 = C::make_inst_ctor(ctx, pattern0_0, &expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term fcvt_to_sint. -pub fn constructor_fcvt_to_sint(ctx: &mut C, arg0: Type, arg1: Value) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 1797. - let expr0_0 = Opcode::FcvtToSint; - let expr1_0 = InstructionData::Unary { - opcode: expr0_0, - arg: pattern1_0, - }; - let expr2_0 = C::make_inst_ctor(ctx, pattern0_0, &expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term fcvt_to_uint_sat. -pub fn constructor_fcvt_to_uint_sat(ctx: &mut C, arg0: Type, arg1: Value) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 1806. - let expr0_0 = Opcode::FcvtToUintSat; - let expr1_0 = InstructionData::Unary { - opcode: expr0_0, - arg: pattern1_0, - }; - let expr2_0 = C::make_inst_ctor(ctx, pattern0_0, &expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term fcvt_to_sint_sat. -pub fn constructor_fcvt_to_sint_sat(ctx: &mut C, arg0: Type, arg1: Value) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 1815. - let expr0_0 = Opcode::FcvtToSintSat; - let expr1_0 = InstructionData::Unary { - opcode: expr0_0, - arg: pattern1_0, - }; - let expr2_0 = C::make_inst_ctor(ctx, pattern0_0, &expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term fcvt_from_uint. -pub fn constructor_fcvt_from_uint(ctx: &mut C, arg0: Type, arg1: Value) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 1824. - let expr0_0 = Opcode::FcvtFromUint; - let expr1_0 = InstructionData::Unary { - opcode: expr0_0, - arg: pattern1_0, - }; - let expr2_0 = C::make_inst_ctor(ctx, pattern0_0, &expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term fcvt_from_sint. -pub fn constructor_fcvt_from_sint(ctx: &mut C, arg0: Type, arg1: Value) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 1833. - let expr0_0 = Opcode::FcvtFromSint; - let expr1_0 = InstructionData::Unary { - opcode: expr0_0, - arg: pattern1_0, - }; - let expr2_0 = C::make_inst_ctor(ctx, pattern0_0, &expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term fcvt_low_from_sint. -pub fn constructor_fcvt_low_from_sint(ctx: &mut C, arg0: Type, arg1: Value) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 1842. - let expr0_0 = Opcode::FcvtLowFromSint; - let expr1_0 = InstructionData::Unary { - opcode: expr0_0, - arg: pattern1_0, - }; - let expr2_0 = C::make_inst_ctor(ctx, pattern0_0, &expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term isplit. -pub fn constructor_isplit(ctx: &mut C, arg0: Type, arg1: Value) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 1851. - let expr0_0 = Opcode::Isplit; - let expr1_0 = InstructionData::Unary { - opcode: expr0_0, - arg: pattern1_0, - }; - let expr2_0 = C::make_inst_ctor(ctx, pattern0_0, &expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term iconcat. -pub fn constructor_iconcat(ctx: &mut C, arg0: Type, arg1: Value, arg2: Value) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 1860. - let expr0_0 = Opcode::Iconcat; - let expr1_0 = C::value_array_2_ctor(ctx, pattern1_0, pattern2_0); - let expr2_0 = InstructionData::Binary { - opcode: expr0_0, - args: expr1_0, - }; - let expr3_0 = C::make_inst_ctor(ctx, pattern0_0, &expr2_0); - return expr3_0; -} - -// Generated as internal constructor for term atomic_rmw. -pub fn constructor_atomic_rmw( - ctx: &mut C, - arg0: Type, - arg1: MemFlags, - arg2: &AtomicRmwOp, - arg3: Value, - arg4: Value, -) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - let pattern4_0 = arg4; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 1869. - let expr0_0 = Opcode::AtomicRmw; - let expr1_0 = C::value_array_2_ctor(ctx, pattern3_0, pattern4_0); - let expr2_0 = InstructionData::AtomicRmw { - opcode: expr0_0, - args: expr1_0, - flags: pattern1_0, - op: pattern2_0.clone(), - }; - let expr3_0 = C::make_inst_ctor(ctx, pattern0_0, &expr2_0); - return expr3_0; -} - -// Generated as internal constructor for term atomic_cas. -pub fn constructor_atomic_cas( - ctx: &mut C, - arg0: Type, - arg1: MemFlags, - arg2: Value, - arg3: Value, - arg4: Value, -) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - let pattern4_0 = arg4; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 1878. - let expr0_0 = Opcode::AtomicCas; - let expr1_0 = C::value_array_3_ctor(ctx, pattern2_0, pattern3_0, pattern4_0); - let expr2_0 = InstructionData::AtomicCas { - opcode: expr0_0, - args: expr1_0, - flags: pattern1_0, - }; - let expr3_0 = C::make_inst_ctor(ctx, pattern0_0, &expr2_0); - return expr3_0; -} - -// Generated as internal constructor for term atomic_load. -pub fn constructor_atomic_load( - ctx: &mut C, - arg0: Type, - arg1: MemFlags, - arg2: Value, -) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 1887. - let expr0_0 = Opcode::AtomicLoad; - let expr1_0 = InstructionData::LoadNoOffset { - opcode: expr0_0, - arg: pattern2_0, - flags: pattern1_0, - }; - let expr2_0 = C::make_inst_ctor(ctx, pattern0_0, &expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term atomic_store. -pub fn constructor_atomic_store( - ctx: &mut C, - arg0: Type, - arg1: MemFlags, - arg2: Value, - arg3: Value, -) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 1896. - let expr0_0 = Opcode::AtomicStore; - let expr1_0 = C::value_array_2_ctor(ctx, pattern2_0, pattern3_0); - let expr2_0 = InstructionData::StoreNoOffset { - opcode: expr0_0, - args: expr1_0, - flags: pattern1_0, - }; - let expr3_0 = C::make_inst_ctor(ctx, pattern0_0, &expr2_0); - return expr3_0; -} - -// Generated as internal constructor for term fence. -pub fn constructor_fence(ctx: &mut C, arg0: Type) -> Value { - let pattern0_0 = arg0; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 1905. - let expr0_0 = Opcode::Fence; - let expr1_0 = InstructionData::NullAry { opcode: expr0_0 }; - let expr2_0 = C::make_inst_ctor(ctx, pattern0_0, &expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term extract_vector. -pub fn constructor_extract_vector( - ctx: &mut C, - arg0: Type, - arg1: Value, - arg2: Uimm8, -) -> Value { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_opt.isle line 1914. - let expr0_0 = Opcode::ExtractVector; - let expr1_0 = InstructionData::BinaryImm8 { - opcode: expr0_0, - arg: pattern1_0, - imm: pattern2_0, - }; - let expr2_0 = C::make_inst_ctor(ctx, pattern0_0, &expr1_0); - return expr2_0; -} diff --git a/cranelift/codegen/isle_generated_code/isle_riscv64.rs b/cranelift/codegen/isle_generated_code/isle_riscv64.rs deleted file mode 100644 index 579b24a4722f..000000000000 --- a/cranelift/codegen/isle_generated_code/isle_riscv64.rs +++ /dev/null @@ -1,8014 +0,0 @@ -// GENERATED BY ISLE. DO NOT EDIT! -// -// Generated automatically from the instruction-selection DSL code in: -// - src/prelude.isle -// - src/prelude_lower.isle -// - src/isa/riscv64/inst.isle -// - src/isa/riscv64/lower.isle -// - /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_lower.isle - -use super::*; // Pulls in all external types. -use std::marker::PhantomData; - -/// Context during lowering: an implementation of this trait -/// must be provided with all external constructors and extractors. -/// A mutable borrow is passed along through all lowering logic. -pub trait Context { - fn unit(&mut self) -> Unit; - fn value_type(&mut self, arg0: Value) -> Type; - fn u32_add(&mut self, arg0: u32, arg1: u32) -> u32; - fn s32_add_fallible(&mut self, arg0: u32, arg1: u32) -> Option; - fn u32_nonnegative(&mut self, arg0: u32) -> Option; - fn offset32(&mut self, arg0: Offset32) -> u32; - fn u32_lteq(&mut self, arg0: u32, arg1: u32) -> Option; - fn u8_lteq(&mut self, arg0: u8, arg1: u8) -> Option; - fn u8_lt(&mut self, arg0: u8, arg1: u8) -> Option; - fn simm32(&mut self, arg0: Imm64) -> Option; - fn uimm8(&mut self, arg0: Imm64) -> Option; - fn u8_and(&mut self, arg0: u8, arg1: u8) -> u8; - fn u8_as_u32(&mut self, arg0: u8) -> u32; - fn u8_as_u64(&mut self, arg0: u8) -> u64; - fn u16_as_u64(&mut self, arg0: u16) -> u64; - fn u32_as_u64(&mut self, arg0: u32) -> u64; - fn i64_as_u64(&mut self, arg0: i64) -> u64; - fn u64_add(&mut self, arg0: u64, arg1: u64) -> u64; - fn u64_sub(&mut self, arg0: u64, arg1: u64) -> u64; - fn u64_mul(&mut self, arg0: u64, arg1: u64) -> u64; - fn u64_sdiv(&mut self, arg0: u64, arg1: u64) -> Option; - fn u64_udiv(&mut self, arg0: u64, arg1: u64) -> Option; - fn u64_and(&mut self, arg0: u64, arg1: u64) -> u64; - fn u64_or(&mut self, arg0: u64, arg1: u64) -> u64; - fn u64_xor(&mut self, arg0: u64, arg1: u64) -> u64; - fn u64_not(&mut self, arg0: u64) -> u64; - fn u64_sextend_u32(&mut self, arg0: u64) -> u64; - fn u64_uextend_u32(&mut self, arg0: u64) -> u64; - fn u64_is_zero(&mut self, arg0: u64) -> bool; - fn u64_is_odd(&mut self, arg0: u64) -> bool; - fn ty_bits(&mut self, arg0: Type) -> u8; - fn ty_bits_u16(&mut self, arg0: Type) -> u16; - fn ty_bits_u64(&mut self, arg0: Type) -> u64; - fn ty_mask(&mut self, arg0: Type) -> u64; - fn ty_bytes(&mut self, arg0: Type) -> u16; - fn lane_type(&mut self, arg0: Type) -> Type; - fn mem_flags_trusted(&mut self) -> MemFlags; - fn intcc_reverse(&mut self, arg0: &IntCC) -> IntCC; - fn intcc_inverse(&mut self, arg0: &IntCC) -> IntCC; - fn floatcc_reverse(&mut self, arg0: &FloatCC) -> FloatCC; - fn floatcc_inverse(&mut self, arg0: &FloatCC) -> FloatCC; - fn fits_in_16(&mut self, arg0: Type) -> Option; - fn fits_in_32(&mut self, arg0: Type) -> Option; - fn lane_fits_in_32(&mut self, arg0: Type) -> Option; - fn fits_in_64(&mut self, arg0: Type) -> Option; - fn ty_32(&mut self, arg0: Type) -> Option; - fn ty_64(&mut self, arg0: Type) -> Option; - fn ty_int_ref_scalar_64(&mut self, arg0: Type) -> Option; - fn ty_32_or_64(&mut self, arg0: Type) -> Option; - fn ty_8_or_16(&mut self, arg0: Type) -> Option; - fn int_fits_in_32(&mut self, arg0: Type) -> Option; - fn ty_int_ref_64(&mut self, arg0: Type) -> Option; - fn ty_int(&mut self, arg0: Type) -> Option; - fn ty_scalar_float(&mut self, arg0: Type) -> Option; - fn ty_float_or_vec(&mut self, arg0: Type) -> Option; - fn ty_vector_float(&mut self, arg0: Type) -> Option; - fn ty_vector_not_float(&mut self, arg0: Type) -> Option; - fn ty_vec64(&mut self, arg0: Type) -> Option; - fn ty_vec64_ctor(&mut self, arg0: Type) -> Option; - fn ty_vec128(&mut self, arg0: Type) -> Option; - fn ty_dyn_vec64(&mut self, arg0: Type) -> Option; - fn ty_dyn_vec128(&mut self, arg0: Type) -> Option; - fn ty_vec64_int(&mut self, arg0: Type) -> Option; - fn ty_vec128_int(&mut self, arg0: Type) -> Option; - fn not_vec32x2(&mut self, arg0: Type) -> Option; - fn not_i64x2(&mut self, arg0: Type) -> Option<()>; - fn u8_from_uimm8(&mut self, arg0: Uimm8) -> u8; - fn u64_from_bool(&mut self, arg0: bool) -> u64; - fn u64_from_imm64(&mut self, arg0: Imm64) -> u64; - fn nonzero_u64_from_imm64(&mut self, arg0: Imm64) -> Option; - fn imm64(&mut self, arg0: u64) -> Imm64; - fn imm64_masked(&mut self, arg0: Type, arg1: u64) -> Imm64; - fn u64_from_ieee32(&mut self, arg0: Ieee32) -> u64; - fn u64_from_ieee64(&mut self, arg0: Ieee64) -> u64; - fn multi_lane(&mut self, arg0: Type) -> Option<(u32, u32)>; - fn dynamic_lane(&mut self, arg0: Type) -> Option<(u32, u32)>; - fn dynamic_int_lane(&mut self, arg0: Type) -> Option; - fn dynamic_fp_lane(&mut self, arg0: Type) -> Option; - fn ty_dyn64_int(&mut self, arg0: Type) -> Option; - fn ty_dyn128_int(&mut self, arg0: Type) -> Option; - fn offset32_to_u32(&mut self, arg0: Offset32) -> u32; - fn intcc_unsigned(&mut self, arg0: &IntCC) -> IntCC; - fn signed_cond_code(&mut self, arg0: &IntCC) -> Option; - fn trap_code_division_by_zero(&mut self) -> TrapCode; - fn trap_code_integer_overflow(&mut self) -> TrapCode; - fn trap_code_bad_conversion_to_integer(&mut self) -> TrapCode; - fn range(&mut self, arg0: usize, arg1: usize) -> Range; - fn range_view(&mut self, arg0: Range) -> RangeView; - fn value_reg(&mut self, arg0: Reg) -> ValueRegs; - fn value_regs(&mut self, arg0: Reg, arg1: Reg) -> ValueRegs; - fn value_regs_invalid(&mut self) -> ValueRegs; - fn output_none(&mut self) -> InstOutput; - fn output(&mut self, arg0: ValueRegs) -> InstOutput; - fn output_pair(&mut self, arg0: ValueRegs, arg1: ValueRegs) -> InstOutput; - fn output_builder_new(&mut self) -> InstOutputBuilder; - fn output_builder_push(&mut self, arg0: &InstOutputBuilder, arg1: ValueRegs) -> Unit; - fn output_builder_finish(&mut self, arg0: &InstOutputBuilder) -> InstOutput; - fn temp_writable_reg(&mut self, arg0: Type) -> WritableReg; - fn is_valid_reg(&mut self, arg0: Reg) -> bool; - fn invalid_reg(&mut self) -> Reg; - fn mark_value_used(&mut self, arg0: Value) -> Unit; - fn put_in_reg(&mut self, arg0: Value) -> Reg; - fn put_in_regs(&mut self, arg0: Value) -> ValueRegs; - fn ensure_in_vreg(&mut self, arg0: Reg, arg1: Type) -> Reg; - fn value_regs_get(&mut self, arg0: ValueRegs, arg1: usize) -> Reg; - fn value_regs_len(&mut self, arg0: ValueRegs) -> usize; - fn preg_to_reg(&mut self, arg0: PReg) -> Reg; - fn value_list_slice(&mut self, arg0: ValueList) -> ValueSlice; - fn value_slice_empty(&mut self, arg0: ValueSlice) -> Option<()>; - fn value_slice_unwrap(&mut self, arg0: ValueSlice) -> Option<(Value, ValueSlice)>; - fn value_slice_len(&mut self, arg0: ValueSlice) -> usize; - fn value_slice_get(&mut self, arg0: ValueSlice, arg1: usize) -> Value; - fn writable_reg_to_reg(&mut self, arg0: WritableReg) -> Reg; - fn inst_results(&mut self, arg0: Inst) -> ValueSlice; - fn first_result(&mut self, arg0: Inst) -> Option; - fn inst_data(&mut self, arg0: Inst) -> InstructionData; - fn def_inst(&mut self, arg0: Value) -> Option; - fn zero_value(&mut self, arg0: Value) -> Option; - fn is_sinkable_inst(&mut self, arg0: Value) -> Option; - fn maybe_uextend(&mut self, arg0: Value) -> Option; - fn emit(&mut self, arg0: &MInst) -> Unit; - fn sink_inst(&mut self, arg0: Inst) -> Unit; - fn emit_u64_le_const(&mut self, arg0: u64) -> VCodeConstant; - fn emit_u128_le_const(&mut self, arg0: u128) -> VCodeConstant; - fn const_to_vconst(&mut self, arg0: Constant) -> VCodeConstant; - fn avoid_div_traps(&mut self, arg0: Type) -> Option<()>; - fn tls_model(&mut self, arg0: Type) -> TlsModel; - fn tls_model_is_elf_gd(&mut self) -> Option; - fn tls_model_is_macho(&mut self) -> Option; - fn tls_model_is_coff(&mut self) -> Option; - fn preserve_frame_pointers(&mut self) -> Option; - fn box_external_name(&mut self, arg0: ExternalName) -> BoxExternalName; - fn func_ref_data(&mut self, arg0: FuncRef) -> (SigRef, ExternalName, RelocDistance); - fn symbol_value_data( - &mut self, - arg0: GlobalValue, - ) -> Option<(ExternalName, RelocDistance, i64)>; - fn reloc_distance_near(&mut self, arg0: RelocDistance) -> Option<()>; - fn vec_mask_from_immediate(&mut self, arg0: Immediate) -> Option; - fn u128_from_immediate(&mut self, arg0: Immediate) -> Option; - fn u128_from_constant(&mut self, arg0: Constant) -> Option; - fn u64_from_constant(&mut self, arg0: Constant) -> Option; - fn only_writable_reg(&mut self, arg0: WritableValueRegs) -> Option; - fn writable_regs_get(&mut self, arg0: WritableValueRegs, arg1: usize) -> WritableReg; - fn abi_num_args(&mut self, arg0: Sig) -> usize; - fn abi_get_arg(&mut self, arg0: Sig, arg1: usize) -> ABIArg; - fn abi_num_rets(&mut self, arg0: Sig) -> usize; - fn abi_get_ret(&mut self, arg0: Sig, arg1: usize) -> ABIArg; - fn abi_ret_arg(&mut self, arg0: Sig) -> Option; - fn abi_no_ret_arg(&mut self, arg0: Sig) -> Option<()>; - fn abi_sized_stack_arg_space(&mut self, arg0: Sig) -> i64; - fn abi_sized_stack_ret_space(&mut self, arg0: Sig) -> i64; - fn abi_stackslot_addr(&mut self, arg0: WritableReg, arg1: StackSlot, arg2: Offset32) -> MInst; - fn abi_dynamic_stackslot_addr(&mut self, arg0: WritableReg, arg1: DynamicStackSlot) -> MInst; - fn abi_arg_only_slot(&mut self, arg0: &ABIArg) -> Option; - fn abi_arg_struct_pointer(&mut self, arg0: &ABIArg) -> Option<(ABIArgSlot, i64, u64)>; - fn abi_arg_implicit_pointer(&mut self, arg0: &ABIArg) -> Option<(ABIArgSlot, i64, Type)>; - fn real_reg_to_reg(&mut self, arg0: RealReg) -> Reg; - fn real_reg_to_writable_reg(&mut self, arg0: RealReg) -> WritableReg; - fn gen_move(&mut self, arg0: Type, arg1: WritableReg, arg2: Reg) -> MInst; - fn gen_return(&mut self, arg0: ValueSlice) -> Unit; - fn zero_reg(&mut self) -> Reg; - fn imm(&mut self, arg0: Type, arg1: u64) -> Reg; - fn imm_from_bits(&mut self, arg0: u64) -> Imm12; - fn imm_from_neg_bits(&mut self, arg0: i64) -> Imm12; - fn imm12_from_u64(&mut self, arg0: u64) -> Option; - fn writable_zero_reg(&mut self) -> WritableReg; - fn gen_default_frm(&mut self) -> OptionFloatRoundingMode; - fn pack_float_rounding_mode(&mut self, arg0: &FRM) -> OptionFloatRoundingMode; - fn neg_imm12(&mut self, arg0: Imm12) -> Imm12; - fn u8_as_i32(&mut self, arg0: u8) -> i32; - fn gen_select_reg(&mut self, arg0: &IntCC, arg1: Reg, arg2: Reg, arg3: Reg, arg4: Reg) -> Reg; - fn load_u64_constant(&mut self, arg0: u64) -> Reg; - fn ext_sign_bit(&mut self, arg0: Type, arg1: Reg) -> Reg; - fn has_b(&mut self) -> bool; - fn gen_shamt(&mut self, arg0: Type, arg1: Reg) -> ValueRegs; - fn imm12_const(&mut self, arg0: i32) -> Imm12; - fn imm12_const_add(&mut self, arg0: i32, arg1: i32) -> Imm12; - fn imm12_and(&mut self, arg0: Imm12, arg1: i32) -> Imm12; - fn gen_amode(&mut self, arg0: Reg, arg1: Offset32, arg2: Type) -> AMode; - fn offset32_imm(&mut self, arg0: i32) -> Offset32; - fn default_memflags(&mut self) -> MemFlags; - fn offset32_add(&mut self, arg0: Offset32, arg1: i64) -> Offset32; - fn valid_atomic_transaction(&mut self, arg0: Type) -> Option; - fn atomic_amo(&mut self) -> AMO; - fn move_f_to_x(&mut self, arg0: Reg, arg1: Type) -> Reg; - fn move_x_to_f(&mut self, arg0: Reg, arg1: Type) -> Reg; - fn gen_stack_addr(&mut self, arg0: StackSlot, arg1: Offset32) -> Reg; - fn gen_move2(&mut self, arg0: Reg, arg1: Type, arg2: Type) -> Reg; - fn gen_moves(&mut self, arg0: ValueRegs, arg1: Type, arg2: Type) -> ValueRegs; - fn vec_writable_clone(&mut self, arg0: &VecWritableReg) -> VecWritableReg; - fn vec_writable_to_regs(&mut self, arg0: &VecWritableReg) -> ValueRegs; - fn alloc_vec_writable(&mut self, arg0: Type) -> VecWritableReg; - fn load_op(&mut self, arg0: Type) -> LoadOP; - fn store_op(&mut self, arg0: Type) -> StoreOP; - fn load_ext_name(&mut self, arg0: ExternalName, arg1: i64) -> Reg; - fn int_convert_2_float_op(&mut self, arg0: Type, arg1: bool, arg2: Type) -> FpuOPRR; - fn inst_output_get(&mut self, arg0: InstOutput, arg1: u8) -> ValueRegs; - fn label_to_br_target(&mut self, arg0: MachLabel) -> BranchTarget; - fn vec_label_get(&mut self, arg0: &VecMachLabel, arg1: u8) -> MachLabel; - fn lower_br_icmp( - &mut self, - arg0: &IntCC, - arg1: ValueRegs, - arg2: ValueRegs, - arg3: &VecMachLabel, - arg4: Type, - ) -> Unit; - fn lower_br_fcmp( - &mut self, - arg0: &FloatCC, - arg1: Reg, - arg2: Reg, - arg3: &VecMachLabel, - arg4: Type, - ) -> Unit; - fn int_zero_reg(&mut self, arg0: Type) -> ValueRegs; - fn lower_brz_or_nz( - &mut self, - arg0: &IntCC, - arg1: ValueRegs, - arg2: &VecMachLabel, - arg3: Type, - ) -> Unit; - fn lower_br_table(&mut self, arg0: Reg, arg1: &VecMachLabel) -> Unit; - fn load_ra(&mut self) -> Reg; - fn has_zbkb(&mut self) -> bool; - fn has_zbb(&mut self) -> bool; - fn shift_int_to_most_significant(&mut self, arg0: Reg, arg1: Type) -> Reg; - fn gen_call( - &mut self, - arg0: SigRef, - arg1: ExternalName, - arg2: RelocDistance, - arg3: ValueSlice, - ) -> InstOutput; - fn gen_call_indirect(&mut self, arg0: SigRef, arg1: Value, arg2: ValueSlice) -> InstOutput; - fn fp_reg(&mut self) -> PReg; - fn sp_reg(&mut self) -> PReg; - fn is_atomic_rmw_max_etc(&mut self, arg0: &AtomicRmwOp) -> Option<(AtomicRmwOp, bool)>; - fn unpack_value_array_2(&mut self, arg0: &ValueArray2) -> (Value, Value); - fn pack_value_array_2(&mut self, arg0: Value, arg1: Value) -> ValueArray2; - fn unpack_value_array_3(&mut self, arg0: &ValueArray3) -> (Value, Value, Value); - fn pack_value_array_3(&mut self, arg0: Value, arg1: Value, arg2: Value) -> ValueArray3; -} - -pub trait ContextIter { - type Context; - type Output; - fn next(&mut self, ctx: &mut Self::Context) -> Option; -} - -pub struct ContextIterWrapper, C: Context> { - iter: I, - _ctx: PhantomData, -} -impl, C: Context> From for ContextIterWrapper { - fn from(iter: I) -> Self { - Self { - iter, - _ctx: PhantomData, - } - } -} -impl, C: Context> ContextIter for ContextIterWrapper { - type Context = C; - type Output = Item; - fn next(&mut self, _ctx: &mut Self::Context) -> Option { - self.iter.next() - } -} - -/// Internal type SideEffectNoResult: defined at src/prelude_lower.isle line 282. -#[derive(Clone, Debug)] -pub enum SideEffectNoResult { - Inst { - inst: MInst, - }, - Inst2 { - inst1: MInst, - inst2: MInst, - }, - Inst3 { - inst1: MInst, - inst2: MInst, - inst3: MInst, - }, -} - -/// Internal type ProducesFlags: defined at src/prelude_lower.isle line 324. -#[derive(Clone, Debug)] -pub enum ProducesFlags { - AlreadyExistingFlags, - ProducesFlagsSideEffect { inst: MInst }, - ProducesFlagsTwiceSideEffect { inst1: MInst, inst2: MInst }, - ProducesFlagsReturnsReg { inst: MInst, result: Reg }, - ProducesFlagsReturnsResultWithConsumer { inst: MInst, result: Reg }, -} - -/// Internal type ConsumesFlags: defined at src/prelude_lower.isle line 346. -#[derive(Clone, Debug)] -pub enum ConsumesFlags { - ConsumesFlagsSideEffect { - inst: MInst, - }, - ConsumesFlagsSideEffect2 { - inst1: MInst, - inst2: MInst, - }, - ConsumesFlagsReturnsResultWithProducer { - inst: MInst, - result: Reg, - }, - ConsumesFlagsReturnsReg { - inst: MInst, - result: Reg, - }, - ConsumesFlagsTwiceReturnsValueRegs { - inst1: MInst, - inst2: MInst, - result: ValueRegs, - }, - ConsumesFlagsFourTimesReturnsValueRegs { - inst1: MInst, - inst2: MInst, - inst3: MInst, - inst4: MInst, - result: ValueRegs, - }, -} - -/// Internal type MInst: defined at src/isa/riscv64/inst.isle line 2. -#[derive(Clone, Debug)] -pub enum MInst { - Nop0, - Nop4, - Lui { - rd: WritableReg, - imm: Imm20, - }, - LoadConst32 { - rd: WritableReg, - imm: u32, - }, - LoadConst64 { - rd: WritableReg, - imm: u64, - }, - Auipc { - rd: WritableReg, - imm: Imm20, - }, - FpuRR { - alu_op: FpuOPRR, - frm: OptionFloatRoundingMode, - rd: WritableReg, - rs: Reg, - }, - AluRRR { - alu_op: AluOPRRR, - rd: WritableReg, - rs1: Reg, - rs2: Reg, - }, - FpuRRR { - alu_op: FpuOPRRR, - frm: OptionFloatRoundingMode, - rd: WritableReg, - rs1: Reg, - rs2: Reg, - }, - FpuRRRR { - alu_op: FpuOPRRRR, - frm: OptionFloatRoundingMode, - rd: WritableReg, - rs1: Reg, - rs2: Reg, - rs3: Reg, - }, - AluRRImm12 { - alu_op: AluOPRRI, - rd: WritableReg, - rs: Reg, - imm12: Imm12, - }, - Load { - rd: WritableReg, - op: LoadOP, - flags: MemFlags, - from: AMode, - }, - Store { - to: AMode, - op: StoreOP, - flags: MemFlags, - src: Reg, - }, - Args { - args: VecArgPair, - }, - Ret { - rets: VecRetPair, - }, - Extend { - rd: WritableReg, - rn: Reg, - signed: bool, - from_bits: u8, - to_bits: u8, - }, - AjustSp { - amount: i64, - }, - Call { - info: BoxCallInfo, - }, - CallInd { - info: BoxCallIndInfo, - }, - TrapIf { - test: Reg, - trap_code: TrapCode, - }, - TrapIfC { - rs1: Reg, - rs2: Reg, - cc: IntCC, - trap_code: TrapCode, - }, - TrapFf { - cc: FloatCC, - x: Reg, - y: Reg, - ty: Type, - tmp: WritableReg, - trap_code: TrapCode, - }, - Jal { - dest: BranchTarget, - }, - CondBr { - taken: BranchTarget, - not_taken: BranchTarget, - kind: IntegerCompare, - }, - LoadExtName { - rd: WritableReg, - name: BoxExternalName, - offset: i64, - }, - LoadAddr { - rd: WritableReg, - mem: AMode, - }, - VirtualSPOffsetAdj { - amount: i64, - }, - Mov { - rd: WritableReg, - rm: Reg, - ty: Type, - }, - MovFromPReg { - rd: WritableReg, - rm: PReg, - }, - Fence { - pred: u8, - succ: u8, - }, - FenceI, - ECall, - EBreak, - Udf { - trap_code: TrapCode, - }, - Jalr { - rd: WritableReg, - base: Reg, - offset: Imm12, - }, - Atomic { - op: AtomicOP, - rd: WritableReg, - addr: Reg, - src: Reg, - amo: AMO, - }, - AtomicStore { - src: Reg, - ty: Type, - p: Reg, - }, - AtomicLoad { - rd: WritableReg, - ty: Type, - p: Reg, - }, - AtomicRmwLoop { - offset: Reg, - op: AtomicRmwOp, - dst: WritableReg, - ty: Type, - p: Reg, - x: Reg, - t0: WritableReg, - }, - Fcmp { - cc: FloatCC, - rd: WritableReg, - rs1: Reg, - rs2: Reg, - ty: Type, - }, - Select { - dst: VecWritableReg, - ty: Type, - condition: Reg, - x: ValueRegs, - y: ValueRegs, - }, - ReferenceCheck { - rd: WritableReg, - op: ReferenceCheckOP, - x: Reg, - }, - BrTable { - index: Reg, - tmp1: WritableReg, - targets: VecBranchTarget, - }, - AtomicCas { - offset: Reg, - t0: WritableReg, - dst: WritableReg, - e: Reg, - addr: Reg, - v: Reg, - ty: Type, - }, - IntSelect { - op: IntSelectOP, - dst: VecWritableReg, - x: ValueRegs, - y: ValueRegs, - ty: Type, - }, - Csr { - csr_op: CsrOP, - rd: WritableReg, - rs: OptionReg, - imm: OptionUimm5, - csr: CsrAddress, - }, - Icmp { - cc: IntCC, - rd: WritableReg, - a: ValueRegs, - b: ValueRegs, - ty: Type, - }, - SelectReg { - rd: WritableReg, - rs1: Reg, - rs2: Reg, - condition: IntegerCompare, - }, - FcvtToInt { - is_sat: bool, - rd: WritableReg, - tmp: WritableReg, - rs: Reg, - is_signed: bool, - in_type: Type, - out_type: Type, - }, - SelectIf { - if_spectre_guard: bool, - rd: VecWritableReg, - test: Reg, - x: ValueRegs, - y: ValueRegs, - }, - RawData { - data: VecU8, - }, - Unwind { - inst: UnwindInst, - }, - DummyUse { - reg: Reg, - }, - FloatRound { - op: FloatRoundOP, - rd: WritableReg, - int_tmp: WritableReg, - f_tmp: WritableReg, - rs: Reg, - ty: Type, - }, - FloatSelect { - op: FloatSelectOP, - rd: WritableReg, - tmp: WritableReg, - rs1: Reg, - rs2: Reg, - ty: Type, - }, - FloatSelectPseudo { - op: FloatSelectOP, - rd: WritableReg, - tmp: WritableReg, - rs1: Reg, - rs2: Reg, - ty: Type, - }, - Popcnt { - sum: WritableReg, - step: WritableReg, - tmp: WritableReg, - rs: Reg, - ty: Type, - }, - Cltz { - leading: bool, - sum: WritableReg, - step: WritableReg, - tmp: WritableReg, - rs: Reg, - ty: Type, - }, - Rev8 { - rs: Reg, - step: WritableReg, - tmp: WritableReg, - rd: WritableReg, - }, - Brev8 { - rs: Reg, - ty: Type, - step: WritableReg, - tmp: WritableReg, - tmp2: WritableReg, - rd: WritableReg, - }, - StackProbeLoop { - guard_size: u32, - probe_count: u32, - tmp: WritableReg, - }, -} - -/// Internal type FloatSelectOP: defined at src/isa/riscv64/inst.isle line 359. -#[derive(Copy, Clone, PartialEq, Eq, Debug)] -pub enum FloatSelectOP { - Max, - Min, -} - -/// Internal type FloatRoundOP: defined at src/isa/riscv64/inst.isle line 364. -#[derive(Copy, Clone, PartialEq, Eq, Debug)] -pub enum FloatRoundOP { - Nearest, - Ceil, - Floor, - Trunc, -} - -/// Internal type CsrOP: defined at src/isa/riscv64/inst.isle line 371. -#[derive(Copy, Clone, PartialEq, Eq, Debug)] -pub enum CsrOP { - Csrrw, - Csrrs, - Csrrc, - Csrrwi, - Csrrsi, - Csrrci, -} - -/// Internal type IntSelectOP: defined at src/isa/riscv64/inst.isle line 380. -#[derive(Copy, Clone, PartialEq, Eq, Debug)] -pub enum IntSelectOP { - Smax, - Umax, - Smin, - Umin, -} - -/// Internal type ReferenceCheckOP: defined at src/isa/riscv64/inst.isle line 387. -#[derive(Copy, Clone, PartialEq, Eq, Debug)] -pub enum ReferenceCheckOP { - IsNull, - IsInvalid, -} - -/// Internal type AtomicOP: defined at src/isa/riscv64/inst.isle line 392. -#[derive(Copy, Clone, PartialEq, Eq, Debug)] -pub enum AtomicOP { - LrW, - ScW, - AmoswapW, - AmoaddW, - AmoxorW, - AmoandW, - AmoorW, - AmominW, - AmomaxW, - AmominuW, - AmomaxuW, - LrD, - ScD, - AmoswapD, - AmoaddD, - AmoxorD, - AmoandD, - AmoorD, - AmominD, - AmomaxD, - AmominuD, - AmomaxuD, -} - -/// Internal type FpuOPRRRR: defined at src/isa/riscv64/inst.isle line 417. -#[derive(Copy, Clone, PartialEq, Eq, Debug)] -pub enum FpuOPRRRR { - FmaddS, - FmsubS, - FnmsubS, - FnmaddS, - FmaddD, - FmsubD, - FnmsubD, - FnmaddD, -} - -/// Internal type FClassResult: defined at src/isa/riscv64/inst.isle line 430. -#[derive(Copy, Clone, PartialEq, Eq, Debug)] -pub enum FClassResult { - NegInfinite, - NegNormal, - NegSubNormal, - NegZero, - PosZero, - PosSubNormal, - PosNormal, - PosInfinite, - SNaN, - QNaN, -} - -/// Internal type FpuOPRR: defined at src/isa/riscv64/inst.isle line 453. -#[derive(Copy, Clone, PartialEq, Eq, Debug)] -pub enum FpuOPRR { - FsqrtS, - FcvtWS, - FcvtWuS, - FmvXW, - FclassS, - FcvtSw, - FcvtSwU, - FmvWX, - FcvtLS, - FcvtLuS, - FcvtSL, - FcvtSLU, - FcvtLD, - FcvtLuD, - FmvXD, - FcvtDL, - FcvtDLu, - FmvDX, - FsqrtD, - FcvtSD, - FcvtDS, - FclassD, - FcvtWD, - FcvtWuD, - FcvtDW, - FcvtDWU, -} - -/// Internal type LoadOP: defined at src/isa/riscv64/inst.isle line 493. -#[derive(Copy, Clone, PartialEq, Eq, Debug)] -pub enum LoadOP { - Lb, - Lh, - Lw, - Lbu, - Lhu, - Lwu, - Ld, - Flw, - Fld, -} - -/// Internal type StoreOP: defined at src/isa/riscv64/inst.isle line 505. -#[derive(Copy, Clone, PartialEq, Eq, Debug)] -pub enum StoreOP { - Sb, - Sh, - Sw, - Sd, - Fsw, - Fsd, -} - -/// Internal type AluOPRRR: defined at src/isa/riscv64/inst.isle line 514. -#[derive(Copy, Clone, PartialEq, Eq, Debug)] -pub enum AluOPRRR { - Add, - Sub, - Sll, - Slt, - SltU, - Sgt, - Sgtu, - Xor, - Srl, - Sra, - Or, - And, - Addw, - Subw, - Sllw, - Srlw, - Sraw, - Mul, - Mulh, - Mulhsu, - Mulhu, - Div, - DivU, - Rem, - RemU, - Mulw, - Divw, - Divuw, - Remw, - Remuw, - Adduw, - Andn, - Bclr, - Bext, - Binv, - Bset, - Clmul, - Clmulh, - Clmulr, - Max, - Maxu, - Min, - Minu, - Orn, - Rol, - Rolw, - Ror, - Rorw, - Sh1add, - Sh1adduw, - Sh2add, - Sh2adduw, - Sh3add, - Sh3adduw, - Xnor, -} - -/// Internal type FpuOPRRR: defined at src/isa/riscv64/inst.isle line 584. -#[derive(Copy, Clone, PartialEq, Eq, Debug)] -pub enum FpuOPRRR { - FaddS, - FsubS, - FmulS, - FdivS, - FsgnjS, - FsgnjnS, - FsgnjxS, - FminS, - FmaxS, - FeqS, - FltS, - FleS, - FaddD, - FsubD, - FmulD, - FdivD, - FsgnjD, - FsgnjnD, - FsgnjxD, - FminD, - FmaxD, - FeqD, - FltD, - FleD, -} - -/// Internal type AluOPRRI: defined at src/isa/riscv64/inst.isle line 617. -#[derive(Copy, Clone, PartialEq, Eq, Debug)] -pub enum AluOPRRI { - Addi, - Slti, - SltiU, - Xori, - Ori, - Andi, - Slli, - Srli, - Srai, - Addiw, - Slliw, - SrliW, - Sraiw, - Bclri, - Bexti, - Binvi, - Bseti, - Rori, - Roriw, - SlliUw, - Clz, - Clzw, - Cpop, - Cpopw, - Ctz, - Ctzw, - Rev8, - Sextb, - Sexth, - Zexth, - Orcb, - Brev8, -} - -/// Internal type FRM: defined at src/isa/riscv64/inst.isle line 653. -#[derive(Copy, Clone, PartialEq, Eq, Debug)] -pub enum FRM { - RNE, - RTZ, - RDN, - RUP, - RMM, - Fcsr, -} - -/// Internal type FFlagsException: defined at src/isa/riscv64/inst.isle line 669. -#[derive(Copy, Clone, PartialEq, Eq, Debug)] -pub enum FFlagsException { - NV, - DZ, - OF, - UF, - NX, -} - -/// Internal type FenceFm: defined at src/isa/riscv64/inst.isle line 688. -#[derive(Copy, Clone, PartialEq, Eq, Debug)] -pub enum FenceFm { - None, - Tso, -} - -// Generated as internal constructor for term output_reg. -pub fn constructor_output_reg(ctx: &mut C, arg0: Reg) -> InstOutput { - let pattern0_0 = arg0; - // Rule at src/prelude_lower.isle line 55. - let expr0_0 = C::value_reg(ctx, pattern0_0); - let expr1_0 = C::output(ctx, expr0_0); - return expr1_0; -} - -// Generated as internal constructor for term output_value. -pub fn constructor_output_value(ctx: &mut C, arg0: Value) -> InstOutput { - let pattern0_0 = arg0; - // Rule at src/prelude_lower.isle line 59. - let expr0_0 = C::put_in_regs(ctx, pattern0_0); - let expr1_0 = C::output(ctx, expr0_0); - return expr1_0; -} - -// Generated as internal constructor for term temp_reg. -pub fn constructor_temp_reg(ctx: &mut C, arg0: Type) -> Reg { - let pattern0_0 = arg0; - // Rule at src/prelude_lower.isle line 79. - let expr0_0 = C::temp_writable_reg(ctx, pattern0_0); - let expr1_0 = C::writable_reg_to_reg(ctx, expr0_0); - return expr1_0; -} - -// Generated as internal constructor for term value_regs_range. -pub fn constructor_value_regs_range(ctx: &mut C, arg0: ValueRegs) -> Range { - let pattern0_0 = arg0; - // Rule at src/prelude_lower.isle line 128. - let expr0_0: usize = 0i128 as usize; - let expr1_0 = C::value_regs_len(ctx, pattern0_0); - let expr2_0 = C::range(ctx, expr0_0, expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term lo_reg. -pub fn constructor_lo_reg(ctx: &mut C, arg0: Value) -> Reg { - let pattern0_0 = arg0; - // Rule at src/prelude_lower.isle line 139. - let expr0_0 = C::put_in_regs(ctx, pattern0_0); - let expr1_0: usize = 0i128 as usize; - let expr2_0 = C::value_regs_get(ctx, expr0_0, expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term emit_side_effect. -pub fn constructor_emit_side_effect(ctx: &mut C, arg0: &SideEffectNoResult) -> Unit { - let pattern0_0 = arg0; - match pattern0_0 { - &SideEffectNoResult::Inst { - inst: ref pattern1_0, - } => { - // Rule at src/prelude_lower.isle line 292. - let expr0_0 = C::emit(ctx, pattern1_0); - return expr0_0; - } - &SideEffectNoResult::Inst2 { - inst1: ref pattern1_0, - inst2: ref pattern1_1, - } => { - // Rule at src/prelude_lower.isle line 294. - let expr0_0 = C::emit(ctx, pattern1_0); - let expr1_0 = C::emit(ctx, pattern1_1); - return expr1_0; - } - &SideEffectNoResult::Inst3 { - inst1: ref pattern1_0, - inst2: ref pattern1_1, - inst3: ref pattern1_2, - } => { - // Rule at src/prelude_lower.isle line 297. - let expr0_0 = C::emit(ctx, pattern1_0); - let expr1_0 = C::emit(ctx, pattern1_1); - let expr2_0 = C::emit(ctx, pattern1_2); - return expr2_0; - } - _ => {} - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "emit_side_effect", "src/prelude_lower.isle line 291" - ); -} - -// Generated as internal constructor for term side_effect. -pub fn constructor_side_effect(ctx: &mut C, arg0: &SideEffectNoResult) -> InstOutput { - let pattern0_0 = arg0; - // Rule at src/prelude_lower.isle line 305. - let expr0_0 = constructor_emit_side_effect(ctx, pattern0_0); - let expr1_0 = C::output_none(ctx); - return expr1_0; -} - -// Generated as internal constructor for term side_effect_concat. -pub fn constructor_side_effect_concat( - ctx: &mut C, - arg0: &SideEffectNoResult, - arg1: &SideEffectNoResult, -) -> SideEffectNoResult { - let pattern0_0 = arg0; - match pattern0_0 { - &SideEffectNoResult::Inst { - inst: ref pattern1_0, - } => { - let pattern2_0 = arg1; - match pattern2_0 { - &SideEffectNoResult::Inst { - inst: ref pattern3_0, - } => { - // Rule at src/prelude_lower.isle line 310. - let expr0_0 = SideEffectNoResult::Inst2 { - inst1: pattern1_0.clone(), - inst2: pattern3_0.clone(), - }; - return expr0_0; - } - &SideEffectNoResult::Inst2 { - inst1: ref pattern3_0, - inst2: ref pattern3_1, - } => { - // Rule at src/prelude_lower.isle line 312. - let expr0_0 = SideEffectNoResult::Inst3 { - inst1: pattern1_0.clone(), - inst2: pattern3_0.clone(), - inst3: pattern3_1.clone(), - }; - return expr0_0; - } - _ => {} - } - } - &SideEffectNoResult::Inst2 { - inst1: ref pattern1_0, - inst2: ref pattern1_1, - } => { - let pattern2_0 = arg1; - if let &SideEffectNoResult::Inst { - inst: ref pattern3_0, - } = pattern2_0 - { - // Rule at src/prelude_lower.isle line 314. - let expr0_0 = SideEffectNoResult::Inst3 { - inst1: pattern1_0.clone(), - inst2: pattern1_1.clone(), - inst3: pattern3_0.clone(), - }; - return expr0_0; - } - } - _ => {} - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "side_effect_concat", "src/prelude_lower.isle line 309" - ); -} - -// Generated as internal constructor for term produces_flags_append. -pub fn constructor_produces_flags_append( - ctx: &mut C, - arg0: &ProducesFlags, - arg1: &MInst, -) -> ProducesFlags { - let pattern0_0 = arg0; - if let &ProducesFlags::ProducesFlagsSideEffect { - inst: ref pattern1_0, - } = pattern0_0 - { - let pattern2_0 = arg1; - // Rule at src/prelude_lower.isle line 339. - let expr0_0 = ProducesFlags::ProducesFlagsTwiceSideEffect { - inst1: pattern1_0.clone(), - inst2: pattern2_0.clone(), - }; - return expr0_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "produces_flags_append", "src/prelude_lower.isle line 338" - ); -} - -// Generated as internal constructor for term produces_flags_get_reg. -pub fn constructor_produces_flags_get_reg(ctx: &mut C, arg0: &ProducesFlags) -> Reg { - let pattern0_0 = arg0; - if let &ProducesFlags::ProducesFlagsReturnsReg { - inst: ref pattern1_0, - result: pattern1_1, - } = pattern0_0 - { - // Rule at src/prelude_lower.isle line 364. - return pattern1_1; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "produces_flags_get_reg", "src/prelude_lower.isle line 363" - ); -} - -// Generated as internal constructor for term produces_flags_ignore. -pub fn constructor_produces_flags_ignore( - ctx: &mut C, - arg0: &ProducesFlags, -) -> ProducesFlags { - let pattern0_0 = arg0; - match pattern0_0 { - &ProducesFlags::ProducesFlagsReturnsReg { - inst: ref pattern1_0, - result: pattern1_1, - } => { - // Rule at src/prelude_lower.isle line 369. - let expr0_0 = ProducesFlags::ProducesFlagsSideEffect { - inst: pattern1_0.clone(), - }; - return expr0_0; - } - &ProducesFlags::ProducesFlagsReturnsResultWithConsumer { - inst: ref pattern1_0, - result: pattern1_1, - } => { - // Rule at src/prelude_lower.isle line 371. - let expr0_0 = ProducesFlags::ProducesFlagsSideEffect { - inst: pattern1_0.clone(), - }; - return expr0_0; - } - _ => {} - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "produces_flags_ignore", "src/prelude_lower.isle line 368" - ); -} - -// Generated as internal constructor for term consumes_flags_concat. -pub fn constructor_consumes_flags_concat( - ctx: &mut C, - arg0: &ConsumesFlags, - arg1: &ConsumesFlags, -) -> ConsumesFlags { - let pattern0_0 = arg0; - match pattern0_0 { - &ConsumesFlags::ConsumesFlagsSideEffect { - inst: ref pattern1_0, - } => { - let pattern2_0 = arg1; - if let &ConsumesFlags::ConsumesFlagsSideEffect { - inst: ref pattern3_0, - } = pattern2_0 - { - // Rule at src/prelude_lower.isle line 384. - let expr0_0 = ConsumesFlags::ConsumesFlagsSideEffect2 { - inst1: pattern1_0.clone(), - inst2: pattern3_0.clone(), - }; - return expr0_0; - } - } - &ConsumesFlags::ConsumesFlagsReturnsReg { - inst: ref pattern1_0, - result: pattern1_1, - } => { - let pattern2_0 = arg1; - if let &ConsumesFlags::ConsumesFlagsReturnsReg { - inst: ref pattern3_0, - result: pattern3_1, - } = pattern2_0 - { - // Rule at src/prelude_lower.isle line 378. - let expr0_0 = C::value_regs(ctx, pattern1_1, pattern3_1); - let expr1_0 = ConsumesFlags::ConsumesFlagsTwiceReturnsValueRegs { - inst1: pattern1_0.clone(), - inst2: pattern3_0.clone(), - result: expr0_0, - }; - return expr1_0; - } - } - _ => {} - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "consumes_flags_concat", "src/prelude_lower.isle line 377" - ); -} - -// Generated as internal constructor for term with_flags. -pub fn constructor_with_flags( - ctx: &mut C, - arg0: &ProducesFlags, - arg1: &ConsumesFlags, -) -> ValueRegs { - let pattern0_0 = arg0; - match pattern0_0 { - &ProducesFlags::ProducesFlagsSideEffect { - inst: ref pattern1_0, - } => { - let pattern2_0 = arg1; - match pattern2_0 { - &ConsumesFlags::ConsumesFlagsReturnsReg { - inst: ref pattern3_0, - result: pattern3_1, - } => { - // Rule at src/prelude_lower.isle line 415. - let expr0_0 = C::emit(ctx, pattern1_0); - let expr1_0 = C::emit(ctx, pattern3_0); - let expr2_0 = C::value_reg(ctx, pattern3_1); - return expr2_0; - } - &ConsumesFlags::ConsumesFlagsTwiceReturnsValueRegs { - inst1: ref pattern3_0, - inst2: ref pattern3_1, - result: pattern3_2, - } => { - // Rule at src/prelude_lower.isle line 421. - let expr0_0 = C::emit(ctx, pattern1_0); - let expr1_0 = C::emit(ctx, pattern3_0); - let expr2_0 = C::emit(ctx, pattern3_1); - return pattern3_2; - } - &ConsumesFlags::ConsumesFlagsFourTimesReturnsValueRegs { - inst1: ref pattern3_0, - inst2: ref pattern3_1, - inst3: ref pattern3_2, - inst4: ref pattern3_3, - result: pattern3_4, - } => { - // Rule at src/prelude_lower.isle line 433. - let expr0_0 = C::emit(ctx, pattern1_0); - let expr1_0 = C::emit(ctx, pattern3_0); - let expr2_0 = C::emit(ctx, pattern3_1); - let expr3_0 = C::emit(ctx, pattern3_2); - let expr4_0 = C::emit(ctx, pattern3_3); - return pattern3_4; - } - _ => {} - } - } - &ProducesFlags::ProducesFlagsReturnsResultWithConsumer { - inst: ref pattern1_0, - result: pattern1_1, - } => { - let pattern2_0 = arg1; - match pattern2_0 { - &ConsumesFlags::ConsumesFlagsSideEffect { - inst: ref pattern3_0, - } => { - // Rule at src/prelude_lower.isle line 409. - let expr0_0 = C::emit(ctx, pattern1_0); - let expr1_0 = C::emit(ctx, pattern3_0); - let expr2_0 = C::value_reg(ctx, pattern1_1); - return expr2_0; - } - &ConsumesFlags::ConsumesFlagsReturnsResultWithProducer { - inst: ref pattern3_0, - result: pattern3_1, - } => { - // Rule at src/prelude_lower.isle line 401. - let expr0_0 = C::emit(ctx, pattern1_0); - let expr1_0 = C::emit(ctx, pattern3_0); - let expr2_0 = C::value_regs(ctx, pattern1_1, pattern3_1); - return expr2_0; - } - _ => {} - } - } - &ProducesFlags::ProducesFlagsTwiceSideEffect { - inst1: ref pattern1_0, - inst2: ref pattern1_1, - } => { - let pattern2_0 = arg1; - match pattern2_0 { - &ConsumesFlags::ConsumesFlagsReturnsReg { - inst: ref pattern3_0, - result: pattern3_1, - } => { - // Rule at src/prelude_lower.isle line 449. - let expr0_0 = C::emit(ctx, pattern1_0); - let expr1_0 = C::emit(ctx, pattern1_1); - let expr2_0 = C::emit(ctx, pattern3_0); - let expr3_0 = C::value_reg(ctx, pattern3_1); - return expr3_0; - } - &ConsumesFlags::ConsumesFlagsTwiceReturnsValueRegs { - inst1: ref pattern3_0, - inst2: ref pattern3_1, - result: pattern3_2, - } => { - // Rule at src/prelude_lower.isle line 456. - let expr0_0 = C::emit(ctx, pattern1_0); - let expr1_0 = C::emit(ctx, pattern1_1); - let expr2_0 = C::emit(ctx, pattern3_0); - let expr3_0 = C::emit(ctx, pattern3_1); - return pattern3_2; - } - &ConsumesFlags::ConsumesFlagsFourTimesReturnsValueRegs { - inst1: ref pattern3_0, - inst2: ref pattern3_1, - inst3: ref pattern3_2, - inst4: ref pattern3_3, - result: pattern3_4, - } => { - // Rule at src/prelude_lower.isle line 469. - let expr0_0 = C::emit(ctx, pattern1_0); - let expr1_0 = C::emit(ctx, pattern1_1); - let expr2_0 = C::emit(ctx, pattern3_0); - let expr3_0 = C::emit(ctx, pattern3_1); - let expr4_0 = C::emit(ctx, pattern3_2); - let expr5_0 = C::emit(ctx, pattern3_3); - return pattern3_4; - } - _ => {} - } - } - _ => {} - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "with_flags", "src/prelude_lower.isle line 399" - ); -} - -// Generated as internal constructor for term with_flags_reg. -pub fn constructor_with_flags_reg( - ctx: &mut C, - arg0: &ProducesFlags, - arg1: &ConsumesFlags, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/prelude_lower.isle line 487. - let expr0_0 = constructor_with_flags(ctx, pattern0_0, pattern1_0); - let expr1_0: usize = 0i128 as usize; - let expr2_0 = C::value_regs_get(ctx, expr0_0, expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term flags_to_producesflags. -pub fn constructor_flags_to_producesflags(ctx: &mut C, arg0: Value) -> ProducesFlags { - let pattern0_0 = arg0; - // Rule at src/prelude_lower.isle line 494. - let expr0_0 = C::mark_value_used(ctx, pattern0_0); - let expr1_0 = ProducesFlags::AlreadyExistingFlags; - return expr1_0; -} - -// Generated as internal constructor for term with_flags_side_effect. -pub fn constructor_with_flags_side_effect( - ctx: &mut C, - arg0: &ProducesFlags, - arg1: &ConsumesFlags, -) -> SideEffectNoResult { - let pattern0_0 = arg0; - match pattern0_0 { - &ProducesFlags::AlreadyExistingFlags => { - let pattern2_0 = arg1; - match pattern2_0 { - &ConsumesFlags::ConsumesFlagsSideEffect { - inst: ref pattern3_0, - } => { - // Rule at src/prelude_lower.isle line 505. - let expr0_0 = SideEffectNoResult::Inst { - inst: pattern3_0.clone(), - }; - return expr0_0; - } - &ConsumesFlags::ConsumesFlagsSideEffect2 { - inst1: ref pattern3_0, - inst2: ref pattern3_1, - } => { - // Rule at src/prelude_lower.isle line 510. - let expr0_0 = SideEffectNoResult::Inst2 { - inst1: pattern3_0.clone(), - inst2: pattern3_1.clone(), - }; - return expr0_0; - } - _ => {} - } - } - &ProducesFlags::ProducesFlagsSideEffect { - inst: ref pattern1_0, - } => { - let pattern2_0 = arg1; - match pattern2_0 { - &ConsumesFlags::ConsumesFlagsSideEffect { - inst: ref pattern3_0, - } => { - // Rule at src/prelude_lower.isle line 515. - let expr0_0 = SideEffectNoResult::Inst2 { - inst1: pattern1_0.clone(), - inst2: pattern3_0.clone(), - }; - return expr0_0; - } - &ConsumesFlags::ConsumesFlagsSideEffect2 { - inst1: ref pattern3_0, - inst2: ref pattern3_1, - } => { - // Rule at src/prelude_lower.isle line 520. - let expr0_0 = SideEffectNoResult::Inst3 { - inst1: pattern1_0.clone(), - inst2: pattern3_0.clone(), - inst3: pattern3_1.clone(), - }; - return expr0_0; - } - _ => {} - } - } - &ProducesFlags::ProducesFlagsTwiceSideEffect { - inst1: ref pattern1_0, - inst2: ref pattern1_1, - } => { - let pattern2_0 = arg1; - if let &ConsumesFlags::ConsumesFlagsSideEffect { - inst: ref pattern3_0, - } = pattern2_0 - { - // Rule at src/prelude_lower.isle line 525. - let expr0_0 = SideEffectNoResult::Inst3 { - inst1: pattern1_0.clone(), - inst2: pattern1_1.clone(), - inst3: pattern3_0.clone(), - }; - return expr0_0; - } - } - _ => {} - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "with_flags_side_effect", "src/prelude_lower.isle line 503" - ); -} - -// Generated as internal constructor for term lower_return. -pub fn constructor_lower_return( - ctx: &mut C, - arg0: Range, - arg1: ValueSlice, -) -> InstOutput { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/prelude_lower.isle line 705. - let expr0_0 = C::gen_return(ctx, pattern1_0); - let expr1_0 = C::output_none(ctx); - return expr1_0; -} - -// Generated as internal constructor for term value_regs_zero. -pub fn constructor_value_regs_zero(ctx: &mut C) -> ValueRegs { - // Rule at src/isa/riscv64/inst.isle line 718. - let expr0_0: Type = I64; - let expr1_0: u64 = 0i128 as u64; - let expr2_0 = C::imm(ctx, expr0_0, expr1_0); - let expr3_0: Type = I64; - let expr4_0: u64 = 0i128 as u64; - let expr5_0 = C::imm(ctx, expr3_0, expr4_0); - let expr6_0 = C::value_regs(ctx, expr2_0, expr5_0); - return expr6_0; -} - -// Generated as internal constructor for term gen_float_round. -pub fn constructor_gen_float_round( - ctx: &mut C, - arg0: &FloatRoundOP, - arg1: Reg, - arg2: Type, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/riscv64/inst.isle line 723. - let expr0_0 = C::temp_writable_reg(ctx, pattern2_0); - let expr1_0: Type = I64; - let expr2_0 = C::temp_writable_reg(ctx, expr1_0); - let expr3_0: Type = F64; - let expr4_0 = C::temp_writable_reg(ctx, expr3_0); - let expr5_0 = MInst::FloatRound { - op: pattern0_0.clone(), - rd: expr0_0, - int_tmp: expr2_0, - f_tmp: expr4_0, - rs: pattern1_0, - ty: pattern2_0, - }; - let expr6_0 = C::emit(ctx, &expr5_0); - let expr7_0 = C::writable_reg_to_reg(ctx, expr0_0); - return expr7_0; -} - -// Generated as internal constructor for term gen_float_select_pseudo. -pub fn constructor_gen_float_select_pseudo( - ctx: &mut C, - arg0: &FloatSelectOP, - arg1: Reg, - arg2: Reg, - arg3: Type, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - // Rule at src/isa/riscv64/inst.isle line 733. - let expr0_0 = C::temp_writable_reg(ctx, pattern3_0); - let expr1_0: Type = I64; - let expr2_0 = C::temp_writable_reg(ctx, expr1_0); - let expr3_0 = MInst::FloatSelectPseudo { - op: pattern0_0.clone(), - rd: expr0_0, - tmp: expr2_0, - rs1: pattern1_0, - rs2: pattern2_0, - ty: pattern3_0, - }; - let expr4_0 = C::emit(ctx, &expr3_0); - let expr5_0 = C::writable_reg_to_reg(ctx, expr0_0); - return expr5_0; -} - -// Generated as internal constructor for term gen_float_select. -pub fn constructor_gen_float_select( - ctx: &mut C, - arg0: &FloatSelectOP, - arg1: Reg, - arg2: Reg, - arg3: Type, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - // Rule at src/isa/riscv64/inst.isle line 742. - let expr0_0 = C::temp_writable_reg(ctx, pattern3_0); - let expr1_0: Type = I64; - let expr2_0 = C::temp_writable_reg(ctx, expr1_0); - let expr3_0 = MInst::FloatSelect { - op: pattern0_0.clone(), - rd: expr0_0, - tmp: expr2_0, - rs1: pattern1_0, - rs2: pattern2_0, - ty: pattern3_0, - }; - let expr4_0 = C::emit(ctx, &expr3_0); - let expr5_0 = C::writable_reg_to_reg(ctx, expr0_0); - return expr5_0; -} - -// Generated as internal constructor for term fpu_rr. -pub fn constructor_fpu_rr(ctx: &mut C, arg0: &FpuOPRR, arg1: Type, arg2: Reg) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/riscv64/inst.isle line 771. - let expr0_0 = C::temp_writable_reg(ctx, pattern1_0); - let expr1_0 = C::gen_default_frm(ctx); - let expr2_0 = MInst::FpuRR { - alu_op: pattern0_0.clone(), - frm: expr1_0, - rd: expr0_0, - rs: pattern2_0, - }; - let expr3_0 = C::emit(ctx, &expr2_0); - let expr4_0 = C::writable_reg_to_reg(ctx, expr0_0); - return expr4_0; -} - -// Generated as internal constructor for term alu_rrr. -pub fn constructor_alu_rrr(ctx: &mut C, arg0: &AluOPRRR, arg1: Reg, arg2: Reg) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/riscv64/inst.isle line 778. - let expr0_0: Type = I64; - let expr1_0 = C::temp_writable_reg(ctx, expr0_0); - let expr2_0 = MInst::AluRRR { - alu_op: pattern0_0.clone(), - rd: expr1_0, - rs1: pattern1_0, - rs2: pattern2_0, - }; - let expr3_0 = C::emit(ctx, &expr2_0); - let expr4_0 = C::writable_reg_to_reg(ctx, expr1_0); - return expr4_0; -} - -// Generated as internal constructor for term alu_add. -pub fn constructor_alu_add(ctx: &mut C, arg0: Reg, arg1: Reg) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/riscv64/inst.isle line 786. - let expr0_0 = AluOPRRR::Add; - let expr1_0 = constructor_alu_rrr(ctx, &expr0_0, pattern0_0, pattern1_0); - return expr1_0; -} - -// Generated as internal constructor for term alu_and. -pub fn constructor_alu_and(ctx: &mut C, arg0: Reg, arg1: Reg) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/riscv64/inst.isle line 791. - let expr0_0 = AluOPRRR::And; - let expr1_0 = constructor_alu_rrr(ctx, &expr0_0, pattern0_0, pattern1_0); - return expr1_0; -} - -// Generated as internal constructor for term alu_sub. -pub fn constructor_alu_sub(ctx: &mut C, arg0: Reg, arg1: Reg) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/riscv64/inst.isle line 798. - let expr0_0 = AluOPRRR::Sub; - let expr1_0 = constructor_alu_rrr(ctx, &expr0_0, pattern0_0, pattern1_0); - return expr1_0; -} - -// Generated as internal constructor for term fpu_rrr. -pub fn constructor_fpu_rrr( - ctx: &mut C, - arg0: &FpuOPRRR, - arg1: Type, - arg2: Reg, - arg3: Reg, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - // Rule at src/isa/riscv64/inst.isle line 806. - let expr0_0 = C::temp_writable_reg(ctx, pattern1_0); - let expr1_0 = C::gen_default_frm(ctx); - let expr2_0 = MInst::FpuRRR { - alu_op: pattern0_0.clone(), - frm: expr1_0, - rd: expr0_0, - rs1: pattern2_0, - rs2: pattern3_0, - }; - let expr3_0 = C::emit(ctx, &expr2_0); - let expr4_0 = C::writable_reg_to_reg(ctx, expr0_0); - return expr4_0; -} - -// Generated as internal constructor for term fpu_rrrr. -pub fn constructor_fpu_rrrr( - ctx: &mut C, - arg0: &FpuOPRRRR, - arg1: Type, - arg2: Reg, - arg3: Reg, - arg4: Reg, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - let pattern4_0 = arg4; - // Rule at src/isa/riscv64/inst.isle line 814. - let expr0_0 = C::temp_writable_reg(ctx, pattern1_0); - let expr1_0 = C::gen_default_frm(ctx); - let expr2_0 = MInst::FpuRRRR { - alu_op: pattern0_0.clone(), - frm: expr1_0, - rd: expr0_0, - rs1: pattern2_0, - rs2: pattern3_0, - rs3: pattern4_0, - }; - let expr3_0 = C::emit(ctx, &expr2_0); - let expr4_0 = C::writable_reg_to_reg(ctx, expr0_0); - return expr4_0; -} - -// Generated as internal constructor for term alu_rr_imm12. -pub fn constructor_alu_rr_imm12( - ctx: &mut C, - arg0: &AluOPRRI, - arg1: Reg, - arg2: Imm12, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/riscv64/inst.isle line 822. - let expr0_0: Type = I64; - let expr1_0 = C::temp_writable_reg(ctx, expr0_0); - let expr2_0 = MInst::AluRRImm12 { - alu_op: pattern0_0.clone(), - rd: expr1_0, - rs: pattern1_0, - imm12: pattern2_0, - }; - let expr3_0 = C::emit(ctx, &expr2_0); - let expr4_0 = C::writable_reg_to_reg(ctx, expr1_0); - return expr4_0; -} - -// Generated as internal constructor for term alu_andi. -pub fn constructor_alu_andi(ctx: &mut C, arg0: Reg, arg1: i32) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/riscv64/inst.isle line 828. - let expr0_0 = AluOPRRI::Andi; - let expr1_0 = C::imm12_const(ctx, pattern1_0); - let expr2_0 = constructor_alu_rr_imm12(ctx, &expr0_0, pattern0_0, expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term alu_slli. -pub fn constructor_alu_slli(ctx: &mut C, arg0: Reg, arg1: i32) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/riscv64/inst.isle line 833. - let expr0_0 = AluOPRRI::Slli; - let expr1_0 = C::imm12_const(ctx, pattern1_0); - let expr2_0 = constructor_alu_rr_imm12(ctx, &expr0_0, pattern0_0, expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term alu_srli. -pub fn constructor_alu_srli(ctx: &mut C, arg0: Reg, arg1: i32) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/riscv64/inst.isle line 836. - let expr0_0 = AluOPRRI::Srli; - let expr1_0 = C::imm12_const(ctx, pattern1_0); - let expr2_0 = constructor_alu_rr_imm12(ctx, &expr0_0, pattern0_0, expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term alu_rr_funct12. -pub fn constructor_alu_rr_funct12(ctx: &mut C, arg0: &AluOPRRI, arg1: Reg) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/riscv64/inst.isle line 842. - let expr0_0: Type = I64; - let expr1_0 = C::temp_writable_reg(ctx, expr0_0); - let expr2_0 = constructor_imm12_zero(ctx); - let expr3_0 = MInst::AluRRImm12 { - alu_op: pattern0_0.clone(), - rd: expr1_0, - rs: pattern1_0, - imm12: expr2_0, - }; - let expr4_0 = C::emit(ctx, &expr3_0); - let expr5_0 = C::writable_reg_to_reg(ctx, expr1_0); - return expr5_0; -} - -// Generated as internal constructor for term ext_int_if_need. -pub fn constructor_ext_int_if_need( - ctx: &mut C, - arg0: bool, - arg1: ValueRegs, - arg2: Type, -) -> ValueRegs { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - if pattern2_0 == I64 { - // Rule at src/isa/riscv64/inst.isle line 856. - return pattern1_0; - } - if pattern2_0 == I128 { - // Rule at src/isa/riscv64/inst.isle line 859. - return pattern1_0; - } - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/riscv64/inst.isle line 850. - let expr0_0 = constructor_convert_valueregs_reg(ctx, pattern1_0); - let expr1_0 = C::ty_bits(ctx, pattern2_0); - let expr2_0: u8 = 64i128 as u8; - let expr3_0 = constructor_gen_extend(ctx, expr0_0, pattern0_0, expr1_0, expr2_0); - let expr4_0 = C::value_reg(ctx, expr3_0); - return expr4_0; -} - -// Generated as internal constructor for term select_addi. -pub fn constructor_select_addi(ctx: &mut C, arg0: Type) -> AluOPRRI { - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::fits_in_32(ctx, pattern0_0) { - // Rule at src/isa/riscv64/inst.isle line 875. - let expr0_0 = AluOPRRI::Addiw; - return expr0_0; - } - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::fits_in_64(ctx, pattern0_0) { - // Rule at src/isa/riscv64/inst.isle line 876. - let expr0_0 = AluOPRRI::Addi; - return expr0_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "select_addi", "src/isa/riscv64/inst.isle line 874" - ); -} - -// Generated as internal constructor for term bnot_128. -pub fn constructor_bnot_128(ctx: &mut C, arg0: ValueRegs) -> ValueRegs { - let pattern0_0 = arg0; - // Rule at src/isa/riscv64/inst.isle line 881. - let expr0_0: usize = 0i128 as usize; - let expr1_0 = C::value_regs_get(ctx, pattern0_0, expr0_0); - let expr2_0 = constructor_gen_bit_not(ctx, expr1_0); - let expr3_0: usize = 1i128 as usize; - let expr4_0 = C::value_regs_get(ctx, pattern0_0, expr3_0); - let expr5_0 = constructor_gen_bit_not(ctx, expr4_0); - let expr6_0 = C::value_regs(ctx, expr2_0, expr5_0); - return expr6_0; -} - -// Generated as internal constructor for term lower_bit_reverse. -pub fn constructor_lower_bit_reverse(ctx: &mut C, arg0: Reg, arg1: Type) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - if pattern1_0 == I8 { - // Rule at src/isa/riscv64/inst.isle line 892. - let expr0_0: Type = I8; - let expr1_0 = constructor_gen_brev8(ctx, pattern0_0, expr0_0); - return expr1_0; - } - if pattern1_0 == I16 { - // Rule at src/isa/riscv64/inst.isle line 896. - let expr0_0: Type = I16; - let expr1_0 = constructor_gen_brev8(ctx, pattern0_0, expr0_0); - let expr2_0 = constructor_gen_rev8(ctx, expr1_0); - let expr3_0 = AluOPRRI::Srli; - let expr4_0: i32 = 48i128 as i32; - let expr5_0 = C::imm12_const(ctx, expr4_0); - let expr6_0 = constructor_alu_rr_imm12(ctx, &expr3_0, expr2_0, expr5_0); - return expr6_0; - } - if pattern1_0 == I32 { - // Rule at src/isa/riscv64/inst.isle line 904. - let expr0_0: Type = I32; - let expr1_0 = constructor_gen_brev8(ctx, pattern0_0, expr0_0); - let expr2_0 = constructor_gen_rev8(ctx, expr1_0); - let expr3_0 = AluOPRRI::Srli; - let expr4_0: i32 = 32i128 as i32; - let expr5_0 = C::imm12_const(ctx, expr4_0); - let expr6_0 = constructor_alu_rr_imm12(ctx, &expr3_0, expr2_0, expr5_0); - return expr6_0; - } - if pattern1_0 == I64 { - // Rule at src/isa/riscv64/inst.isle line 912. - let expr0_0 = constructor_gen_rev8(ctx, pattern0_0); - let expr1_0: Type = I64; - let expr2_0 = constructor_gen_brev8(ctx, expr0_0, expr1_0); - return expr2_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "lower_bit_reverse", "src/isa/riscv64/inst.isle line 889" - ); -} - -// Generated as internal constructor for term imm12_zero. -pub fn constructor_imm12_zero(ctx: &mut C) -> Imm12 { - // Rule at src/isa/riscv64/inst.isle line 920. - let expr0_0: i32 = 0i128 as i32; - let expr1_0 = C::imm12_const(ctx, expr0_0); - return expr1_0; -} - -// Generated as internal constructor for term lower_ctz. -pub fn constructor_lower_ctz(ctx: &mut C, arg0: Type, arg1: Reg) -> Reg { - let pattern0_0 = arg0; - if pattern0_0 == I32 { - let pattern2_0 = arg1; - let mut closure3 = || { - let expr0_0 = C::has_b(ctx); - return Some(expr0_0); - }; - if let Some(pattern3_0) = closure3() { - if pattern3_0 == true { - // Rule at src/isa/riscv64/inst.isle line 934. - let expr0_0 = AluOPRRI::Ctzw; - let expr1_0 = constructor_alu_rr_funct12(ctx, &expr0_0, pattern2_0); - return expr1_0; - } - } - } - if pattern0_0 == I64 { - let pattern2_0 = arg1; - let mut closure3 = || { - let expr0_0 = C::has_b(ctx); - return Some(expr0_0); - }; - if let Some(pattern3_0) = closure3() { - if pattern3_0 == true { - // Rule at src/isa/riscv64/inst.isle line 929. - let expr0_0 = AluOPRRI::Ctz; - let expr1_0 = constructor_alu_rr_funct12(ctx, &expr0_0, pattern2_0); - return expr1_0; - } - } - } - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let mut closure2 = || { - let expr0_0 = C::has_b(ctx); - return Some(expr0_0); - }; - if let Some(pattern2_0) = closure2() { - if pattern2_0 == true { - // Rule at src/isa/riscv64/inst.isle line 939. - let expr0_0 = AluOPRRI::Bseti; - let expr1_0 = C::ty_bits(ctx, pattern0_0); - let expr2_0 = C::u8_as_i32(ctx, expr1_0); - let expr3_0 = C::imm12_const(ctx, expr2_0); - let expr4_0 = constructor_alu_rr_imm12(ctx, &expr0_0, pattern1_0, expr3_0); - let expr5_0 = AluOPRRI::Ctzw; - let expr6_0 = constructor_alu_rr_funct12(ctx, &expr5_0, pattern1_0); - return expr6_0; - } - } - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let mut closure2 = || { - let expr0_0 = C::has_b(ctx); - return Some(expr0_0); - }; - if let Some(pattern2_0) = closure2() { - if pattern2_0 == false { - // Rule at src/isa/riscv64/inst.isle line 925. - let expr0_0: bool = false; - let expr1_0 = constructor_gen_cltz(ctx, expr0_0, pattern1_0, pattern0_0); - return expr1_0; - } - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "lower_ctz", "src/isa/riscv64/inst.isle line 923" - ); -} - -// Generated as internal constructor for term lower_ctz_128. -pub fn constructor_lower_ctz_128(ctx: &mut C, arg0: ValueRegs) -> ValueRegs { - let pattern0_0 = arg0; - // Rule at src/isa/riscv64/inst.isle line 949. - let expr0_0: Type = I64; - let expr1_0: usize = 0i128 as usize; - let expr2_0 = C::value_regs_get(ctx, pattern0_0, expr1_0); - let expr3_0 = constructor_lower_ctz(ctx, expr0_0, expr2_0); - let expr4_0: Type = I64; - let expr5_0: usize = 1i128 as usize; - let expr6_0 = C::value_regs_get(ctx, pattern0_0, expr5_0); - let expr7_0 = constructor_lower_ctz(ctx, expr4_0, expr6_0); - let expr8_0: u64 = 64i128 as u64; - let expr9_0 = C::load_u64_constant(ctx, expr8_0); - let expr10_0 = IntCC::Equal; - let expr11_0 = C::zero_reg(ctx); - let expr12_0 = C::gen_select_reg(ctx, &expr10_0, expr9_0, expr3_0, expr7_0, expr11_0); - let expr13_0 = constructor_alu_add(ctx, expr3_0, expr12_0); - let expr14_0: u64 = 0i128 as u64; - let expr15_0 = C::load_u64_constant(ctx, expr14_0); - let expr16_0 = C::value_regs(ctx, expr13_0, expr15_0); - return expr16_0; -} - -// Generated as internal constructor for term lower_clz. -pub fn constructor_lower_clz(ctx: &mut C, arg0: Type, arg1: Reg) -> Reg { - let pattern0_0 = arg0; - if pattern0_0 == I32 { - let pattern2_0 = arg1; - let mut closure3 = || { - let expr0_0 = C::has_b(ctx); - return Some(expr0_0); - }; - if let Some(pattern3_0) = closure3() { - if pattern3_0 == true { - // Rule at src/isa/riscv64/inst.isle line 978. - let expr0_0 = AluOPRRI::Clzw; - let expr1_0 = constructor_alu_rr_funct12(ctx, &expr0_0, pattern2_0); - return expr1_0; - } - } - } - if pattern0_0 == I64 { - let pattern2_0 = arg1; - let mut closure3 = || { - let expr0_0 = C::has_b(ctx); - return Some(expr0_0); - }; - if let Some(pattern3_0) = closure3() { - if pattern3_0 == true { - // Rule at src/isa/riscv64/inst.isle line 974. - let expr0_0 = AluOPRRI::Clz; - let expr1_0 = constructor_alu_rr_funct12(ctx, &expr0_0, pattern2_0); - return expr1_0; - } - } - } - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let mut closure2 = || { - let expr0_0 = C::has_b(ctx); - return Some(expr0_0); - }; - if let Some(pattern2_0) = closure2() { - if pattern2_0 == true { - // Rule at src/isa/riscv64/inst.isle line 984. - let expr0_0: bool = false; - let expr1_0 = C::value_reg(ctx, pattern1_0); - let expr2_0 = constructor_ext_int_if_need(ctx, expr0_0, expr1_0, pattern0_0); - let expr3_0 = constructor_convert_valueregs_reg(ctx, expr2_0); - let expr4_0 = AluOPRRI::Clz; - let expr5_0 = constructor_alu_rr_funct12(ctx, &expr4_0, expr3_0); - let expr6_0 = AluOPRRI::Addi; - let expr7_0 = C::ty_bits(ctx, pattern0_0); - let expr8_0 = C::u8_as_i32(ctx, expr7_0); - let expr9_0: i32 = -64i128 as i32; - let expr10_0 = C::imm12_const_add(ctx, expr8_0, expr9_0); - let expr11_0 = constructor_alu_rr_imm12(ctx, &expr6_0, expr5_0, expr10_0); - return expr11_0; - } - } - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let mut closure2 = || { - let expr0_0 = C::has_b(ctx); - return Some(expr0_0); - }; - if let Some(pattern2_0) = closure2() { - if pattern2_0 == false { - // Rule at src/isa/riscv64/inst.isle line 971. - let expr0_0: bool = true; - let expr1_0 = constructor_gen_cltz(ctx, expr0_0, pattern1_0, pattern0_0); - return expr1_0; - } - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "lower_clz", "src/isa/riscv64/inst.isle line 969" - ); -} - -// Generated as internal constructor for term lower_clz_i128. -pub fn constructor_lower_clz_i128(ctx: &mut C, arg0: ValueRegs) -> ValueRegs { - let pattern0_0 = arg0; - // Rule at src/isa/riscv64/inst.isle line 1006. - let expr0_0: Type = I64; - let expr1_0: usize = 1i128 as usize; - let expr2_0 = C::value_regs_get(ctx, pattern0_0, expr1_0); - let expr3_0 = constructor_lower_clz(ctx, expr0_0, expr2_0); - let expr4_0: Type = I64; - let expr5_0: usize = 0i128 as usize; - let expr6_0 = C::value_regs_get(ctx, pattern0_0, expr5_0); - let expr7_0 = constructor_lower_clz(ctx, expr4_0, expr6_0); - let expr8_0: u64 = 64i128 as u64; - let expr9_0 = C::load_u64_constant(ctx, expr8_0); - let expr10_0 = IntCC::Equal; - let expr11_0 = C::zero_reg(ctx); - let expr12_0 = C::gen_select_reg(ctx, &expr10_0, expr9_0, expr3_0, expr7_0, expr11_0); - let expr13_0 = constructor_alu_add(ctx, expr3_0, expr12_0); - let expr14_0: u64 = 0i128 as u64; - let expr15_0 = C::load_u64_constant(ctx, expr14_0); - let expr16_0 = C::value_regs(ctx, expr13_0, expr15_0); - return expr16_0; -} - -// Generated as internal constructor for term gen_extend. -pub fn constructor_gen_extend( - ctx: &mut C, - arg0: Reg, - arg1: bool, - arg2: u8, - arg3: u8, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - // Rule at src/isa/riscv64/inst.isle line 1021. - let expr0_0: Type = I16; - let expr1_0 = C::temp_writable_reg(ctx, expr0_0); - let expr2_0 = MInst::Extend { - rd: expr1_0, - rn: pattern0_0, - signed: pattern1_0, - from_bits: pattern2_0, - to_bits: pattern3_0, - }; - let expr3_0 = C::emit(ctx, &expr2_0); - let expr4_0 = C::writable_reg_to_reg(ctx, expr1_0); - return expr4_0; -} - -// Generated as internal constructor for term lower_extend. -pub fn constructor_lower_extend( - ctx: &mut C, - arg0: Reg, - arg1: bool, - arg2: u8, - arg3: u8, -) -> ValueRegs { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - if pattern1_0 == true { - let pattern3_0 = arg2; - if pattern3_0 == 64i128 as u8 { - let pattern5_0 = arg3; - if pattern5_0 == 128i128 as u8 { - // Rule at src/isa/riscv64/inst.isle line 1034. - let expr0_0 = AluOPRRR::Slt; - let expr1_0 = C::zero_reg(ctx); - let expr2_0 = constructor_alu_rrr(ctx, &expr0_0, pattern0_0, expr1_0); - let expr3_0: bool = true; - let expr4_0: u8 = 1i128 as u8; - let expr5_0: u8 = 64i128 as u8; - let expr6_0 = constructor_gen_extend(ctx, expr2_0, expr3_0, expr4_0, expr5_0); - let expr7_0: Type = I64; - let expr8_0: Type = I64; - let expr9_0 = C::gen_move2(ctx, pattern0_0, expr7_0, expr8_0); - let expr10_0 = C::value_regs(ctx, expr9_0, expr6_0); - return expr10_0; - } - } - } - if pattern1_0 == false { - let pattern3_0 = arg2; - if pattern3_0 == 64i128 as u8 { - let pattern5_0 = arg3; - if pattern5_0 == 128i128 as u8 { - // Rule at src/isa/riscv64/inst.isle line 1051. - let expr0_0: Type = I64; - let expr1_0: Type = I64; - let expr2_0 = C::gen_move2(ctx, pattern0_0, expr0_0, expr1_0); - let expr3_0: u64 = 0i128 as u64; - let expr4_0 = C::load_u64_constant(ctx, expr3_0); - let expr5_0 = C::value_regs(ctx, expr2_0, expr4_0); - return expr5_0; - } - } - } - let pattern0_0 = arg0; - let pattern1_0 = arg1; - if pattern1_0 == true { - let pattern3_0 = arg2; - let pattern4_0 = arg3; - if pattern4_0 == 128i128 as u8 { - // Rule at src/isa/riscv64/inst.isle line 1042. - let expr0_0: bool = true; - let expr1_0: u8 = 64i128 as u8; - let expr2_0 = constructor_gen_extend(ctx, pattern0_0, expr0_0, pattern3_0, expr1_0); - let expr3_0 = AluOPRRR::Slt; - let expr4_0 = C::zero_reg(ctx); - let expr5_0 = constructor_alu_rrr(ctx, &expr3_0, expr2_0, expr4_0); - let expr6_0: bool = true; - let expr7_0: u8 = 1i128 as u8; - let expr8_0: u8 = 64i128 as u8; - let expr9_0 = constructor_gen_extend(ctx, expr5_0, expr6_0, expr7_0, expr8_0); - let expr10_0: Type = I64; - let expr11_0: Type = I64; - let expr12_0 = C::gen_move2(ctx, pattern0_0, expr10_0, expr11_0); - let expr13_0 = C::value_regs(ctx, expr12_0, expr9_0); - return expr13_0; - } - } - if pattern1_0 == false { - let pattern3_0 = arg2; - let pattern4_0 = arg3; - if pattern4_0 == 128i128 as u8 { - // Rule at src/isa/riscv64/inst.isle line 1056. - let expr0_0: bool = false; - let expr1_0: u8 = 64i128 as u8; - let expr2_0 = constructor_gen_extend(ctx, pattern0_0, expr0_0, pattern3_0, expr1_0); - let expr3_0: u64 = 0i128 as u64; - let expr4_0 = C::load_u64_constant(ctx, expr3_0); - let expr5_0 = C::value_regs(ctx, expr2_0, expr4_0); - return expr5_0; - } - } - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - // Rule at src/isa/riscv64/inst.isle line 1029. - let expr0_0 = constructor_gen_extend(ctx, pattern0_0, pattern1_0, pattern2_0, pattern3_0); - let expr1_0 = C::value_reg(ctx, expr0_0); - return expr1_0; -} - -// Generated as internal constructor for term lower_b128_binary. -pub fn constructor_lower_b128_binary( - ctx: &mut C, - arg0: &AluOPRRR, - arg1: ValueRegs, - arg2: ValueRegs, -) -> ValueRegs { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/riscv64/inst.isle line 1065. - let expr0_0: usize = 0i128 as usize; - let expr1_0 = C::value_regs_get(ctx, pattern1_0, expr0_0); - let expr2_0: usize = 0i128 as usize; - let expr3_0 = C::value_regs_get(ctx, pattern2_0, expr2_0); - let expr4_0 = constructor_alu_rrr(ctx, pattern0_0, expr1_0, expr3_0); - let expr5_0: usize = 1i128 as usize; - let expr6_0 = C::value_regs_get(ctx, pattern1_0, expr5_0); - let expr7_0: usize = 1i128 as usize; - let expr8_0 = C::value_regs_get(ctx, pattern2_0, expr7_0); - let expr9_0 = constructor_alu_rrr(ctx, pattern0_0, expr6_0, expr8_0); - let expr10_0 = C::value_regs(ctx, expr4_0, expr9_0); - return expr10_0; -} - -// Generated as internal constructor for term lower_umlhi. -pub fn constructor_lower_umlhi(ctx: &mut C, arg0: Type, arg1: Reg, arg2: Reg) -> Reg { - let pattern0_0 = arg0; - if pattern0_0 == I64 { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - // Rule at src/isa/riscv64/inst.isle line 1074. - let expr0_0 = AluOPRRR::Mulhu; - let expr1_0 = constructor_alu_rrr(ctx, &expr0_0, pattern2_0, pattern3_0); - return expr1_0; - } - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/riscv64/inst.isle line 1079. - let expr0_0 = AluOPRRR::Mul; - let expr1_0: bool = false; - let expr2_0 = C::value_reg(ctx, pattern1_0); - let expr3_0 = constructor_ext_int_if_need(ctx, expr1_0, expr2_0, pattern0_0); - let expr4_0 = constructor_convert_valueregs_reg(ctx, expr3_0); - let expr5_0: bool = false; - let expr6_0 = C::value_reg(ctx, pattern2_0); - let expr7_0 = constructor_ext_int_if_need(ctx, expr5_0, expr6_0, pattern0_0); - let expr8_0 = constructor_convert_valueregs_reg(ctx, expr7_0); - let expr9_0 = constructor_alu_rrr(ctx, &expr0_0, expr4_0, expr8_0); - let expr10_0 = AluOPRRI::Srli; - let expr11_0 = C::ty_bits(ctx, pattern0_0); - let expr12_0 = C::u8_as_i32(ctx, expr11_0); - let expr13_0 = C::imm12_const(ctx, expr12_0); - let expr14_0 = constructor_alu_rr_imm12(ctx, &expr10_0, expr9_0, expr13_0); - return expr14_0; -} - -// Generated as internal constructor for term lower_smlhi. -pub fn constructor_lower_smlhi(ctx: &mut C, arg0: Type, arg1: Reg, arg2: Reg) -> Reg { - let pattern0_0 = arg0; - if pattern0_0 == I64 { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - // Rule at src/isa/riscv64/inst.isle line 1085. - let expr0_0 = AluOPRRR::Mulh; - let expr1_0 = constructor_alu_rrr(ctx, &expr0_0, pattern2_0, pattern3_0); - return expr1_0; - } - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/riscv64/inst.isle line 1090. - let expr0_0 = AluOPRRR::Mul; - let expr1_0 = constructor_alu_rrr(ctx, &expr0_0, pattern1_0, pattern2_0); - let expr2_0 = AluOPRRI::Srli; - let expr3_0 = C::ty_bits(ctx, pattern0_0); - let expr4_0 = C::u8_as_i32(ctx, expr3_0); - let expr5_0 = C::imm12_const(ctx, expr4_0); - let expr6_0 = constructor_alu_rr_imm12(ctx, &expr2_0, expr1_0, expr5_0); - return expr6_0; -} - -// Generated as internal constructor for term lower_rotl. -pub fn constructor_lower_rotl(ctx: &mut C, arg0: Type, arg1: Reg, arg2: Reg) -> Reg { - let pattern0_0 = arg0; - if pattern0_0 == I32 { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - let mut closure4 = || { - let expr0_0 = C::has_b(ctx); - return Some(expr0_0); - }; - if let Some(pattern4_0) = closure4() { - if pattern4_0 == true { - // Rule at src/isa/riscv64/inst.isle line 1112. - let expr0_0 = AluOPRRR::Rolw; - let expr1_0 = constructor_alu_rrr(ctx, &expr0_0, pattern2_0, pattern3_0); - return expr1_0; - } - } - } - if pattern0_0 == I64 { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - let mut closure4 = || { - let expr0_0 = C::has_b(ctx); - return Some(expr0_0); - }; - if let Some(pattern4_0) = closure4() { - if pattern4_0 == true { - // Rule at src/isa/riscv64/inst.isle line 1102. - let expr0_0 = AluOPRRR::Rol; - let expr1_0 = constructor_alu_rrr(ctx, &expr0_0, pattern2_0, pattern3_0); - return expr1_0; - } - } - } - let pattern0_0 = arg0; - if pattern0_0 == I32 { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - let mut closure4 = || { - let expr0_0 = C::has_b(ctx); - return Some(expr0_0); - }; - if let Some(pattern4_0) = closure4() { - if pattern4_0 == false { - // Rule at src/isa/riscv64/inst.isle line 1118. - let expr0_0: Type = I32; - let expr1_0 = constructor_lower_rotl_shift(ctx, expr0_0, pattern2_0, pattern3_0); - return expr1_0; - } - } - } - if pattern0_0 == I64 { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - let mut closure4 = || { - let expr0_0 = C::has_b(ctx); - return Some(expr0_0); - }; - if let Some(pattern4_0) = closure4() { - if pattern4_0 == false { - // Rule at src/isa/riscv64/inst.isle line 1108. - let expr0_0: Type = I64; - let expr1_0 = constructor_lower_rotl_shift(ctx, expr0_0, pattern2_0, pattern3_0); - return expr1_0; - } - } - } - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/riscv64/inst.isle line 1122. - let expr0_0 = constructor_lower_rotl_shift(ctx, pattern0_0, pattern1_0, pattern2_0); - return expr0_0; -} - -// Generated as internal constructor for term lower_rotl_shift. -pub fn constructor_lower_rotl_shift( - ctx: &mut C, - arg0: Type, - arg1: Reg, - arg2: Reg, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/riscv64/inst.isle line 1131. - let expr0_0 = C::gen_shamt(ctx, pattern0_0, pattern2_0); - let expr1_0: usize = 0i128 as usize; - let expr2_0 = C::value_regs_get(ctx, expr0_0, expr1_0); - let expr3_0: usize = 1i128 as usize; - let expr4_0 = C::value_regs_get(ctx, expr0_0, expr3_0); - let expr5_0 = AluOPRRR::Sll; - let expr6_0 = constructor_alu_rrr(ctx, &expr5_0, pattern1_0, expr2_0); - let expr7_0 = AluOPRRR::Srl; - let expr8_0 = constructor_alu_rrr(ctx, &expr7_0, pattern1_0, expr4_0); - let expr9_0 = IntCC::Equal; - let expr10_0 = C::zero_reg(ctx); - let expr11_0 = C::zero_reg(ctx); - let expr12_0 = C::gen_select_reg(ctx, &expr9_0, expr2_0, expr10_0, expr11_0, expr8_0); - let expr13_0 = AluOPRRR::Or; - let expr14_0 = constructor_alu_rrr(ctx, &expr13_0, expr6_0, expr12_0); - return expr14_0; -} - -// Generated as internal constructor for term lower_rotr. -pub fn constructor_lower_rotr(ctx: &mut C, arg0: Type, arg1: Reg, arg2: Reg) -> Reg { - let pattern0_0 = arg0; - if pattern0_0 == I32 { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - let mut closure4 = || { - let expr0_0 = C::has_b(ctx); - return Some(expr0_0); - }; - if let Some(pattern4_0) = closure4() { - if pattern4_0 == true { - // Rule at src/isa/riscv64/inst.isle line 1160. - let expr0_0 = AluOPRRR::Rorw; - let expr1_0 = constructor_alu_rrr(ctx, &expr0_0, pattern2_0, pattern3_0); - return expr1_0; - } - } - } - if pattern0_0 == I64 { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - let mut closure4 = || { - let expr0_0 = C::has_b(ctx); - return Some(expr0_0); - }; - if let Some(pattern4_0) = closure4() { - if pattern4_0 == true { - // Rule at src/isa/riscv64/inst.isle line 1151. - let expr0_0 = AluOPRRR::Ror; - let expr1_0 = constructor_alu_rrr(ctx, &expr0_0, pattern2_0, pattern3_0); - return expr1_0; - } - } - } - let pattern0_0 = arg0; - if pattern0_0 == I32 { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - let mut closure4 = || { - let expr0_0 = C::has_b(ctx); - return Some(expr0_0); - }; - if let Some(pattern4_0) = closure4() { - if pattern4_0 == false { - // Rule at src/isa/riscv64/inst.isle line 1166. - let expr0_0: Type = I32; - let expr1_0 = constructor_lower_rotr_shift(ctx, expr0_0, pattern2_0, pattern3_0); - return expr1_0; - } - } - } - if pattern0_0 == I64 { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - let mut closure4 = || { - let expr0_0 = C::has_b(ctx); - return Some(expr0_0); - }; - if let Some(pattern4_0) = closure4() { - if pattern4_0 == false { - // Rule at src/isa/riscv64/inst.isle line 1156. - let expr0_0: Type = I64; - let expr1_0 = constructor_lower_rotr_shift(ctx, expr0_0, pattern2_0, pattern3_0); - return expr1_0; - } - } - } - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/riscv64/inst.isle line 1170. - let expr0_0 = constructor_lower_rotr_shift(ctx, pattern0_0, pattern1_0, pattern2_0); - return expr0_0; -} - -// Generated as internal constructor for term lower_rotr_shift. -pub fn constructor_lower_rotr_shift( - ctx: &mut C, - arg0: Type, - arg1: Reg, - arg2: Reg, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/riscv64/inst.isle line 1178. - let expr0_0 = C::gen_shamt(ctx, pattern0_0, pattern2_0); - let expr1_0: usize = 0i128 as usize; - let expr2_0 = C::value_regs_get(ctx, expr0_0, expr1_0); - let expr3_0: usize = 1i128 as usize; - let expr4_0 = C::value_regs_get(ctx, expr0_0, expr3_0); - let expr5_0 = AluOPRRR::Srl; - let expr6_0 = constructor_alu_rrr(ctx, &expr5_0, pattern1_0, expr2_0); - let expr7_0 = AluOPRRR::Sll; - let expr8_0 = constructor_alu_rrr(ctx, &expr7_0, pattern1_0, expr4_0); - let expr9_0 = IntCC::Equal; - let expr10_0 = C::zero_reg(ctx); - let expr11_0 = C::zero_reg(ctx); - let expr12_0 = C::gen_select_reg(ctx, &expr9_0, expr2_0, expr10_0, expr11_0, expr8_0); - let expr13_0 = AluOPRRR::Or; - let expr14_0 = constructor_alu_rrr(ctx, &expr13_0, expr6_0, expr12_0); - return expr14_0; -} - -// Generated as internal constructor for term lower_cls. -pub fn constructor_lower_cls(ctx: &mut C, arg0: Reg, arg1: Type) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/riscv64/inst.isle line 1193. - let expr0_0: bool = true; - let expr1_0 = C::value_reg(ctx, pattern0_0); - let expr2_0 = constructor_ext_int_if_need(ctx, expr0_0, expr1_0, pattern1_0); - let expr3_0 = constructor_convert_valueregs_reg(ctx, expr2_0); - let expr4_0 = IntCC::SignedLessThan; - let expr5_0 = C::zero_reg(ctx); - let expr6_0 = constructor_gen_bit_not(ctx, pattern0_0); - let expr7_0 = C::gen_select_reg(ctx, &expr4_0, expr3_0, expr5_0, expr6_0, pattern0_0); - let expr8_0 = constructor_lower_clz(ctx, pattern1_0, expr7_0); - let expr9_0 = AluOPRRI::Addi; - let expr10_0: i32 = -1i128 as i32; - let expr11_0 = C::imm12_const(ctx, expr10_0); - let expr12_0 = constructor_alu_rr_imm12(ctx, &expr9_0, expr8_0, expr11_0); - return expr12_0; -} - -// Generated as internal constructor for term gen_cltz. -pub fn constructor_gen_cltz(ctx: &mut C, arg0: bool, arg1: Reg, arg2: Type) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/riscv64/inst.isle line 1205. - let expr0_0: Type = I64; - let expr1_0 = C::temp_writable_reg(ctx, expr0_0); - let expr2_0: Type = I64; - let expr3_0 = C::temp_writable_reg(ctx, expr2_0); - let expr4_0: Type = I64; - let expr5_0 = C::temp_writable_reg(ctx, expr4_0); - let expr6_0 = MInst::Cltz { - leading: pattern0_0, - sum: expr5_0, - step: expr3_0, - tmp: expr1_0, - rs: pattern1_0, - ty: pattern2_0, - }; - let expr7_0 = C::emit(ctx, &expr6_0); - let expr8_0 = C::writable_reg_to_reg(ctx, expr5_0); - return expr8_0; -} - -// Generated as internal constructor for term gen_popcnt. -pub fn constructor_gen_popcnt(ctx: &mut C, arg0: Reg, arg1: Type) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/riscv64/inst.isle line 1215. - let expr0_0: Type = I64; - let expr1_0 = C::temp_writable_reg(ctx, expr0_0); - let expr2_0: Type = I64; - let expr3_0 = C::temp_writable_reg(ctx, expr2_0); - let expr4_0: Type = I64; - let expr5_0 = C::temp_writable_reg(ctx, expr4_0); - let expr6_0 = MInst::Popcnt { - sum: expr5_0, - step: expr3_0, - tmp: expr1_0, - rs: pattern0_0, - ty: pattern1_0, - }; - let expr7_0 = C::emit(ctx, &expr6_0); - let expr8_0 = C::writable_reg_to_reg(ctx, expr5_0); - return expr8_0; -} - -// Generated as internal constructor for term lower_popcnt. -pub fn constructor_lower_popcnt(ctx: &mut C, arg0: Reg, arg1: Type) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let mut closure2 = || { - let expr0_0 = C::has_b(ctx); - return Some(expr0_0); - }; - if let Some(pattern2_0) = closure2() { - if pattern2_0 == true { - // Rule at src/isa/riscv64/inst.isle line 1224. - let expr0_0 = AluOPRRI::Cpop; - let expr1_0: bool = false; - let expr2_0 = C::value_reg(ctx, pattern0_0); - let expr3_0 = constructor_ext_int_if_need(ctx, expr1_0, expr2_0, pattern1_0); - let expr4_0 = constructor_convert_valueregs_reg(ctx, expr3_0); - let expr5_0 = constructor_alu_rr_funct12(ctx, &expr0_0, expr4_0); - return expr5_0; - } - } - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let mut closure2 = || { - let expr0_0 = C::has_b(ctx); - return Some(expr0_0); - }; - if let Some(pattern2_0) = closure2() { - if pattern2_0 == false { - // Rule at src/isa/riscv64/inst.isle line 1227. - let expr0_0 = constructor_gen_popcnt(ctx, pattern0_0, pattern1_0); - return expr0_0; - } - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "lower_popcnt", "src/isa/riscv64/inst.isle line 1223" - ); -} - -// Generated as internal constructor for term lower_popcnt_i128. -pub fn constructor_lower_popcnt_i128(ctx: &mut C, arg0: ValueRegs) -> ValueRegs { - let pattern0_0 = arg0; - // Rule at src/isa/riscv64/inst.isle line 1233. - let expr0_0: usize = 0i128 as usize; - let expr1_0 = C::value_regs_get(ctx, pattern0_0, expr0_0); - let expr2_0: Type = I64; - let expr3_0 = constructor_lower_popcnt(ctx, expr1_0, expr2_0); - let expr4_0: usize = 1i128 as usize; - let expr5_0 = C::value_regs_get(ctx, pattern0_0, expr4_0); - let expr6_0: Type = I64; - let expr7_0 = constructor_lower_popcnt(ctx, expr5_0, expr6_0); - let expr8_0 = constructor_alu_add(ctx, expr3_0, expr7_0); - let expr9_0: u64 = 0i128 as u64; - let expr10_0 = C::load_u64_constant(ctx, expr9_0); - let expr11_0 = C::value_regs(ctx, expr8_0, expr10_0); - return expr11_0; -} - -// Generated as internal constructor for term lower_i128_rotl. -pub fn constructor_lower_i128_rotl( - ctx: &mut C, - arg0: ValueRegs, - arg1: ValueRegs, -) -> ValueRegs { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/riscv64/inst.isle line 1245. - let expr0_0: Type = I128; - let expr1_0: usize = 0i128 as usize; - let expr2_0 = C::value_regs_get(ctx, pattern1_0, expr1_0); - let expr3_0 = C::gen_shamt(ctx, expr0_0, expr2_0); - let expr4_0: usize = 0i128 as usize; - let expr5_0 = C::value_regs_get(ctx, expr3_0, expr4_0); - let expr6_0: usize = 1i128 as usize; - let expr7_0 = C::value_regs_get(ctx, expr3_0, expr6_0); - let expr8_0 = AluOPRRR::Sll; - let expr9_0: usize = 0i128 as usize; - let expr10_0 = C::value_regs_get(ctx, pattern0_0, expr9_0); - let expr11_0 = constructor_alu_rrr(ctx, &expr8_0, expr10_0, expr5_0); - let expr12_0 = AluOPRRR::Srl; - let expr13_0: usize = 1i128 as usize; - let expr14_0 = C::value_regs_get(ctx, pattern0_0, expr13_0); - let expr15_0 = constructor_alu_rrr(ctx, &expr12_0, expr14_0, expr7_0); - let expr16_0 = IntCC::Equal; - let expr17_0 = C::zero_reg(ctx); - let expr18_0 = C::zero_reg(ctx); - let expr19_0 = C::gen_select_reg(ctx, &expr16_0, expr5_0, expr17_0, expr18_0, expr15_0); - let expr20_0 = AluOPRRR::Or; - let expr21_0 = constructor_alu_rrr(ctx, &expr20_0, expr11_0, expr19_0); - let expr22_0 = AluOPRRR::Sll; - let expr23_0: usize = 1i128 as usize; - let expr24_0 = C::value_regs_get(ctx, pattern0_0, expr23_0); - let expr25_0 = constructor_alu_rrr(ctx, &expr22_0, expr24_0, expr5_0); - let expr26_0 = AluOPRRR::Srl; - let expr27_0: usize = 0i128 as usize; - let expr28_0 = C::value_regs_get(ctx, pattern0_0, expr27_0); - let expr29_0 = constructor_alu_rrr(ctx, &expr26_0, expr28_0, expr7_0); - let expr30_0 = IntCC::Equal; - let expr31_0 = C::zero_reg(ctx); - let expr32_0 = C::zero_reg(ctx); - let expr33_0 = C::gen_select_reg(ctx, &expr30_0, expr5_0, expr31_0, expr32_0, expr29_0); - let expr34_0 = AluOPRRR::Or; - let expr35_0 = constructor_alu_rrr(ctx, &expr34_0, expr25_0, expr33_0); - let expr36_0: u64 = 64i128 as u64; - let expr37_0 = C::load_u64_constant(ctx, expr36_0); - let expr38_0 = IntCC::UnsignedGreaterThanOrEqual; - let expr39_0 = C::gen_select_reg(ctx, &expr38_0, expr5_0, expr37_0, expr35_0, expr21_0); - let expr40_0 = IntCC::UnsignedGreaterThanOrEqual; - let expr41_0 = C::gen_select_reg(ctx, &expr40_0, expr5_0, expr37_0, expr21_0, expr35_0); - let expr42_0 = C::value_regs(ctx, expr39_0, expr41_0); - return expr42_0; -} - -// Generated as internal constructor for term lower_i128_rotr. -pub fn constructor_lower_i128_rotr( - ctx: &mut C, - arg0: ValueRegs, - arg1: ValueRegs, -) -> ValueRegs { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/riscv64/inst.isle line 1273. - let expr0_0: Type = I128; - let expr1_0: usize = 0i128 as usize; - let expr2_0 = C::value_regs_get(ctx, pattern1_0, expr1_0); - let expr3_0 = C::gen_shamt(ctx, expr0_0, expr2_0); - let expr4_0: usize = 0i128 as usize; - let expr5_0 = C::value_regs_get(ctx, expr3_0, expr4_0); - let expr6_0: usize = 1i128 as usize; - let expr7_0 = C::value_regs_get(ctx, expr3_0, expr6_0); - let expr8_0 = AluOPRRR::Srl; - let expr9_0: usize = 0i128 as usize; - let expr10_0 = C::value_regs_get(ctx, pattern0_0, expr9_0); - let expr11_0 = constructor_alu_rrr(ctx, &expr8_0, expr10_0, expr5_0); - let expr12_0 = AluOPRRR::Sll; - let expr13_0: usize = 1i128 as usize; - let expr14_0 = C::value_regs_get(ctx, pattern0_0, expr13_0); - let expr15_0 = constructor_alu_rrr(ctx, &expr12_0, expr14_0, expr7_0); - let expr16_0 = IntCC::Equal; - let expr17_0 = C::zero_reg(ctx); - let expr18_0 = C::zero_reg(ctx); - let expr19_0 = C::gen_select_reg(ctx, &expr16_0, expr5_0, expr17_0, expr18_0, expr15_0); - let expr20_0 = AluOPRRR::Or; - let expr21_0 = constructor_alu_rrr(ctx, &expr20_0, expr11_0, expr19_0); - let expr22_0 = AluOPRRR::Srl; - let expr23_0: usize = 1i128 as usize; - let expr24_0 = C::value_regs_get(ctx, pattern0_0, expr23_0); - let expr25_0 = constructor_alu_rrr(ctx, &expr22_0, expr24_0, expr5_0); - let expr26_0 = AluOPRRR::Sll; - let expr27_0: usize = 0i128 as usize; - let expr28_0 = C::value_regs_get(ctx, pattern0_0, expr27_0); - let expr29_0 = constructor_alu_rrr(ctx, &expr26_0, expr28_0, expr7_0); - let expr30_0 = IntCC::Equal; - let expr31_0 = C::zero_reg(ctx); - let expr32_0 = C::zero_reg(ctx); - let expr33_0 = C::gen_select_reg(ctx, &expr30_0, expr5_0, expr31_0, expr32_0, expr29_0); - let expr34_0 = AluOPRRR::Or; - let expr35_0 = constructor_alu_rrr(ctx, &expr34_0, expr25_0, expr33_0); - let expr36_0: u64 = 64i128 as u64; - let expr37_0 = C::load_u64_constant(ctx, expr36_0); - let expr38_0 = IntCC::UnsignedGreaterThanOrEqual; - let expr39_0 = C::gen_select_reg(ctx, &expr38_0, expr5_0, expr37_0, expr35_0, expr21_0); - let expr40_0 = IntCC::UnsignedGreaterThanOrEqual; - let expr41_0 = C::gen_select_reg(ctx, &expr40_0, expr5_0, expr37_0, expr21_0, expr35_0); - let expr42_0 = C::value_regs(ctx, expr39_0, expr41_0); - return expr42_0; -} - -// Generated as internal constructor for term lower_i128_ishl. -pub fn constructor_lower_i128_ishl( - ctx: &mut C, - arg0: ValueRegs, - arg1: ValueRegs, -) -> ValueRegs { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/riscv64/inst.isle line 1302. - let expr0_0: Type = I128; - let expr1_0: usize = 0i128 as usize; - let expr2_0 = C::value_regs_get(ctx, pattern1_0, expr1_0); - let expr3_0 = C::gen_shamt(ctx, expr0_0, expr2_0); - let expr4_0: usize = 0i128 as usize; - let expr5_0 = C::value_regs_get(ctx, expr3_0, expr4_0); - let expr6_0: usize = 1i128 as usize; - let expr7_0 = C::value_regs_get(ctx, expr3_0, expr6_0); - let expr8_0 = AluOPRRR::Sll; - let expr9_0: usize = 0i128 as usize; - let expr10_0 = C::value_regs_get(ctx, pattern0_0, expr9_0); - let expr11_0 = constructor_alu_rrr(ctx, &expr8_0, expr10_0, expr5_0); - let expr12_0 = AluOPRRR::Srl; - let expr13_0: usize = 0i128 as usize; - let expr14_0 = C::value_regs_get(ctx, pattern0_0, expr13_0); - let expr15_0 = constructor_alu_rrr(ctx, &expr12_0, expr14_0, expr7_0); - let expr16_0 = IntCC::Equal; - let expr17_0 = C::zero_reg(ctx); - let expr18_0 = C::zero_reg(ctx); - let expr19_0 = C::gen_select_reg(ctx, &expr16_0, expr5_0, expr17_0, expr18_0, expr15_0); - let expr20_0 = AluOPRRR::Sll; - let expr21_0: usize = 1i128 as usize; - let expr22_0 = C::value_regs_get(ctx, pattern0_0, expr21_0); - let expr23_0 = constructor_alu_rrr(ctx, &expr20_0, expr22_0, expr5_0); - let expr24_0 = AluOPRRR::Or; - let expr25_0 = constructor_alu_rrr(ctx, &expr24_0, expr19_0, expr23_0); - let expr26_0: u64 = 64i128 as u64; - let expr27_0 = C::load_u64_constant(ctx, expr26_0); - let expr28_0 = IntCC::UnsignedGreaterThanOrEqual; - let expr29_0 = C::zero_reg(ctx); - let expr30_0 = C::gen_select_reg(ctx, &expr28_0, expr5_0, expr27_0, expr29_0, expr11_0); - let expr31_0 = IntCC::UnsignedGreaterThanOrEqual; - let expr32_0 = C::gen_select_reg(ctx, &expr31_0, expr5_0, expr27_0, expr11_0, expr25_0); - let expr33_0 = C::value_regs(ctx, expr30_0, expr32_0); - return expr33_0; -} - -// Generated as internal constructor for term lower_i128_ushr. -pub fn constructor_lower_i128_ushr( - ctx: &mut C, - arg0: ValueRegs, - arg1: ValueRegs, -) -> ValueRegs { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/riscv64/inst.isle line 1323. - let expr0_0: Type = I128; - let expr1_0: usize = 0i128 as usize; - let expr2_0 = C::value_regs_get(ctx, pattern1_0, expr1_0); - let expr3_0 = C::gen_shamt(ctx, expr0_0, expr2_0); - let expr4_0: usize = 0i128 as usize; - let expr5_0 = C::value_regs_get(ctx, expr3_0, expr4_0); - let expr6_0: usize = 1i128 as usize; - let expr7_0 = C::value_regs_get(ctx, expr3_0, expr6_0); - let expr8_0 = AluOPRRR::Sll; - let expr9_0: usize = 1i128 as usize; - let expr10_0 = C::value_regs_get(ctx, pattern0_0, expr9_0); - let expr11_0 = constructor_alu_rrr(ctx, &expr8_0, expr10_0, expr7_0); - let expr12_0 = IntCC::Equal; - let expr13_0 = C::zero_reg(ctx); - let expr14_0 = C::zero_reg(ctx); - let expr15_0 = C::gen_select_reg(ctx, &expr12_0, expr5_0, expr13_0, expr14_0, expr11_0); - let expr16_0 = AluOPRRR::Srl; - let expr17_0: usize = 0i128 as usize; - let expr18_0 = C::value_regs_get(ctx, pattern0_0, expr17_0); - let expr19_0 = constructor_alu_rrr(ctx, &expr16_0, expr18_0, expr5_0); - let expr20_0 = AluOPRRR::Or; - let expr21_0 = constructor_alu_rrr(ctx, &expr20_0, expr15_0, expr19_0); - let expr22_0: u64 = 64i128 as u64; - let expr23_0 = C::load_u64_constant(ctx, expr22_0); - let expr24_0 = AluOPRRR::Srl; - let expr25_0: usize = 1i128 as usize; - let expr26_0 = C::value_regs_get(ctx, pattern0_0, expr25_0); - let expr27_0 = constructor_alu_rrr(ctx, &expr24_0, expr26_0, expr5_0); - let expr28_0 = IntCC::UnsignedGreaterThanOrEqual; - let expr29_0 = C::gen_select_reg(ctx, &expr28_0, expr5_0, expr23_0, expr27_0, expr21_0); - let expr30_0 = IntCC::UnsignedGreaterThanOrEqual; - let expr31_0 = C::zero_reg(ctx); - let expr32_0 = C::gen_select_reg(ctx, &expr30_0, expr5_0, expr23_0, expr31_0, expr27_0); - let expr33_0 = C::value_regs(ctx, expr29_0, expr32_0); - return expr33_0; -} - -// Generated as internal constructor for term lower_i128_sshr. -pub fn constructor_lower_i128_sshr( - ctx: &mut C, - arg0: ValueRegs, - arg1: ValueRegs, -) -> ValueRegs { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/riscv64/inst.isle line 1347. - let expr0_0: Type = I128; - let expr1_0: usize = 0i128 as usize; - let expr2_0 = C::value_regs_get(ctx, pattern1_0, expr1_0); - let expr3_0 = C::gen_shamt(ctx, expr0_0, expr2_0); - let expr4_0: usize = 0i128 as usize; - let expr5_0 = C::value_regs_get(ctx, expr3_0, expr4_0); - let expr6_0: usize = 1i128 as usize; - let expr7_0 = C::value_regs_get(ctx, expr3_0, expr6_0); - let expr8_0 = AluOPRRR::Sll; - let expr9_0: usize = 1i128 as usize; - let expr10_0 = C::value_regs_get(ctx, pattern0_0, expr9_0); - let expr11_0 = constructor_alu_rrr(ctx, &expr8_0, expr10_0, expr7_0); - let expr12_0 = IntCC::Equal; - let expr13_0 = C::zero_reg(ctx); - let expr14_0 = C::zero_reg(ctx); - let expr15_0 = C::gen_select_reg(ctx, &expr12_0, expr5_0, expr13_0, expr14_0, expr11_0); - let expr16_0 = AluOPRRR::Srl; - let expr17_0: usize = 0i128 as usize; - let expr18_0 = C::value_regs_get(ctx, pattern0_0, expr17_0); - let expr19_0 = constructor_alu_rrr(ctx, &expr16_0, expr18_0, expr5_0); - let expr20_0 = AluOPRRR::Or; - let expr21_0 = constructor_alu_rrr(ctx, &expr20_0, expr15_0, expr19_0); - let expr22_0: u64 = 64i128 as u64; - let expr23_0 = C::load_u64_constant(ctx, expr22_0); - let expr24_0 = AluOPRRR::Sra; - let expr25_0: usize = 1i128 as usize; - let expr26_0 = C::value_regs_get(ctx, pattern0_0, expr25_0); - let expr27_0 = constructor_alu_rrr(ctx, &expr24_0, expr26_0, expr5_0); - let expr28_0: i32 = -1i128 as i32; - let expr29_0 = constructor_load_imm12(ctx, expr28_0); - let expr30_0 = IntCC::SignedLessThan; - let expr31_0: usize = 1i128 as usize; - let expr32_0 = C::value_regs_get(ctx, pattern0_0, expr31_0); - let expr33_0 = C::zero_reg(ctx); - let expr34_0 = C::zero_reg(ctx); - let expr35_0 = C::gen_select_reg(ctx, &expr30_0, expr32_0, expr33_0, expr29_0, expr34_0); - let expr36_0 = IntCC::UnsignedGreaterThanOrEqual; - let expr37_0 = C::gen_select_reg(ctx, &expr36_0, expr5_0, expr23_0, expr27_0, expr21_0); - let expr38_0 = IntCC::UnsignedGreaterThanOrEqual; - let expr39_0 = C::gen_select_reg(ctx, &expr38_0, expr5_0, expr23_0, expr35_0, expr27_0); - let expr40_0 = C::value_regs(ctx, expr37_0, expr39_0); - return expr40_0; -} - -// Generated as internal constructor for term load_imm12. -pub fn constructor_load_imm12(ctx: &mut C, arg0: i32) -> Reg { - let pattern0_0 = arg0; - // Rule at src/isa/riscv64/inst.isle line 1373. - let expr0_0 = AluOPRRI::Addi; - let expr1_0 = C::zero_reg(ctx); - let expr2_0 = C::imm12_const(ctx, pattern0_0); - let expr3_0 = constructor_alu_rr_imm12(ctx, &expr0_0, expr1_0, expr2_0); - return expr3_0; -} - -// Generated as internal constructor for term lower_cls_i128. -pub fn constructor_lower_cls_i128(ctx: &mut C, arg0: ValueRegs) -> ValueRegs { - let pattern0_0 = arg0; - // Rule at src/isa/riscv64/inst.isle line 1378. - let expr0_0 = IntCC::SignedLessThan; - let expr1_0: usize = 1i128 as usize; - let expr2_0 = C::value_regs_get(ctx, pattern0_0, expr1_0); - let expr3_0 = C::zero_reg(ctx); - let expr4_0: usize = 0i128 as usize; - let expr5_0 = C::value_regs_get(ctx, pattern0_0, expr4_0); - let expr6_0 = constructor_gen_bit_not(ctx, expr5_0); - let expr7_0: usize = 0i128 as usize; - let expr8_0 = C::value_regs_get(ctx, pattern0_0, expr7_0); - let expr9_0 = C::gen_select_reg(ctx, &expr0_0, expr2_0, expr3_0, expr6_0, expr8_0); - let expr10_0 = IntCC::SignedLessThan; - let expr11_0: usize = 1i128 as usize; - let expr12_0 = C::value_regs_get(ctx, pattern0_0, expr11_0); - let expr13_0 = C::zero_reg(ctx); - let expr14_0: usize = 1i128 as usize; - let expr15_0 = C::value_regs_get(ctx, pattern0_0, expr14_0); - let expr16_0 = constructor_gen_bit_not(ctx, expr15_0); - let expr17_0: usize = 1i128 as usize; - let expr18_0 = C::value_regs_get(ctx, pattern0_0, expr17_0); - let expr19_0 = C::gen_select_reg(ctx, &expr10_0, expr12_0, expr13_0, expr16_0, expr18_0); - let expr20_0 = C::value_regs(ctx, expr9_0, expr19_0); - let expr21_0 = constructor_lower_clz_i128(ctx, expr20_0); - let expr22_0: usize = 0i128 as usize; - let expr23_0 = C::value_regs_get(ctx, expr21_0, expr22_0); - let expr24_0 = AluOPRRI::Addi; - let expr25_0: i32 = -1i128 as i32; - let expr26_0 = C::imm12_const(ctx, expr25_0); - let expr27_0 = constructor_alu_rr_imm12(ctx, &expr24_0, expr23_0, expr26_0); - let expr28_0: u64 = 0i128 as u64; - let expr29_0 = C::load_u64_constant(ctx, expr28_0); - let expr30_0 = C::value_regs(ctx, expr27_0, expr29_0); - return expr30_0; -} - -// Generated as internal constructor for term gen_load. -pub fn constructor_gen_load( - ctx: &mut C, - arg0: Reg, - arg1: Offset32, - arg2: &LoadOP, - arg3: MemFlags, - arg4: Type, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - let pattern4_0 = arg4; - // Rule at src/isa/riscv64/inst.isle line 1413. - let expr0_0 = C::temp_writable_reg(ctx, pattern4_0); - let expr1_0: Type = I64; - let expr2_0 = C::gen_amode(ctx, pattern0_0, pattern1_0, expr1_0); - let expr3_0 = MInst::Load { - rd: expr0_0, - op: pattern2_0.clone(), - flags: pattern3_0, - from: expr2_0, - }; - let expr4_0 = C::emit(ctx, &expr3_0); - let expr5_0 = C::writable_reg_to_reg(ctx, expr0_0); - return expr5_0; -} - -// Generated as internal constructor for term gen_load_128. -pub fn constructor_gen_load_128( - ctx: &mut C, - arg0: Reg, - arg1: Offset32, - arg2: MemFlags, -) -> ValueRegs { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/riscv64/inst.isle line 1421. - let expr0_0 = LoadOP::Ld; - let expr1_0: Type = I64; - let expr2_0 = constructor_gen_load(ctx, pattern0_0, pattern1_0, &expr0_0, pattern2_0, expr1_0); - let expr3_0: i64 = 8i128 as i64; - let expr4_0 = C::offset32_add(ctx, pattern1_0, expr3_0); - let expr5_0 = LoadOP::Ld; - let expr6_0: Type = I64; - let expr7_0 = constructor_gen_load(ctx, pattern0_0, expr4_0, &expr5_0, pattern2_0, expr6_0); - let expr8_0 = C::value_regs(ctx, expr2_0, expr7_0); - return expr8_0; -} - -// Generated as internal constructor for term gen_store. -pub fn constructor_gen_store( - ctx: &mut C, - arg0: Reg, - arg1: Offset32, - arg2: &StoreOP, - arg3: MemFlags, - arg4: Reg, -) -> InstOutput { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - let pattern4_0 = arg4; - // Rule at src/isa/riscv64/inst.isle line 1436. - let expr0_0: Type = I64; - let expr1_0 = C::gen_amode(ctx, pattern0_0, pattern1_0, expr0_0); - let expr2_0 = MInst::Store { - to: expr1_0, - op: pattern2_0.clone(), - flags: pattern3_0, - src: pattern4_0, - }; - let expr3_0 = SideEffectNoResult::Inst { inst: expr2_0 }; - let expr4_0 = constructor_side_effect(ctx, &expr3_0); - return expr4_0; -} - -// Generated as internal constructor for term gen_store_128. -pub fn constructor_gen_store_128( - ctx: &mut C, - arg0: Reg, - arg1: Offset32, - arg2: MemFlags, - arg3: ValueRegs, -) -> InstOutput { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - // Rule at src/isa/riscv64/inst.isle line 1442. - let expr0_0: Type = I64; - let expr1_0 = C::gen_amode(ctx, pattern0_0, pattern1_0, expr0_0); - let expr2_0 = StoreOP::Sd; - let expr3_0: usize = 0i128 as usize; - let expr4_0 = C::value_regs_get(ctx, pattern3_0, expr3_0); - let expr5_0 = MInst::Store { - to: expr1_0, - op: expr2_0, - flags: pattern2_0, - src: expr4_0, - }; - let expr6_0: i64 = 8i128 as i64; - let expr7_0 = C::offset32_add(ctx, pattern1_0, expr6_0); - let expr8_0: Type = I64; - let expr9_0 = C::gen_amode(ctx, pattern0_0, expr7_0, expr8_0); - let expr10_0 = StoreOP::Sd; - let expr11_0: usize = 1i128 as usize; - let expr12_0 = C::value_regs_get(ctx, pattern3_0, expr11_0); - let expr13_0 = MInst::Store { - to: expr9_0, - op: expr10_0, - flags: pattern2_0, - src: expr12_0, - }; - let expr14_0 = SideEffectNoResult::Inst2 { - inst1: expr5_0, - inst2: expr13_0, - }; - let expr15_0 = constructor_side_effect(ctx, &expr14_0); - return expr15_0; -} - -// Generated as internal constructor for term gen_atomic. -pub fn constructor_gen_atomic( - ctx: &mut C, - arg0: &AtomicOP, - arg1: Reg, - arg2: Reg, - arg3: AMO, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - // Rule at src/isa/riscv64/inst.isle line 1455. - let expr0_0: Type = I64; - let expr1_0 = C::temp_writable_reg(ctx, expr0_0); - let expr2_0 = MInst::Atomic { - op: pattern0_0.clone(), - rd: expr1_0, - addr: pattern1_0, - src: pattern2_0, - amo: pattern3_0, - }; - let expr3_0 = C::emit(ctx, &expr2_0); - let expr4_0 = C::writable_reg_to_reg(ctx, expr1_0); - return expr4_0; -} - -// Generated as internal constructor for term get_atomic_rmw_op. -pub fn constructor_get_atomic_rmw_op( - ctx: &mut C, - arg0: Type, - arg1: &AtomicRmwOp, -) -> AtomicOP { - let pattern0_0 = arg0; - if pattern0_0 == I32 { - let pattern2_0 = arg1; - match pattern2_0 { - &AtomicRmwOp::Add => { - // Rule at src/isa/riscv64/inst.isle line 1464. - let expr0_0 = AtomicOP::AmoaddW; - return expr0_0; - } - &AtomicRmwOp::And => { - // Rule at src/isa/riscv64/inst.isle line 1471. - let expr0_0 = AtomicOP::AmoandW; - return expr0_0; - } - &AtomicRmwOp::Or => { - // Rule at src/isa/riscv64/inst.isle line 1479. - let expr0_0 = AtomicOP::AmoorW; - return expr0_0; - } - &AtomicRmwOp::Smax => { - // Rule at src/isa/riscv64/inst.isle line 1487. - let expr0_0 = AtomicOP::AmomaxW; - return expr0_0; - } - &AtomicRmwOp::Smin => { - // Rule at src/isa/riscv64/inst.isle line 1495. - let expr0_0 = AtomicOP::AmominW; - return expr0_0; - } - &AtomicRmwOp::Umax => { - // Rule at src/isa/riscv64/inst.isle line 1503. - let expr0_0 = AtomicOP::AmomaxuW; - return expr0_0; - } - &AtomicRmwOp::Umin => { - // Rule at src/isa/riscv64/inst.isle line 1512. - let expr0_0 = AtomicOP::AmominuW; - return expr0_0; - } - &AtomicRmwOp::Xchg => { - // Rule at src/isa/riscv64/inst.isle line 1520. - let expr0_0 = AtomicOP::AmoswapW; - return expr0_0; - } - &AtomicRmwOp::Xor => { - // Rule at src/isa/riscv64/inst.isle line 1528. - let expr0_0 = AtomicOP::AmoxorW; - return expr0_0; - } - _ => {} - } - } - if pattern0_0 == I64 { - let pattern2_0 = arg1; - match pattern2_0 { - &AtomicRmwOp::Add => { - // Rule at src/isa/riscv64/inst.isle line 1467. - let expr0_0 = AtomicOP::AmoaddD; - return expr0_0; - } - &AtomicRmwOp::And => { - // Rule at src/isa/riscv64/inst.isle line 1475. - let expr0_0 = AtomicOP::AmoandD; - return expr0_0; - } - &AtomicRmwOp::Or => { - // Rule at src/isa/riscv64/inst.isle line 1483. - let expr0_0 = AtomicOP::AmoorD; - return expr0_0; - } - &AtomicRmwOp::Smax => { - // Rule at src/isa/riscv64/inst.isle line 1491. - let expr0_0 = AtomicOP::AmomaxD; - return expr0_0; - } - &AtomicRmwOp::Smin => { - // Rule at src/isa/riscv64/inst.isle line 1499. - let expr0_0 = AtomicOP::AmominD; - return expr0_0; - } - &AtomicRmwOp::Umax => { - // Rule at src/isa/riscv64/inst.isle line 1508. - let expr0_0 = AtomicOP::AmomaxuD; - return expr0_0; - } - &AtomicRmwOp::Umin => { - // Rule at src/isa/riscv64/inst.isle line 1516. - let expr0_0 = AtomicOP::AmominuD; - return expr0_0; - } - &AtomicRmwOp::Xchg => { - // Rule at src/isa/riscv64/inst.isle line 1524. - let expr0_0 = AtomicOP::AmoswapD; - return expr0_0; - } - &AtomicRmwOp::Xor => { - // Rule at src/isa/riscv64/inst.isle line 1532. - let expr0_0 = AtomicOP::AmoxorD; - return expr0_0; - } - _ => {} - } - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "get_atomic_rmw_op", "src/isa/riscv64/inst.isle line 1462" - ); -} - -// Generated as internal constructor for term gen_atomic_load. -pub fn constructor_gen_atomic_load(ctx: &mut C, arg0: Reg, arg1: Type) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/riscv64/inst.isle line 1541. - let expr0_0: Type = I64; - let expr1_0 = C::temp_writable_reg(ctx, expr0_0); - let expr2_0 = MInst::AtomicLoad { - rd: expr1_0, - ty: pattern1_0, - p: pattern0_0, - }; - let expr3_0 = C::emit(ctx, &expr2_0); - let expr4_0 = C::writable_reg_to_reg(ctx, expr1_0); - return expr4_0; -} - -// Generated as internal constructor for term gen_atomic_store. -pub fn constructor_gen_atomic_store( - ctx: &mut C, - arg0: Reg, - arg1: Type, - arg2: Reg, -) -> InstOutput { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/riscv64/inst.isle line 1550. - let expr0_0 = MInst::AtomicStore { - src: pattern2_0, - ty: pattern1_0, - p: pattern0_0, - }; - let expr1_0 = SideEffectNoResult::Inst { inst: expr0_0 }; - let expr2_0 = constructor_side_effect(ctx, &expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term gen_bit_not. -pub fn constructor_gen_bit_not(ctx: &mut C, arg0: Reg) -> Reg { - let pattern0_0 = arg0; - // Rule at src/isa/riscv64/inst.isle line 1556. - let expr0_0 = AluOPRRI::Xori; - let expr1_0: i32 = -1i128 as i32; - let expr2_0 = C::imm12_const(ctx, expr1_0); - let expr3_0 = constructor_alu_rr_imm12(ctx, &expr0_0, pattern0_0, expr2_0); - return expr3_0; -} - -// Generated as internal constructor for term f_arithmatic_op. -pub fn constructor_f_arithmatic_op(ctx: &mut C, arg0: Type, arg1: &Opcode) -> FpuOPRRR { - let pattern0_0 = arg0; - if pattern0_0 == F32 { - let pattern2_0 = arg1; - match pattern2_0 { - &Opcode::Fadd => { - // Rule at src/isa/riscv64/inst.isle line 1563. - let expr0_0 = FpuOPRRR::FaddS; - return expr0_0; - } - &Opcode::Fsub => { - // Rule at src/isa/riscv64/inst.isle line 1571. - let expr0_0 = FpuOPRRR::FsubS; - return expr0_0; - } - &Opcode::Fmul => { - // Rule at src/isa/riscv64/inst.isle line 1578. - let expr0_0 = FpuOPRRR::FmulS; - return expr0_0; - } - &Opcode::Fdiv => { - // Rule at src/isa/riscv64/inst.isle line 1586. - let expr0_0 = FpuOPRRR::FdivS; - return expr0_0; - } - _ => {} - } - } - if pattern0_0 == F64 { - let pattern2_0 = arg1; - match pattern2_0 { - &Opcode::Fadd => { - // Rule at src/isa/riscv64/inst.isle line 1567. - let expr0_0 = FpuOPRRR::FaddD; - return expr0_0; - } - &Opcode::Fsub => { - // Rule at src/isa/riscv64/inst.isle line 1574. - let expr0_0 = FpuOPRRR::FsubD; - return expr0_0; - } - &Opcode::Fmul => { - // Rule at src/isa/riscv64/inst.isle line 1582. - let expr0_0 = FpuOPRRR::FmulD; - return expr0_0; - } - &Opcode::Fdiv => { - // Rule at src/isa/riscv64/inst.isle line 1590. - let expr0_0 = FpuOPRRR::FdivD; - return expr0_0; - } - _ => {} - } - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "f_arithmatic_op", "src/isa/riscv64/inst.isle line 1561" - ); -} - -// Generated as internal constructor for term f_copysign_op. -pub fn constructor_f_copysign_op(ctx: &mut C, arg0: Type) -> FpuOPRRR { - let pattern0_0 = arg0; - if pattern0_0 == F32 { - // Rule at src/isa/riscv64/inst.isle line 1603. - let expr0_0 = FpuOPRRR::FsgnjS; - return expr0_0; - } - if pattern0_0 == F64 { - // Rule at src/isa/riscv64/inst.isle line 1604. - let expr0_0 = FpuOPRRR::FsgnjD; - return expr0_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "f_copysign_op", "src/isa/riscv64/inst.isle line 1602" - ); -} - -// Generated as internal constructor for term f_copy_neg_sign_op. -pub fn constructor_f_copy_neg_sign_op(ctx: &mut C, arg0: Type) -> FpuOPRRR { - let pattern0_0 = arg0; - if pattern0_0 == F32 { - // Rule at src/isa/riscv64/inst.isle line 1608. - let expr0_0 = FpuOPRRR::FsgnjnS; - return expr0_0; - } - if pattern0_0 == F64 { - // Rule at src/isa/riscv64/inst.isle line 1609. - let expr0_0 = FpuOPRRR::FsgnjnD; - return expr0_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "f_copy_neg_sign_op", "src/isa/riscv64/inst.isle line 1607" - ); -} - -// Generated as internal constructor for term fabs_copy_sign. -pub fn constructor_fabs_copy_sign(ctx: &mut C, arg0: Type) -> FpuOPRRR { - let pattern0_0 = arg0; - if pattern0_0 == F32 { - // Rule at src/isa/riscv64/inst.isle line 1612. - let expr0_0 = FpuOPRRR::FsgnjxS; - return expr0_0; - } - if pattern0_0 == F64 { - // Rule at src/isa/riscv64/inst.isle line 1613. - let expr0_0 = FpuOPRRR::FsgnjxD; - return expr0_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "fabs_copy_sign", "src/isa/riscv64/inst.isle line 1611" - ); -} - -// Generated as internal constructor for term gen_reference_check. -pub fn constructor_gen_reference_check( - ctx: &mut C, - arg0: &ReferenceCheckOP, - arg1: Reg, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/riscv64/inst.isle line 1631. - let expr0_0: Type = I64; - let expr1_0 = C::temp_writable_reg(ctx, expr0_0); - let expr2_0 = MInst::ReferenceCheck { - rd: expr1_0, - op: pattern0_0.clone(), - x: pattern1_0, - }; - let expr3_0 = C::emit(ctx, &expr2_0); - let expr4_0 = C::writable_reg_to_reg(ctx, expr1_0); - return expr4_0; -} - -// Generated as internal constructor for term gen_select. -pub fn constructor_gen_select( - ctx: &mut C, - arg0: Type, - arg1: Reg, - arg2: ValueRegs, - arg3: ValueRegs, -) -> ValueRegs { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - // Rule at src/isa/riscv64/inst.isle line 1640. - let expr0_0 = C::alloc_vec_writable(ctx, pattern0_0); - let expr1_0 = C::vec_writable_clone(ctx, &expr0_0); - let expr2_0 = MInst::Select { - dst: expr0_0, - ty: pattern0_0, - condition: pattern1_0, - x: pattern2_0, - y: pattern3_0, - }; - let expr3_0 = C::emit(ctx, &expr2_0); - let expr4_0 = C::vec_writable_to_regs(ctx, &expr1_0); - return expr4_0; -} - -// Generated as internal constructor for term gen_bitselect. -pub fn constructor_gen_bitselect( - ctx: &mut C, - arg0: Type, - arg1: Reg, - arg2: Reg, - arg3: Reg, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - // Rule at src/isa/riscv64/inst.isle line 1661. - let expr0_0 = AluOPRRR::And; - let expr1_0 = constructor_alu_rrr(ctx, &expr0_0, pattern1_0, pattern2_0); - let expr2_0 = constructor_gen_bit_not(ctx, pattern1_0); - let expr3_0 = AluOPRRR::And; - let expr4_0 = constructor_alu_rrr(ctx, &expr3_0, expr2_0, pattern3_0); - let expr5_0 = AluOPRRR::Or; - let expr6_0 = constructor_alu_rrr(ctx, &expr5_0, expr1_0, expr4_0); - return expr6_0; -} - -// Generated as internal constructor for term gen_int_select. -pub fn constructor_gen_int_select( - ctx: &mut C, - arg0: Type, - arg1: &IntSelectOP, - arg2: ValueRegs, - arg3: ValueRegs, -) -> ValueRegs { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - // Rule at src/isa/riscv64/inst.isle line 1674. - let expr0_0 = C::alloc_vec_writable(ctx, pattern0_0); - let expr1_0 = C::vec_writable_clone(ctx, &expr0_0); - let expr2_0 = MInst::IntSelect { - op: pattern1_0.clone(), - dst: expr1_0, - x: pattern2_0, - y: pattern3_0, - ty: pattern0_0, - }; - let expr3_0 = C::emit(ctx, &expr2_0); - let expr4_0 = C::vec_writable_to_regs(ctx, &expr0_0); - return expr4_0; -} - -// Generated as internal constructor for term udf. -pub fn constructor_udf(ctx: &mut C, arg0: &TrapCode) -> InstOutput { - let pattern0_0 = arg0; - // Rule at src/isa/riscv64/inst.isle line 1684. - let expr0_0 = MInst::Udf { - trap_code: pattern0_0.clone(), - }; - let expr1_0 = SideEffectNoResult::Inst { inst: expr0_0 }; - let expr2_0 = constructor_side_effect(ctx, &expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term int_load_op. -pub fn constructor_int_load_op(ctx: &mut C, arg0: bool, arg1: u8) -> LoadOP { - let pattern0_0 = arg0; - if pattern0_0 == true { - let pattern2_0 = arg1; - if pattern2_0 == 8i128 as u8 { - // Rule at src/isa/riscv64/inst.isle line 1700. - let expr0_0 = LoadOP::Lb; - return expr0_0; - } - if pattern2_0 == 16i128 as u8 { - // Rule at src/isa/riscv64/inst.isle line 1707. - let expr0_0 = LoadOP::Lh; - return expr0_0; - } - if pattern2_0 == 32i128 as u8 { - // Rule at src/isa/riscv64/inst.isle line 1713. - let expr0_0 = LoadOP::Lw; - return expr0_0; - } - } - if pattern0_0 == false { - let pattern2_0 = arg1; - if pattern2_0 == 8i128 as u8 { - // Rule at src/isa/riscv64/inst.isle line 1696. - let expr0_0 = LoadOP::Lbu; - return expr0_0; - } - if pattern2_0 == 16i128 as u8 { - // Rule at src/isa/riscv64/inst.isle line 1704. - let expr0_0 = LoadOP::Lhu; - return expr0_0; - } - if pattern2_0 == 32i128 as u8 { - // Rule at src/isa/riscv64/inst.isle line 1710. - let expr0_0 = LoadOP::Lwu; - return expr0_0; - } - } - let pattern1_0 = arg1; - if pattern1_0 == 64i128 as u8 { - // Rule at src/isa/riscv64/inst.isle line 1717. - let expr0_0 = LoadOP::Ld; - return expr0_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "int_load_op", "src/isa/riscv64/inst.isle line 1694" - ); -} - -// Generated as internal constructor for term gen_fcvt_int. -pub fn constructor_gen_fcvt_int( - ctx: &mut C, - arg0: bool, - arg1: Reg, - arg2: bool, - arg3: Type, - arg4: Type, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - let pattern4_0 = arg4; - // Rule at src/isa/riscv64/inst.isle line 1730. - let expr0_0 = C::temp_writable_reg(ctx, pattern4_0); - let expr1_0: Type = F64; - let expr2_0 = C::temp_writable_reg(ctx, expr1_0); - let expr3_0 = MInst::FcvtToInt { - is_sat: pattern0_0, - rd: expr0_0, - tmp: expr2_0, - rs: pattern1_0, - is_signed: pattern2_0, - in_type: pattern3_0, - out_type: pattern4_0, - }; - let expr4_0 = C::emit(ctx, &expr3_0); - let expr5_0 = C::writable_reg_to_reg(ctx, expr0_0); - return expr5_0; -} - -// Generated as internal constructor for term lower_float_binary. -pub fn constructor_lower_float_binary( - ctx: &mut C, - arg0: &AluOPRRR, - arg1: Reg, - arg2: Reg, - arg3: Type, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - // Rule at src/isa/riscv64/inst.isle line 1743. - let expr0_0 = C::move_f_to_x(ctx, pattern1_0, pattern3_0); - let expr1_0 = C::move_f_to_x(ctx, pattern2_0, pattern3_0); - let expr2_0 = constructor_alu_rrr(ctx, pattern0_0, expr0_0, expr1_0); - let expr3_0 = C::move_x_to_f(ctx, expr2_0, pattern3_0); - return expr3_0; -} - -// Generated as internal constructor for term lower_float_bnot. -pub fn constructor_lower_float_bnot(ctx: &mut C, arg0: Reg, arg1: Type) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/riscv64/inst.isle line 1755. - let expr0_0 = C::move_f_to_x(ctx, pattern0_0, pattern1_0); - let expr1_0 = constructor_gen_bit_not(ctx, expr0_0); - let expr2_0 = C::move_x_to_f(ctx, expr1_0, pattern1_0); - return expr2_0; -} - -// Generated as internal constructor for term convert_valueregs_reg. -pub fn constructor_convert_valueregs_reg(ctx: &mut C, arg0: ValueRegs) -> Reg { - let pattern0_0 = arg0; - // Rule at src/isa/riscv64/inst.isle line 1767. - let expr0_0: usize = 0i128 as usize; - let expr1_0 = C::value_regs_get(ctx, pattern0_0, expr0_0); - return expr1_0; -} - -// Generated as internal constructor for term lower_icmp. -pub fn constructor_lower_icmp( - ctx: &mut C, - arg0: &IntCC, - arg1: ValueRegs, - arg2: ValueRegs, - arg3: Type, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - let mut closure4 = || { - let expr0_0 = C::signed_cond_code(ctx, pattern0_0)?; - return Some(expr0_0); - }; - if let Some(pattern4_0) = closure4() { - // Rule at src/isa/riscv64/inst.isle line 1773. - let expr0_0: bool = true; - let expr1_0 = constructor_ext_int_if_need(ctx, expr0_0, pattern1_0, pattern3_0); - let expr2_0: bool = true; - let expr3_0 = constructor_ext_int_if_need(ctx, expr2_0, pattern2_0, pattern3_0); - let expr4_0 = constructor_gen_icmp(ctx, pattern0_0, expr1_0, expr3_0, pattern3_0); - return expr4_0; - } - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - // Rule at src/isa/riscv64/inst.isle line 1776. - let expr0_0: bool = false; - let expr1_0 = constructor_ext_int_if_need(ctx, expr0_0, pattern1_0, pattern3_0); - let expr2_0: bool = false; - let expr3_0 = constructor_ext_int_if_need(ctx, expr2_0, pattern2_0, pattern3_0); - let expr4_0 = constructor_gen_icmp(ctx, pattern0_0, expr1_0, expr3_0, pattern3_0); - return expr4_0; -} - -// Generated as internal constructor for term lower_icmp_over_flow. -pub fn constructor_lower_icmp_over_flow( - ctx: &mut C, - arg0: ValueRegs, - arg1: ValueRegs, - arg2: Type, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - if pattern2_0 == I64 { - // Rule at src/isa/riscv64/inst.isle line 1791. - let expr0_0 = AluOPRRR::Sgt; - let expr1_0 = constructor_convert_valueregs_reg(ctx, pattern1_0); - let expr2_0 = C::zero_reg(ctx); - let expr3_0 = constructor_alu_rrr(ctx, &expr0_0, expr1_0, expr2_0); - let expr4_0 = constructor_convert_valueregs_reg(ctx, pattern0_0); - let expr5_0 = constructor_convert_valueregs_reg(ctx, pattern1_0); - let expr6_0 = constructor_alu_sub(ctx, expr4_0, expr5_0); - let expr7_0 = AluOPRRR::Slt; - let expr8_0 = constructor_convert_valueregs_reg(ctx, pattern0_0); - let expr9_0 = constructor_alu_rrr(ctx, &expr7_0, expr6_0, expr8_0); - let expr10_0 = IntCC::NotEqual; - let expr11_0 = C::value_reg(ctx, expr3_0); - let expr12_0 = C::value_reg(ctx, expr9_0); - let expr13_0: Type = I64; - let expr14_0 = constructor_gen_icmp(ctx, &expr10_0, expr11_0, expr12_0, expr13_0); - return expr14_0; - } - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - if pattern2_0 == I128 { - // Rule at src/isa/riscv64/inst.isle line 1800. - let expr0_0 = AluOPRRI::Srli; - let expr1_0: usize = 1i128 as usize; - let expr2_0 = C::value_regs_get(ctx, pattern0_0, expr1_0); - let expr3_0: i32 = 63i128 as i32; - let expr4_0 = C::imm12_const(ctx, expr3_0); - let expr5_0 = constructor_alu_rr_imm12(ctx, &expr0_0, expr2_0, expr4_0); - let expr6_0 = AluOPRRI::Srli; - let expr7_0: usize = 1i128 as usize; - let expr8_0 = C::value_regs_get(ctx, pattern1_0, expr7_0); - let expr9_0: i32 = 63i128 as i32; - let expr10_0 = C::imm12_const(ctx, expr9_0); - let expr11_0 = constructor_alu_rr_imm12(ctx, &expr6_0, expr8_0, expr10_0); - let expr12_0 = constructor_i128_sub(ctx, pattern0_0, pattern1_0); - let expr13_0 = AluOPRRI::Srli; - let expr14_0: usize = 1i128 as usize; - let expr15_0 = C::value_regs_get(ctx, expr12_0, expr14_0); - let expr16_0: i32 = 63i128 as i32; - let expr17_0 = C::imm12_const(ctx, expr16_0); - let expr18_0 = constructor_alu_rr_imm12(ctx, &expr13_0, expr15_0, expr17_0); - let expr19_0 = constructor_gen_bit_not(ctx, expr11_0); - let expr20_0 = constructor_gen_bit_not(ctx, expr18_0); - let expr21_0 = constructor_alu_and(ctx, expr19_0, expr20_0); - let expr22_0 = constructor_alu_and(ctx, expr5_0, expr21_0); - let expr23_0 = constructor_gen_bit_not(ctx, expr5_0); - let expr24_0 = constructor_alu_and(ctx, expr11_0, expr18_0); - let expr25_0 = constructor_alu_and(ctx, expr23_0, expr24_0); - let expr26_0 = AluOPRRR::Or; - let expr27_0 = constructor_alu_rrr(ctx, &expr26_0, expr22_0, expr25_0); - let expr28_0: bool = true; - let expr29_0: u8 = 1i128 as u8; - let expr30_0: u8 = 64i128 as u8; - let expr31_0 = constructor_gen_extend(ctx, expr27_0, expr28_0, expr29_0, expr30_0); - return expr31_0; - } - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/riscv64/inst.isle line 1782. - let expr0_0: bool = true; - let expr1_0 = constructor_ext_int_if_need(ctx, expr0_0, pattern0_0, pattern2_0); - let expr2_0 = constructor_convert_valueregs_reg(ctx, expr1_0); - let expr3_0: bool = true; - let expr4_0 = constructor_ext_int_if_need(ctx, expr3_0, pattern1_0, pattern2_0); - let expr5_0 = constructor_convert_valueregs_reg(ctx, expr4_0); - let expr6_0 = constructor_alu_sub(ctx, expr2_0, expr5_0); - let expr7_0: Type = I64; - let expr8_0 = C::temp_writable_reg(ctx, expr7_0); - let expr9_0: bool = true; - let expr10_0 = C::ty_bits(ctx, pattern2_0); - let expr11_0: u8 = 64i128 as u8; - let expr12_0 = MInst::Extend { - rd: expr8_0, - rn: expr6_0, - signed: expr9_0, - from_bits: expr10_0, - to_bits: expr11_0, - }; - let expr13_0 = C::emit(ctx, &expr12_0); - let expr14_0 = IntCC::NotEqual; - let expr15_0 = C::writable_reg_to_reg(ctx, expr8_0); - let expr16_0 = C::value_reg(ctx, expr15_0); - let expr17_0 = C::value_reg(ctx, expr6_0); - let expr18_0: Type = I64; - let expr19_0 = constructor_gen_icmp(ctx, &expr14_0, expr16_0, expr17_0, expr18_0); - return expr19_0; -} - -// Generated as internal constructor for term i128_sub. -pub fn constructor_i128_sub( - ctx: &mut C, - arg0: ValueRegs, - arg1: ValueRegs, -) -> ValueRegs { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/riscv64/inst.isle line 1826. - let expr0_0 = AluOPRRR::Sub; - let expr1_0: usize = 0i128 as usize; - let expr2_0 = C::value_regs_get(ctx, pattern0_0, expr1_0); - let expr3_0: usize = 0i128 as usize; - let expr4_0 = C::value_regs_get(ctx, pattern1_0, expr3_0); - let expr5_0 = constructor_alu_rrr(ctx, &expr0_0, expr2_0, expr4_0); - let expr6_0 = AluOPRRR::SltU; - let expr7_0: usize = 0i128 as usize; - let expr8_0 = C::value_regs_get(ctx, pattern0_0, expr7_0); - let expr9_0 = constructor_alu_rrr(ctx, &expr6_0, expr8_0, expr5_0); - let expr10_0 = AluOPRRR::Sub; - let expr11_0: usize = 1i128 as usize; - let expr12_0 = C::value_regs_get(ctx, pattern0_0, expr11_0); - let expr13_0: usize = 1i128 as usize; - let expr14_0 = C::value_regs_get(ctx, pattern1_0, expr13_0); - let expr15_0 = constructor_alu_rrr(ctx, &expr10_0, expr12_0, expr14_0); - let expr16_0 = AluOPRRR::Sub; - let expr17_0 = constructor_alu_rrr(ctx, &expr16_0, expr15_0, expr9_0); - let expr18_0 = C::value_regs(ctx, expr5_0, expr17_0); - return expr18_0; -} - -// Generated as internal constructor for term gen_fabs. -pub fn constructor_gen_fabs(ctx: &mut C, arg0: Reg, arg1: Type) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/riscv64/inst.isle line 1841. - let expr0_0 = constructor_fabs_copy_sign(ctx, pattern1_0); - let expr1_0 = constructor_fpu_rrr(ctx, &expr0_0, pattern1_0, pattern0_0, pattern0_0); - return expr1_0; -} - -// Generated as internal constructor for term lower_uadd_overflow. -pub fn constructor_lower_uadd_overflow( - ctx: &mut C, - arg0: Reg, - arg1: Reg, - arg2: Type, -) -> ValueRegs { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - if pattern2_0 == I64 { - // Rule at src/isa/riscv64/inst.isle line 1847. - let expr0_0 = constructor_alu_add(ctx, pattern0_0, pattern1_0); - let expr1_0 = IntCC::UnsignedLessThan; - let expr2_0 = C::value_reg(ctx, expr0_0); - let expr3_0 = C::value_reg(ctx, pattern0_0); - let expr4_0: Type = I64; - let expr5_0 = constructor_gen_icmp(ctx, &expr1_0, expr2_0, expr3_0, expr4_0); - let expr6_0 = C::value_regs(ctx, expr0_0, expr5_0); - return expr6_0; - } - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - if let Some(pattern3_0) = C::fits_in_32(ctx, pattern2_0) { - // Rule at src/isa/riscv64/inst.isle line 1854. - let expr0_0: bool = false; - let expr1_0 = C::value_reg(ctx, pattern0_0); - let expr2_0 = constructor_ext_int_if_need(ctx, expr0_0, expr1_0, pattern3_0); - let expr3_0 = constructor_convert_valueregs_reg(ctx, expr2_0); - let expr4_0: bool = false; - let expr5_0 = C::value_reg(ctx, pattern1_0); - let expr6_0 = constructor_ext_int_if_need(ctx, expr4_0, expr5_0, pattern3_0); - let expr7_0 = constructor_convert_valueregs_reg(ctx, expr6_0); - let expr8_0 = constructor_alu_add(ctx, expr3_0, expr7_0); - let expr9_0 = C::ty_bits(ctx, pattern3_0); - let expr10_0 = C::u8_as_i32(ctx, expr9_0); - let expr11_0 = constructor_alu_srli(ctx, expr8_0, expr10_0); - let expr12_0 = C::value_regs(ctx, expr8_0, expr11_0); - return expr12_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "lower_uadd_overflow", "src/isa/riscv64/inst.isle line 1845" - ); -} - -// Generated as internal constructor for term gen_jump. -pub fn constructor_gen_jump(ctx: &mut C, arg0: MachLabel) -> MInst { - let pattern0_0 = arg0; - // Rule at src/isa/riscv64/inst.isle line 1869. - let expr0_0 = C::label_to_br_target(ctx, pattern0_0); - let expr1_0 = MInst::Jal { dest: expr0_0 }; - return expr1_0; -} - -// Generated as internal constructor for term lower_branch. -pub fn constructor_lower_branch( - ctx: &mut C, - arg0: Inst, - arg1: &VecMachLabel, -) -> Option { - let pattern0_0 = arg0; - let pattern1_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Branch { - opcode: ref pattern2_0, - args: pattern2_1, - destination: pattern2_2, - } = &pattern1_0 - { - match pattern2_0 { - &Opcode::Brz => { - let pattern4_0 = C::value_list_slice(ctx, pattern2_1); - if let Some((pattern5_0, pattern5_1)) = C::value_slice_unwrap(ctx, pattern4_0) { - let pattern6_0 = C::value_type(ctx, pattern5_0); - if pattern6_0 == I128 { - let pattern8_0 = arg1; - // Rule at src/isa/riscv64/inst.isle line 1926. - let expr0_0 = C::zero_reg(ctx); - let expr1_0 = C::zero_reg(ctx); - let expr2_0 = C::value_regs(ctx, expr0_0, expr1_0); - let expr3_0 = IntCC::Equal; - let expr4_0 = C::put_in_regs(ctx, pattern5_0); - let expr5_0: Type = I128; - let expr6_0 = - constructor_gen_icmp(ctx, &expr3_0, expr4_0, expr2_0, expr5_0); - let expr7_0 = IntCC::NotEqual; - let expr8_0 = C::value_reg(ctx, expr6_0); - let expr9_0: Type = I64; - let expr10_0 = - C::lower_brz_or_nz(ctx, &expr7_0, expr8_0, pattern8_0, expr9_0); - return Some(expr10_0); - } - } - } - &Opcode::Brnz => { - let pattern4_0 = C::value_list_slice(ctx, pattern2_1); - if let Some((pattern5_0, pattern5_1)) = C::value_slice_unwrap(ctx, pattern4_0) { - let pattern6_0 = C::value_type(ctx, pattern5_0); - if pattern6_0 == I128 { - let pattern8_0 = arg1; - // Rule at src/isa/riscv64/inst.isle line 1946. - let expr0_0 = C::zero_reg(ctx); - let expr1_0 = C::zero_reg(ctx); - let expr2_0 = C::value_regs(ctx, expr0_0, expr1_0); - let expr3_0 = IntCC::NotEqual; - let expr4_0 = C::put_in_regs(ctx, pattern5_0); - let expr5_0: Type = I128; - let expr6_0 = - constructor_gen_icmp(ctx, &expr3_0, expr4_0, expr2_0, expr5_0); - let expr7_0 = IntCC::NotEqual; - let expr8_0 = C::value_reg(ctx, expr6_0); - let expr9_0: Type = I64; - let expr10_0 = - C::lower_brz_or_nz(ctx, &expr7_0, expr8_0, pattern8_0, expr9_0); - return Some(expr10_0); - } - } - } - _ => {} - } - } - let pattern0_0 = arg0; - let pattern1_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Branch { - opcode: ref pattern2_0, - args: pattern2_1, - destination: pattern2_2, - } = &pattern1_0 - { - match pattern2_0 { - &Opcode::Brz => { - let pattern4_0 = C::value_list_slice(ctx, pattern2_1); - if let Some((pattern5_0, pattern5_1)) = C::value_slice_unwrap(ctx, pattern4_0) { - if let Some(pattern6_0) = C::def_inst(ctx, pattern5_0) { - let pattern7_0 = C::inst_data(ctx, pattern6_0); - match &pattern7_0 { - &InstructionData::FloatCompare { - opcode: ref pattern8_0, - args: ref pattern8_1, - cond: ref pattern8_2, - } => { - if let &Opcode::Fcmp = pattern8_0 { - let (pattern10_0, pattern10_1) = - C::unpack_value_array_2(ctx, pattern8_1); - let pattern11_0 = C::value_type(ctx, pattern10_0); - let pattern12_0 = arg1; - // Rule at src/isa/riscv64/inst.isle line 1936. - let expr0_0 = C::floatcc_inverse(ctx, pattern8_2); - let expr1_0 = C::put_in_reg(ctx, pattern10_0); - let expr2_0 = C::put_in_reg(ctx, pattern10_1); - let expr3_0 = C::lower_br_fcmp( - ctx, - &expr0_0, - expr1_0, - expr2_0, - pattern12_0, - pattern11_0, - ); - return Some(expr3_0); - } - } - &InstructionData::IntCompare { - opcode: ref pattern8_0, - args: ref pattern8_1, - cond: ref pattern8_2, - } => { - if let &Opcode::Icmp = pattern8_0 { - let (pattern10_0, pattern10_1) = - C::unpack_value_array_2(ctx, pattern8_1); - let pattern11_0 = C::value_type(ctx, pattern10_0); - let pattern12_0 = arg1; - // Rule at src/isa/riscv64/inst.isle line 1932. - let expr0_0 = C::intcc_inverse(ctx, pattern8_2); - let expr1_0 = C::put_in_regs(ctx, pattern10_0); - let expr2_0 = C::put_in_regs(ctx, pattern10_1); - let expr3_0 = C::lower_br_icmp( - ctx, - &expr0_0, - expr1_0, - expr2_0, - pattern12_0, - pattern11_0, - ); - return Some(expr3_0); - } - } - _ => {} - } - } - } - } - &Opcode::Brnz => { - let pattern4_0 = C::value_list_slice(ctx, pattern2_1); - if let Some((pattern5_0, pattern5_1)) = C::value_slice_unwrap(ctx, pattern4_0) { - if let Some(pattern6_0) = C::def_inst(ctx, pattern5_0) { - let pattern7_0 = C::inst_data(ctx, pattern6_0); - match &pattern7_0 { - &InstructionData::FloatCompare { - opcode: ref pattern8_0, - args: ref pattern8_1, - cond: ref pattern8_2, - } => { - if let &Opcode::Fcmp = pattern8_0 { - let (pattern10_0, pattern10_1) = - C::unpack_value_array_2(ctx, pattern8_1); - let pattern11_0 = C::value_type(ctx, pattern10_0); - let pattern12_0 = arg1; - // Rule at src/isa/riscv64/inst.isle line 1956. - let expr0_0 = C::put_in_reg(ctx, pattern10_0); - let expr1_0 = C::put_in_reg(ctx, pattern10_1); - let expr2_0 = C::lower_br_fcmp( - ctx, - pattern8_2, - expr0_0, - expr1_0, - pattern12_0, - pattern11_0, - ); - return Some(expr2_0); - } - } - &InstructionData::IntCompare { - opcode: ref pattern8_0, - args: ref pattern8_1, - cond: ref pattern8_2, - } => { - if let &Opcode::Icmp = pattern8_0 { - let (pattern10_0, pattern10_1) = - C::unpack_value_array_2(ctx, pattern8_1); - let pattern11_0 = C::value_type(ctx, pattern10_0); - let pattern12_0 = arg1; - // Rule at src/isa/riscv64/inst.isle line 1952. - let expr0_0 = C::put_in_regs(ctx, pattern10_0); - let expr1_0 = C::put_in_regs(ctx, pattern10_1); - let expr2_0 = C::lower_br_icmp( - ctx, - pattern8_2, - expr0_0, - expr1_0, - pattern12_0, - pattern11_0, - ); - return Some(expr2_0); - } - } - _ => {} - } - } - } - } - _ => {} - } - } - let pattern0_0 = arg0; - let pattern1_0 = C::inst_data(ctx, pattern0_0); - match &pattern1_0 { - &InstructionData::BranchTable { - opcode: ref pattern2_0, - arg: pattern2_1, - destination: pattern2_2, - table: pattern2_3, - } => { - if let &Opcode::BrTable = pattern2_0 { - let pattern4_0 = arg1; - // Rule at src/isa/riscv64/inst.isle line 1965. - let expr0_0 = C::put_in_reg(ctx, pattern2_1); - let expr1_0 = C::lower_br_table(ctx, expr0_0, pattern4_0); - return Some(expr1_0); - } - } - &InstructionData::Branch { - opcode: ref pattern2_0, - args: pattern2_1, - destination: pattern2_2, - } => { - match pattern2_0 { - &Opcode::Brz => { - let pattern4_0 = C::value_list_slice(ctx, pattern2_1); - if let Some((pattern5_0, pattern5_1)) = C::value_slice_unwrap(ctx, pattern4_0) { - let pattern6_0 = C::value_type(ctx, pattern5_0); - let pattern7_0 = arg1; - // Rule at src/isa/riscv64/inst.isle line 1922. - let expr0_0 = IntCC::Equal; - let expr1_0 = C::put_in_regs(ctx, pattern5_0); - let expr2_0 = constructor_normalize_cmp_value(ctx, pattern6_0, expr1_0); - let expr3_0 = - C::lower_brz_or_nz(ctx, &expr0_0, expr2_0, pattern7_0, pattern6_0); - return Some(expr3_0); - } - } - &Opcode::Brnz => { - let pattern4_0 = C::value_list_slice(ctx, pattern2_1); - if let Some((pattern5_0, pattern5_1)) = C::value_slice_unwrap(ctx, pattern4_0) { - let pattern6_0 = C::value_type(ctx, pattern5_0); - let pattern7_0 = arg1; - // Rule at src/isa/riscv64/inst.isle line 1942. - let expr0_0 = IntCC::NotEqual; - let expr1_0 = C::put_in_regs(ctx, pattern5_0); - let expr2_0 = constructor_normalize_cmp_value(ctx, pattern6_0, expr1_0); - let expr3_0 = - C::lower_brz_or_nz(ctx, &expr0_0, expr2_0, pattern7_0, pattern6_0); - return Some(expr3_0); - } - } - _ => {} - } - } - &InstructionData::Jump { - opcode: ref pattern2_0, - args: pattern2_1, - destination: pattern2_2, - } => { - if let &Opcode::Jump = pattern2_0 { - let pattern4_0 = C::value_list_slice(ctx, pattern2_1); - let pattern5_0 = arg1; - // Rule at src/isa/riscv64/inst.isle line 1876. - let expr0_0: u8 = 0i128 as u8; - let expr1_0 = C::vec_label_get(ctx, pattern5_0, expr0_0); - let expr2_0 = constructor_gen_jump(ctx, expr1_0); - let expr3_0 = SideEffectNoResult::Inst { inst: expr2_0 }; - let expr4_0 = constructor_emit_side_effect(ctx, &expr3_0); - return Some(expr4_0); - } - } - _ => {} - } - return None; -} - -// Generated as internal constructor for term normalize_cmp_value. -pub fn constructor_normalize_cmp_value( - ctx: &mut C, - arg0: Type, - arg1: ValueRegs, -) -> ValueRegs { - let pattern0_0 = arg0; - if pattern0_0 == I8 { - let pattern2_0 = arg1; - // Rule at src/isa/riscv64/inst.isle line 1899. - let expr0_0 = AluOPRRI::Andi; - let expr1_0 = constructor_convert_valueregs_reg(ctx, pattern2_0); - let expr2_0: i32 = 255i128 as i32; - let expr3_0 = C::imm12_const(ctx, expr2_0); - let expr4_0 = constructor_alu_rr_imm12(ctx, &expr0_0, expr1_0, expr3_0); - let expr5_0 = C::value_reg(ctx, expr4_0); - return expr5_0; - } - if pattern0_0 == I16 { - let pattern2_0 = arg1; - // Rule at src/isa/riscv64/inst.isle line 1901. - let expr0_0 = AluOPRRR::And; - let expr1_0 = constructor_convert_valueregs_reg(ctx, pattern2_0); - let expr2_0: Type = I16; - let expr3_0: u64 = 65535i128 as u64; - let expr4_0 = C::imm(ctx, expr2_0, expr3_0); - let expr5_0 = constructor_alu_rrr(ctx, &expr0_0, expr1_0, expr4_0); - let expr6_0 = C::value_reg(ctx, expr5_0); - return expr6_0; - } - if pattern0_0 == I32 { - let pattern2_0 = arg1; - // Rule at src/isa/riscv64/inst.isle line 1903. - let expr0_0 = AluOPRRI::Addiw; - let expr1_0 = constructor_convert_valueregs_reg(ctx, pattern2_0); - let expr2_0: i32 = 0i128 as i32; - let expr3_0 = C::imm12_const(ctx, expr2_0); - let expr4_0 = constructor_alu_rr_imm12(ctx, &expr0_0, expr1_0, expr3_0); - let expr5_0 = C::value_reg(ctx, expr4_0); - return expr5_0; - } - if pattern0_0 == I64 { - let pattern2_0 = arg1; - // Rule at src/isa/riscv64/inst.isle line 1906. - return pattern2_0; - } - if pattern0_0 == I128 { - let pattern2_0 = arg1; - // Rule at src/isa/riscv64/inst.isle line 1907. - return pattern2_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "normalize_cmp_value", "src/isa/riscv64/inst.isle line 1897" - ); -} - -// Generated as internal constructor for term truthy_to_reg. -pub fn constructor_truthy_to_reg(ctx: &mut C, arg0: Type, arg1: ValueRegs) -> Reg { - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::fits_in_64(ctx, pattern0_0) { - let pattern2_0 = arg1; - // Rule at src/isa/riscv64/inst.isle line 1913. - let expr0_0: usize = 0i128 as usize; - let expr1_0 = C::value_regs_get(ctx, pattern2_0, expr0_0); - return expr1_0; - } - let pattern0_0 = arg0; - if pattern0_0 == I128 { - let pattern2_0 = arg1; - // Rule at src/isa/riscv64/inst.isle line 1915. - let expr0_0: usize = 0i128 as usize; - let expr1_0 = C::value_regs_get(ctx, pattern2_0, expr0_0); - let expr2_0: usize = 1i128 as usize; - let expr3_0 = C::value_regs_get(ctx, pattern2_0, expr2_0); - let expr4_0 = AluOPRRR::Or; - let expr5_0 = constructor_alu_rrr(ctx, &expr4_0, expr1_0, expr3_0); - return expr5_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "truthy_to_reg", "src/isa/riscv64/inst.isle line 1912" - ); -} - -// Generated as internal constructor for term gen_andn. -pub fn constructor_gen_andn(ctx: &mut C, arg0: Reg, arg1: Reg) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let mut closure2 = || { - let expr0_0 = C::has_b(ctx); - return Some(expr0_0); - }; - if let Some(pattern2_0) = closure2() { - if pattern2_0 == true { - // Rule at src/isa/riscv64/inst.isle line 1973. - let expr0_0 = AluOPRRR::Andn; - let expr1_0 = constructor_alu_rrr(ctx, &expr0_0, pattern0_0, pattern1_0); - return expr1_0; - } - } - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let mut closure2 = || { - let expr0_0 = C::has_b(ctx); - return Some(expr0_0); - }; - if let Some(pattern2_0) = closure2() { - if pattern2_0 == false { - // Rule at src/isa/riscv64/inst.isle line 1979. - let expr0_0 = constructor_gen_bit_not(ctx, pattern1_0); - let expr1_0 = constructor_alu_and(ctx, pattern0_0, expr0_0); - return expr1_0; - } - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "gen_andn", "src/isa/riscv64/inst.isle line 1972" - ); -} - -// Generated as internal constructor for term gen_orn. -pub fn constructor_gen_orn(ctx: &mut C, arg0: Reg, arg1: Reg) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let mut closure2 = || { - let expr0_0 = C::has_b(ctx); - return Some(expr0_0); - }; - if let Some(pattern2_0) = closure2() { - if pattern2_0 == true { - // Rule at src/isa/riscv64/inst.isle line 1987. - let expr0_0 = AluOPRRR::Orn; - let expr1_0 = constructor_alu_rrr(ctx, &expr0_0, pattern0_0, pattern1_0); - return expr1_0; - } - } - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let mut closure2 = || { - let expr0_0 = C::has_b(ctx); - return Some(expr0_0); - }; - if let Some(pattern2_0) = closure2() { - if pattern2_0 == false { - // Rule at src/isa/riscv64/inst.isle line 1993. - let expr0_0 = constructor_gen_bit_not(ctx, pattern1_0); - let expr1_0 = AluOPRRR::Or; - let expr2_0 = constructor_alu_rrr(ctx, &expr1_0, pattern0_0, expr0_0); - return expr2_0; - } - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "gen_orn", "src/isa/riscv64/inst.isle line 1986" - ); -} - -// Generated as internal constructor for term gen_rev8. -pub fn constructor_gen_rev8(ctx: &mut C, arg0: Reg) -> Reg { - let pattern0_0 = arg0; - let mut closure1 = || { - let expr0_0 = C::has_b(ctx); - return Some(expr0_0); - }; - if let Some(pattern1_0) = closure1() { - if pattern1_0 == true { - // Rule at src/isa/riscv64/inst.isle line 2000. - let expr0_0 = AluOPRRI::Rev8; - let expr1_0 = constructor_alu_rr_funct12(ctx, &expr0_0, pattern0_0); - return expr1_0; - } - } - let pattern0_0 = arg0; - let mut closure1 = || { - let expr0_0 = C::has_b(ctx); - return Some(expr0_0); - }; - if let Some(pattern1_0) = closure1() { - if pattern1_0 == false { - // Rule at src/isa/riscv64/inst.isle line 2006. - let expr0_0: Type = I64; - let expr1_0 = C::temp_writable_reg(ctx, expr0_0); - let expr2_0: Type = I64; - let expr3_0 = C::temp_writable_reg(ctx, expr2_0); - let expr4_0: Type = I64; - let expr5_0 = C::temp_writable_reg(ctx, expr4_0); - let expr6_0 = MInst::Rev8 { - rs: pattern0_0, - step: expr5_0, - tmp: expr3_0, - rd: expr1_0, - }; - let expr7_0 = C::emit(ctx, &expr6_0); - let expr8_0 = C::writable_reg_to_reg(ctx, expr1_0); - return expr8_0; - } - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "gen_rev8", "src/isa/riscv64/inst.isle line 1999" - ); -} - -// Generated as internal constructor for term gen_brev8. -pub fn constructor_gen_brev8(ctx: &mut C, arg0: Reg, arg1: Type) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let mut closure2 = || { - let expr0_0 = C::has_zbkb(ctx); - return Some(expr0_0); - }; - if let Some(pattern2_0) = closure2() { - if pattern2_0 == true { - // Rule at src/isa/riscv64/inst.isle line 2022. - let expr0_0 = AluOPRRI::Brev8; - let expr1_0 = constructor_alu_rr_funct12(ctx, &expr0_0, pattern0_0); - return expr1_0; - } - } - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let mut closure2 = || { - let expr0_0 = C::has_zbkb(ctx); - return Some(expr0_0); - }; - if let Some(pattern2_0) = closure2() { - if pattern2_0 == false { - // Rule at src/isa/riscv64/inst.isle line 2027. - let expr0_0: Type = I64; - let expr1_0 = C::temp_writable_reg(ctx, expr0_0); - let expr2_0: Type = I64; - let expr3_0 = C::temp_writable_reg(ctx, expr2_0); - let expr4_0: Type = I64; - let expr5_0 = C::temp_writable_reg(ctx, expr4_0); - let expr6_0: Type = I64; - let expr7_0 = C::temp_writable_reg(ctx, expr6_0); - let expr8_0 = MInst::Brev8 { - rs: pattern0_0, - ty: pattern1_0, - step: expr5_0, - tmp: expr1_0, - tmp2: expr3_0, - rd: expr7_0, - }; - let expr9_0 = C::emit(ctx, &expr8_0); - let expr10_0 = C::writable_reg_to_reg(ctx, expr7_0); - return expr10_0; - } - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "gen_brev8", "src/isa/riscv64/inst.isle line 2021" - ); -} - -// Generated as internal constructor for term gen_xor_not. -pub fn constructor_gen_xor_not(ctx: &mut C, arg0: Reg, arg1: Reg) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/riscv64/inst.isle line 2040. - let expr0_0 = constructor_gen_bit_not(ctx, pattern1_0); - let expr1_0 = AluOPRRR::Xor; - let expr2_0 = constructor_alu_rrr(ctx, &expr1_0, pattern0_0, expr0_0); - return expr2_0; -} - -// Generated as internal constructor for term neg. -pub fn constructor_neg(ctx: &mut C, arg0: Type, arg1: ValueRegs) -> ValueRegs { - let pattern0_0 = arg0; - if pattern0_0 == I128 { - let pattern2_0 = arg1; - // Rule at src/isa/riscv64/inst.isle line 2052. - let expr0_0 = constructor_value_regs_zero(ctx); - let expr1_0 = constructor_i128_sub(ctx, expr0_0, pattern2_0); - return expr1_0; - } - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::fits_in_64(ctx, pattern0_0) { - if let Some(pattern2_0) = C::ty_int(ctx, pattern1_0) { - let pattern3_0 = arg1; - // Rule at src/isa/riscv64/inst.isle line 2048. - let expr0_0 = AluOPRRR::Sub; - let expr1_0 = C::zero_reg(ctx); - let expr2_0: usize = 0i128 as usize; - let expr3_0 = C::value_regs_get(ctx, pattern3_0, expr2_0); - let expr4_0 = constructor_alu_rrr(ctx, &expr0_0, expr1_0, expr3_0); - let expr5_0 = C::value_reg(ctx, expr4_0); - return expr5_0; - } - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "neg", "src/isa/riscv64/inst.isle line 2047" - ); -} - -// Generated as internal constructor for term max. -pub fn constructor_max(ctx: &mut C, arg0: Type, arg1: Reg, arg2: Reg) -> Reg { - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::fits_in_64(ctx, pattern0_0) { - if let Some(pattern2_0) = C::ty_int(ctx, pattern1_0) { - let pattern3_0 = arg1; - let pattern4_0 = arg2; - let mut closure5 = || { - let expr0_0 = C::has_zbb(ctx); - return Some(expr0_0); - }; - if let Some(pattern5_0) = closure5() { - if pattern5_0 == true { - // Rule at src/isa/riscv64/inst.isle line 2058. - let expr0_0 = AluOPRRR::Max; - let expr1_0 = constructor_alu_rrr(ctx, &expr0_0, pattern3_0, pattern4_0); - return expr1_0; - } - if pattern5_0 == false { - // Rule at src/isa/riscv64/inst.isle line 2062. - let expr0_0 = IntCC::SignedGreaterThan; - let expr1_0 = C::gen_select_reg( - ctx, &expr0_0, pattern3_0, pattern4_0, pattern3_0, pattern4_0, - ); - return expr1_0; - } - } - } - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "max", "src/isa/riscv64/inst.isle line 2057" - ); -} - -// Generated as internal constructor for term lower_iabs. -pub fn constructor_lower_iabs(ctx: &mut C, arg0: Type, arg1: Reg) -> Reg { - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::fits_in_64(ctx, pattern0_0) { - let pattern2_0 = arg1; - // Rule at src/isa/riscv64/inst.isle line 2074. - let expr0_0: bool = true; - let expr1_0 = C::value_reg(ctx, pattern2_0); - let expr2_0 = constructor_ext_int_if_need(ctx, expr0_0, expr1_0, pattern1_0); - let expr3_0 = constructor_convert_valueregs_reg(ctx, expr2_0); - let expr4_0: Type = I64; - let expr5_0 = C::value_reg(ctx, expr3_0); - let expr6_0 = constructor_neg(ctx, expr4_0, expr5_0); - let expr7_0 = constructor_convert_valueregs_reg(ctx, expr6_0); - let expr8_0: Type = I64; - let expr9_0 = constructor_max(ctx, expr8_0, expr3_0, expr7_0); - return expr9_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "lower_iabs", "src/isa/riscv64/inst.isle line 2067" - ); -} - -// Generated as internal constructor for term gen_trapff. -pub fn constructor_gen_trapff( - ctx: &mut C, - arg0: &FloatCC, - arg1: Reg, - arg2: Reg, - arg3: Type, - arg4: &TrapCode, -) -> InstOutput { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - let pattern4_0 = arg4; - // Rule at src/isa/riscv64/inst.isle line 2083. - let expr0_0: Type = I64; - let expr1_0 = C::temp_writable_reg(ctx, expr0_0); - let expr2_0 = MInst::TrapFf { - cc: pattern0_0.clone(), - x: pattern1_0, - y: pattern2_0, - ty: pattern3_0, - tmp: expr1_0, - trap_code: pattern4_0.clone(), - }; - let expr3_0 = SideEffectNoResult::Inst { inst: expr2_0 }; - let expr4_0 = constructor_side_effect(ctx, &expr3_0); - return expr4_0; -} - -// Generated as internal constructor for term gen_trapif. -pub fn constructor_gen_trapif(ctx: &mut C, arg0: Reg, arg1: &TrapCode) -> InstOutput { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/riscv64/inst.isle line 2090. - let expr0_0 = MInst::TrapIf { - test: pattern0_0, - trap_code: pattern1_0.clone(), - }; - let expr1_0 = SideEffectNoResult::Inst { inst: expr0_0 }; - let expr2_0 = constructor_side_effect(ctx, &expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term gen_trapifc. -pub fn constructor_gen_trapifc( - ctx: &mut C, - arg0: &IntCC, - arg1: Reg, - arg2: Reg, - arg3: &TrapCode, -) -> InstOutput { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - // Rule at src/isa/riscv64/inst.isle line 2095. - let expr0_0 = MInst::TrapIfC { - rs1: pattern1_0, - rs2: pattern2_0, - cc: pattern0_0.clone(), - trap_code: pattern3_0.clone(), - }; - let expr1_0 = SideEffectNoResult::Inst { inst: expr0_0 }; - let expr2_0 = constructor_side_effect(ctx, &expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term gen_div_overflow. -pub fn constructor_gen_div_overflow( - ctx: &mut C, - arg0: Reg, - arg1: Reg, - arg2: Type, -) -> InstOutput { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/riscv64/inst.isle line 2104. - let expr0_0: i32 = -1i128 as i32; - let expr1_0 = constructor_load_imm12(ctx, expr0_0); - let expr2_0: i32 = 1i128 as i32; - let expr3_0 = constructor_load_imm12(ctx, expr2_0); - let expr4_0: i32 = 63i128 as i32; - let expr5_0 = constructor_alu_slli(ctx, expr3_0, expr4_0); - let expr6_0 = C::shift_int_to_most_significant(ctx, pattern0_0, pattern2_0); - let expr7_0 = IntCC::Equal; - let expr8_0 = C::value_reg(ctx, expr1_0); - let expr9_0 = C::value_reg(ctx, pattern1_0); - let expr10_0 = constructor_gen_icmp(ctx, &expr7_0, expr8_0, expr9_0, pattern2_0); - let expr11_0 = IntCC::Equal; - let expr12_0 = C::value_reg(ctx, expr5_0); - let expr13_0 = C::value_reg(ctx, expr6_0); - let expr14_0 = constructor_gen_icmp(ctx, &expr11_0, expr12_0, expr13_0, pattern2_0); - let expr15_0 = constructor_alu_and(ctx, expr10_0, expr14_0); - let expr16_0 = TrapCode::IntegerOverflow; - let expr17_0 = constructor_gen_trapif(ctx, expr15_0, &expr16_0); - return expr17_0; -} - -// Generated as internal constructor for term gen_div_by_zero. -pub fn constructor_gen_div_by_zero(ctx: &mut C, arg0: Reg) -> InstOutput { - let pattern0_0 = arg0; - // Rule at src/isa/riscv64/inst.isle line 2116. - let expr0_0 = IntCC::Equal; - let expr1_0 = C::zero_reg(ctx); - let expr2_0 = TrapCode::IntegerDivisionByZero; - let expr3_0 = constructor_gen_trapifc(ctx, &expr0_0, expr1_0, pattern0_0, &expr2_0); - return expr3_0; -} - -// Generated as internal constructor for term madd. -pub fn constructor_madd(ctx: &mut C, arg0: Reg, arg1: Reg, arg2: Reg) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/riscv64/inst.isle line 2130. - let expr0_0 = AluOPRRR::Mul; - let expr1_0 = constructor_alu_rrr(ctx, &expr0_0, pattern0_0, pattern1_0); - let expr2_0 = constructor_alu_add(ctx, expr1_0, pattern2_0); - return expr2_0; -} - -// Generated as internal constructor for term umulh. -pub fn constructor_umulh(ctx: &mut C, arg0: Reg, arg1: Reg) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/riscv64/inst.isle line 2136. - let expr0_0 = AluOPRRR::Mulhu; - let expr1_0 = constructor_alu_rrr(ctx, &expr0_0, pattern0_0, pattern1_0); - return expr1_0; -} - -// Generated as internal constructor for term lower_bmask. -pub fn constructor_lower_bmask( - ctx: &mut C, - arg0: Type, - arg1: Type, - arg2: ValueRegs, -) -> ValueRegs { - let pattern0_0 = arg0; - if pattern0_0 == I128 { - let pattern2_0 = arg1; - if pattern2_0 == I128 { - let pattern4_0 = arg2; - // Rule at src/isa/riscv64/inst.isle line 2176. - let expr0_0: Type = I64; - let expr1_0: Type = I128; - let expr2_0 = constructor_lower_bmask(ctx, expr0_0, expr1_0, pattern4_0); - let expr3_0: usize = 0i128 as usize; - let expr4_0 = C::value_regs_get(ctx, expr2_0, expr3_0); - let expr5_0: usize = 0i128 as usize; - let expr6_0 = C::value_regs_get(ctx, expr2_0, expr5_0); - let expr7_0 = C::value_regs(ctx, expr4_0, expr6_0); - return expr7_0; - } - } - let pattern0_0 = arg0; - if pattern0_0 == I128 { - let pattern2_0 = arg1; - if let Some(pattern3_0) = C::fits_in_64(ctx, pattern2_0) { - let pattern4_0 = arg2; - // Rule at src/isa/riscv64/inst.isle line 2167. - let expr0_0: Type = I64; - let expr1_0 = constructor_lower_bmask(ctx, expr0_0, pattern3_0, pattern4_0); - let expr2_0: usize = 0i128 as usize; - let expr3_0 = C::value_regs_get(ctx, expr1_0, expr2_0); - let expr4_0: usize = 0i128 as usize; - let expr5_0 = C::value_regs_get(ctx, expr1_0, expr4_0); - let expr6_0 = C::value_regs(ctx, expr3_0, expr5_0); - return expr6_0; - } - } - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::fits_in_64(ctx, pattern0_0) { - let pattern2_0 = arg1; - if pattern2_0 == I128 { - let pattern4_0 = arg2; - // Rule at src/isa/riscv64/inst.isle line 2157. - let expr0_0: usize = 0i128 as usize; - let expr1_0 = C::value_regs_get(ctx, pattern4_0, expr0_0); - let expr2_0: usize = 1i128 as usize; - let expr3_0 = C::value_regs_get(ctx, pattern4_0, expr2_0); - let expr4_0 = AluOPRRR::Or; - let expr5_0 = constructor_alu_rrr(ctx, &expr4_0, expr1_0, expr3_0); - let expr6_0: Type = I64; - let expr7_0 = C::value_reg(ctx, expr5_0); - let expr8_0 = constructor_lower_bmask(ctx, pattern1_0, expr6_0, expr7_0); - return expr8_0; - } - } - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::fits_in_64(ctx, pattern0_0) { - let pattern2_0 = arg1; - if let Some(pattern3_0) = C::fits_in_64(ctx, pattern2_0) { - let pattern4_0 = arg2; - // Rule at src/isa/riscv64/inst.isle line 2147. - let expr0_0 = constructor_normalize_cmp_value(ctx, pattern3_0, pattern4_0); - let expr1_0 = constructor_convert_valueregs_reg(ctx, expr0_0); - let expr2_0 = C::zero_reg(ctx); - let expr3_0: i32 = -1i128 as i32; - let expr4_0 = constructor_load_imm12(ctx, expr3_0); - let expr5_0 = IntCC::Equal; - let expr6_0 = C::gen_select_reg(ctx, &expr5_0, expr2_0, expr1_0, expr2_0, expr4_0); - let expr7_0 = C::value_reg(ctx, expr6_0); - return expr7_0; - } - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "lower_bmask", "src/isa/riscv64/inst.isle line 2141" - ); -} - -// Generated as internal constructor for term gen_mov_from_preg. -pub fn constructor_gen_mov_from_preg(ctx: &mut C, arg0: PReg) -> Reg { - let pattern0_0 = arg0; - // Rule at src/isa/riscv64/inst.isle line 2187. - let expr0_0: Type = I64; - let expr1_0 = C::temp_writable_reg(ctx, expr0_0); - let expr2_0 = MInst::MovFromPReg { - rd: expr1_0, - rm: pattern0_0, - }; - let expr3_0 = C::emit(ctx, &expr2_0); - let expr4_0 = C::writable_reg_to_reg(ctx, expr1_0); - return expr4_0; -} - -// Generated as internal constructor for term lower. -pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::first_result(ctx, pattern0_0) { - let pattern2_0 = C::value_type(ctx, pattern1_0); - if pattern2_0 == I8 { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Binary { - opcode: ref pattern5_0, - args: ref pattern5_1, - } = &pattern4_0 - { - match pattern5_0 { - &Opcode::Ishl => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - if let Some(pattern8_0) = C::def_inst(ctx, pattern7_1) { - let pattern9_0 = C::inst_data(ctx, pattern8_0); - if let &InstructionData::UnaryImm { - opcode: ref pattern10_0, - imm: pattern10_1, - } = &pattern9_0 - { - if let &Opcode::Iconst = pattern10_0 { - let pattern12_0 = C::u64_from_imm64(ctx, pattern10_1); - if let Some(pattern13_0) = C::imm12_from_u64(ctx, pattern12_0) { - // Rule at src/isa/riscv64/lower.isle line 311. - let expr0_0 = AluOPRRI::Slliw; - let expr1_0 = C::put_in_reg(ctx, pattern7_0); - let expr2_0: i32 = 7i128 as i32; - let expr3_0 = C::imm12_and(ctx, pattern13_0, expr2_0); - let expr4_0 = constructor_alu_rr_imm12( - ctx, &expr0_0, expr1_0, expr3_0, - ); - let expr5_0 = constructor_output_reg(ctx, expr4_0); - return Some(expr5_0); - } - } - } - } - } - &Opcode::Ushr => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - if let Some(pattern8_0) = C::def_inst(ctx, pattern7_1) { - let pattern9_0 = C::inst_data(ctx, pattern8_0); - if let &InstructionData::UnaryImm { - opcode: ref pattern10_0, - imm: pattern10_1, - } = &pattern9_0 - { - if let &Opcode::Iconst = pattern10_0 { - let pattern12_0 = C::u64_from_imm64(ctx, pattern10_1); - if let Some(pattern13_0) = C::imm12_from_u64(ctx, pattern12_0) { - // Rule at src/isa/riscv64/lower.isle line 337. - let expr0_0 = AluOPRRI::SrliW; - let expr1_0: bool = false; - let expr2_0 = C::put_in_regs(ctx, pattern7_0); - let expr3_0: Type = I8; - let expr4_0 = constructor_ext_int_if_need( - ctx, expr1_0, expr2_0, expr3_0, - ); - let expr5_0 = - constructor_convert_valueregs_reg(ctx, expr4_0); - let expr6_0: i32 = 7i128 as i32; - let expr7_0 = C::imm12_and(ctx, pattern13_0, expr6_0); - let expr8_0 = constructor_alu_rr_imm12( - ctx, &expr0_0, expr5_0, expr7_0, - ); - let expr9_0 = constructor_output_reg(ctx, expr8_0); - return Some(expr9_0); - } - } - } - } - } - &Opcode::Sshr => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - if let Some(pattern8_0) = C::def_inst(ctx, pattern7_1) { - let pattern9_0 = C::inst_data(ctx, pattern8_0); - if let &InstructionData::UnaryImm { - opcode: ref pattern10_0, - imm: pattern10_1, - } = &pattern9_0 - { - if let &Opcode::Iconst = pattern10_0 { - let pattern12_0 = C::u64_from_imm64(ctx, pattern10_1); - if let Some(pattern13_0) = C::imm12_from_u64(ctx, pattern12_0) { - // Rule at src/isa/riscv64/lower.isle line 364. - let expr0_0 = AluOPRRI::Srai; - let expr1_0: bool = true; - let expr2_0 = C::put_in_regs(ctx, pattern7_0); - let expr3_0: Type = I8; - let expr4_0 = constructor_ext_int_if_need( - ctx, expr1_0, expr2_0, expr3_0, - ); - let expr5_0 = - constructor_convert_valueregs_reg(ctx, expr4_0); - let expr6_0: i32 = 7i128 as i32; - let expr7_0 = C::imm12_and(ctx, pattern13_0, expr6_0); - let expr8_0 = constructor_alu_rr_imm12( - ctx, &expr0_0, expr5_0, expr7_0, - ); - let expr9_0 = constructor_output_reg(ctx, expr8_0); - return Some(expr9_0); - } - } - } - } - } - _ => {} - } - } - } - if pattern2_0 == I16 { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Binary { - opcode: ref pattern5_0, - args: ref pattern5_1, - } = &pattern4_0 - { - match pattern5_0 { - &Opcode::Ishl => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - if let Some(pattern8_0) = C::def_inst(ctx, pattern7_1) { - let pattern9_0 = C::inst_data(ctx, pattern8_0); - if let &InstructionData::UnaryImm { - opcode: ref pattern10_0, - imm: pattern10_1, - } = &pattern9_0 - { - if let &Opcode::Iconst = pattern10_0 { - let pattern12_0 = C::u64_from_imm64(ctx, pattern10_1); - if let Some(pattern13_0) = C::imm12_from_u64(ctx, pattern12_0) { - // Rule at src/isa/riscv64/lower.isle line 317. - let expr0_0 = AluOPRRI::Slliw; - let expr1_0 = C::put_in_reg(ctx, pattern7_0); - let expr2_0: i32 = 15i128 as i32; - let expr3_0 = C::imm12_and(ctx, pattern13_0, expr2_0); - let expr4_0 = constructor_alu_rr_imm12( - ctx, &expr0_0, expr1_0, expr3_0, - ); - let expr5_0 = constructor_output_reg(ctx, expr4_0); - return Some(expr5_0); - } - } - } - } - } - &Opcode::Ushr => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - if let Some(pattern8_0) = C::def_inst(ctx, pattern7_1) { - let pattern9_0 = C::inst_data(ctx, pattern8_0); - if let &InstructionData::UnaryImm { - opcode: ref pattern10_0, - imm: pattern10_1, - } = &pattern9_0 - { - if let &Opcode::Iconst = pattern10_0 { - let pattern12_0 = C::u64_from_imm64(ctx, pattern10_1); - if let Some(pattern13_0) = C::imm12_from_u64(ctx, pattern12_0) { - // Rule at src/isa/riscv64/lower.isle line 343. - let expr0_0 = AluOPRRI::SrliW; - let expr1_0: bool = false; - let expr2_0 = C::put_in_regs(ctx, pattern7_0); - let expr3_0: Type = I16; - let expr4_0 = constructor_ext_int_if_need( - ctx, expr1_0, expr2_0, expr3_0, - ); - let expr5_0 = - constructor_convert_valueregs_reg(ctx, expr4_0); - let expr6_0: i32 = 15i128 as i32; - let expr7_0 = C::imm12_and(ctx, pattern13_0, expr6_0); - let expr8_0 = constructor_alu_rr_imm12( - ctx, &expr0_0, expr5_0, expr7_0, - ); - let expr9_0 = constructor_output_reg(ctx, expr8_0); - return Some(expr9_0); - } - } - } - } - } - &Opcode::Sshr => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - if let Some(pattern8_0) = C::def_inst(ctx, pattern7_1) { - let pattern9_0 = C::inst_data(ctx, pattern8_0); - if let &InstructionData::UnaryImm { - opcode: ref pattern10_0, - imm: pattern10_1, - } = &pattern9_0 - { - if let &Opcode::Iconst = pattern10_0 { - let pattern12_0 = C::u64_from_imm64(ctx, pattern10_1); - if let Some(pattern13_0) = C::imm12_from_u64(ctx, pattern12_0) { - // Rule at src/isa/riscv64/lower.isle line 370. - let expr0_0 = AluOPRRI::Srai; - let expr1_0: bool = true; - let expr2_0 = C::put_in_regs(ctx, pattern7_0); - let expr3_0: Type = I16; - let expr4_0 = constructor_ext_int_if_need( - ctx, expr1_0, expr2_0, expr3_0, - ); - let expr5_0 = - constructor_convert_valueregs_reg(ctx, expr4_0); - let expr6_0: i32 = 15i128 as i32; - let expr7_0 = C::imm12_and(ctx, pattern13_0, expr6_0); - let expr8_0 = constructor_alu_rr_imm12( - ctx, &expr0_0, expr5_0, expr7_0, - ); - let expr9_0 = constructor_output_reg(ctx, expr8_0); - return Some(expr9_0); - } - } - } - } - } - _ => {} - } - } - } - if pattern2_0 == I32 { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Binary { - opcode: ref pattern5_0, - args: ref pattern5_1, - } = &pattern4_0 - { - match pattern5_0 { - &Opcode::Ishl => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - if let Some(pattern8_0) = C::def_inst(ctx, pattern7_1) { - let pattern9_0 = C::inst_data(ctx, pattern8_0); - if let &InstructionData::UnaryImm { - opcode: ref pattern10_0, - imm: pattern10_1, - } = &pattern9_0 - { - if let &Opcode::Iconst = pattern10_0 { - let pattern12_0 = C::u64_from_imm64(ctx, pattern10_1); - if let Some(pattern13_0) = C::imm12_from_u64(ctx, pattern12_0) { - // Rule at src/isa/riscv64/lower.isle line 322. - let expr0_0 = AluOPRRI::Slliw; - let expr1_0 = C::put_in_reg(ctx, pattern7_0); - let expr2_0 = constructor_alu_rr_imm12( - ctx, - &expr0_0, - expr1_0, - pattern13_0, - ); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - } - } - } - } - &Opcode::Ushr => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - if let Some(pattern8_0) = C::def_inst(ctx, pattern7_1) { - let pattern9_0 = C::inst_data(ctx, pattern8_0); - if let &InstructionData::UnaryImm { - opcode: ref pattern10_0, - imm: pattern10_1, - } = &pattern9_0 - { - if let &Opcode::Iconst = pattern10_0 { - let pattern12_0 = C::u64_from_imm64(ctx, pattern10_1); - if let Some(pattern13_0) = C::imm12_from_u64(ctx, pattern12_0) { - // Rule at src/isa/riscv64/lower.isle line 348. - let expr0_0 = AluOPRRI::SrliW; - let expr1_0 = C::put_in_reg(ctx, pattern7_0); - let expr2_0 = constructor_alu_rr_imm12( - ctx, - &expr0_0, - expr1_0, - pattern13_0, - ); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - } - } - } - } - &Opcode::Sshr => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - if let Some(pattern8_0) = C::def_inst(ctx, pattern7_1) { - let pattern9_0 = C::inst_data(ctx, pattern8_0); - if let &InstructionData::UnaryImm { - opcode: ref pattern10_0, - imm: pattern10_1, - } = &pattern9_0 - { - if let &Opcode::Iconst = pattern10_0 { - let pattern12_0 = C::u64_from_imm64(ctx, pattern10_1); - if let Some(pattern13_0) = C::imm12_from_u64(ctx, pattern12_0) { - // Rule at src/isa/riscv64/lower.isle line 375. - let expr0_0 = AluOPRRI::Sraiw; - let expr1_0 = C::put_in_reg(ctx, pattern7_0); - let expr2_0 = constructor_alu_rr_imm12( - ctx, - &expr0_0, - expr1_0, - pattern13_0, - ); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - } - } - } - } - _ => {} - } - } - } - if pattern2_0 == I64 { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Binary { - opcode: ref pattern5_0, - args: ref pattern5_1, - } = &pattern4_0 - { - match pattern5_0 { - &Opcode::Ishl => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - if let Some(pattern8_0) = C::def_inst(ctx, pattern7_1) { - let pattern9_0 = C::inst_data(ctx, pattern8_0); - if let &InstructionData::UnaryImm { - opcode: ref pattern10_0, - imm: pattern10_1, - } = &pattern9_0 - { - if let &Opcode::Iconst = pattern10_0 { - let pattern12_0 = C::u64_from_imm64(ctx, pattern10_1); - if let Some(pattern13_0) = C::imm12_from_u64(ctx, pattern12_0) { - // Rule at src/isa/riscv64/lower.isle line 325. - let expr0_0 = AluOPRRI::Slli; - let expr1_0 = C::put_in_reg(ctx, pattern7_0); - let expr2_0 = constructor_alu_rr_imm12( - ctx, - &expr0_0, - expr1_0, - pattern13_0, - ); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - } - } - } - } - &Opcode::Ushr => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - if let Some(pattern8_0) = C::def_inst(ctx, pattern7_1) { - let pattern9_0 = C::inst_data(ctx, pattern8_0); - if let &InstructionData::UnaryImm { - opcode: ref pattern10_0, - imm: pattern10_1, - } = &pattern9_0 - { - if let &Opcode::Iconst = pattern10_0 { - let pattern12_0 = C::u64_from_imm64(ctx, pattern10_1); - if let Some(pattern13_0) = C::imm12_from_u64(ctx, pattern12_0) { - // Rule at src/isa/riscv64/lower.isle line 351. - let expr0_0 = AluOPRRI::Srli; - let expr1_0 = C::put_in_reg(ctx, pattern7_0); - let expr2_0 = constructor_alu_rr_imm12( - ctx, - &expr0_0, - expr1_0, - pattern13_0, - ); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - } - } - } - } - &Opcode::Sshr => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - if let Some(pattern8_0) = C::def_inst(ctx, pattern7_1) { - let pattern9_0 = C::inst_data(ctx, pattern8_0); - if let &InstructionData::UnaryImm { - opcode: ref pattern10_0, - imm: pattern10_1, - } = &pattern9_0 - { - if let &Opcode::Iconst = pattern10_0 { - let pattern12_0 = C::u64_from_imm64(ctx, pattern10_1); - if let Some(pattern13_0) = C::imm12_from_u64(ctx, pattern12_0) { - // Rule at src/isa/riscv64/lower.isle line 379. - let expr0_0 = AluOPRRI::Srai; - let expr1_0 = C::put_in_reg(ctx, pattern7_0); - let expr2_0 = constructor_alu_rr_imm12( - ctx, - &expr0_0, - expr1_0, - pattern13_0, - ); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - } - } - } - } - _ => {} - } - } - } - if let Some(pattern3_0) = C::fits_in_64(ctx, pattern2_0) { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Binary { - opcode: ref pattern5_0, - args: ref pattern5_1, - } = &pattern4_0 - { - match pattern5_0 { - &Opcode::Iadd => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - if let Some(pattern8_0) = C::def_inst(ctx, pattern7_0) { - let pattern9_0 = C::inst_data(ctx, pattern8_0); - if let &InstructionData::UnaryImm { - opcode: ref pattern10_0, - imm: pattern10_1, - } = &pattern9_0 - { - if let &Opcode::Iconst = pattern10_0 { - let pattern12_0 = C::u64_from_imm64(ctx, pattern10_1); - if let Some(pattern13_0) = C::imm12_from_u64(ctx, pattern12_0) { - // Rule at src/isa/riscv64/lower.isle line 40. - let expr0_0 = constructor_select_addi(ctx, pattern3_0); - let expr1_0 = C::put_in_reg(ctx, pattern7_1); - let expr2_0 = constructor_alu_rr_imm12( - ctx, - &expr0_0, - expr1_0, - pattern13_0, - ); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - } - } - } - } - &Opcode::Band => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - if let Some(pattern8_0) = C::def_inst(ctx, pattern7_1) { - let pattern9_0 = C::inst_data(ctx, pattern8_0); - if let &InstructionData::UnaryImm { - opcode: ref pattern10_0, - imm: pattern10_1, - } = &pattern9_0 - { - if let &Opcode::Iconst = pattern10_0 { - let pattern12_0 = C::u64_from_imm64(ctx, pattern10_1); - if let Some(pattern13_0) = C::imm12_from_u64(ctx, pattern12_0) { - // Rule at src/isa/riscv64/lower.isle line 193. - let expr0_0 = AluOPRRI::Andi; - let expr1_0 = C::put_in_reg(ctx, pattern7_0); - let expr2_0 = constructor_alu_rr_imm12( - ctx, - &expr0_0, - expr1_0, - pattern13_0, - ); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - } - } - } - } - &Opcode::Bor => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - if let Some(pattern8_0) = C::def_inst(ctx, pattern7_1) { - let pattern9_0 = C::inst_data(ctx, pattern8_0); - if let &InstructionData::UnaryImm { - opcode: ref pattern10_0, - imm: pattern10_1, - } = &pattern9_0 - { - if let &Opcode::Iconst = pattern10_0 { - let pattern12_0 = C::u64_from_imm64(ctx, pattern10_1); - if let Some(pattern13_0) = C::imm12_from_u64(ctx, pattern12_0) { - // Rule at src/isa/riscv64/lower.isle line 213. - let expr0_0 = AluOPRRI::Ori; - let expr1_0 = C::put_in_reg(ctx, pattern7_0); - let expr2_0 = constructor_alu_rr_imm12( - ctx, - &expr0_0, - expr1_0, - pattern13_0, - ); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - } - } - } - } - &Opcode::Bxor => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - if let Some(pattern8_0) = C::def_inst(ctx, pattern7_1) { - let pattern9_0 = C::inst_data(ctx, pattern8_0); - if let &InstructionData::UnaryImm { - opcode: ref pattern10_0, - imm: pattern10_1, - } = &pattern9_0 - { - if let &Opcode::Iconst = pattern10_0 { - let pattern12_0 = C::u64_from_imm64(ctx, pattern10_1); - if let Some(pattern13_0) = C::imm12_from_u64(ctx, pattern12_0) { - // Rule at src/isa/riscv64/lower.isle line 231. - let expr0_0 = AluOPRRI::Xori; - let expr1_0 = C::put_in_reg(ctx, pattern7_0); - let expr2_0 = constructor_alu_rr_imm12( - ctx, - &expr0_0, - expr1_0, - pattern13_0, - ); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - } - } - } - } - _ => {} - } - } - } - if let Some(pattern3_0) = C::valid_atomic_transaction(ctx, pattern2_0) { - if let Some(pattern4_0) = C::fits_in_16(ctx, pattern3_0) { - let pattern5_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::AtomicRmw { - opcode: ref pattern6_0, - args: ref pattern6_1, - flags: pattern6_2, - op: ref pattern6_3, - } = &pattern5_0 - { - if let &Opcode::AtomicRmw = pattern6_0 { - let (pattern8_0, pattern8_1) = C::unpack_value_array_2(ctx, pattern6_1); - if let Some((pattern9_0, pattern9_1)) = - C::is_atomic_rmw_max_etc(ctx, pattern6_3) - { - if pattern9_1 == true { - // Rule at src/isa/riscv64/lower.isle line 474. - let expr0_0 = C::put_in_reg(ctx, pattern8_0); - let expr1_0: bool = true; - let expr2_0 = C::put_in_regs(ctx, pattern8_1); - let expr3_0 = - constructor_ext_int_if_need(ctx, expr1_0, expr2_0, pattern4_0); - let expr4_0 = constructor_convert_valueregs_reg(ctx, expr3_0); - let expr5_0 = constructor_gen_atomic_rmw_loop( - ctx, - &pattern9_0, - pattern4_0, - expr0_0, - expr4_0, - ); - let expr6_0 = constructor_output_reg(ctx, expr5_0); - return Some(expr6_0); - } - if pattern9_1 == false { - // Rule at src/isa/riscv64/lower.isle line 480. - let expr0_0 = C::put_in_reg(ctx, pattern8_0); - let expr1_0: bool = false; - let expr2_0 = C::put_in_regs(ctx, pattern8_1); - let expr3_0 = - constructor_ext_int_if_need(ctx, expr1_0, expr2_0, pattern4_0); - let expr4_0 = constructor_convert_valueregs_reg(ctx, expr3_0); - let expr5_0 = constructor_gen_atomic_rmw_loop( - ctx, - &pattern9_0, - pattern4_0, - expr0_0, - expr4_0, - ); - let expr6_0 = constructor_output_reg(ctx, expr5_0); - return Some(expr6_0); - } - } - } - } - } - } - } - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::first_result(ctx, pattern0_0) { - let pattern2_0 = C::value_type(ctx, pattern1_0); - if pattern2_0 == I8 { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Binary { - opcode: ref pattern5_0, - args: ref pattern5_1, - } = &pattern4_0 - { - match pattern5_0 { - &Opcode::Ishl => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/riscv64/lower.isle line 308. - let expr0_0 = AluOPRRR::Sllw; - let expr1_0 = C::put_in_reg(ctx, pattern7_0); - let expr2_0 = C::put_in_regs(ctx, pattern7_1); - let expr3_0: usize = 0i128 as usize; - let expr4_0 = C::value_regs_get(ctx, expr2_0, expr3_0); - let expr5_0: i32 = 7i128 as i32; - let expr6_0 = constructor_alu_andi(ctx, expr4_0, expr5_0); - let expr7_0 = constructor_alu_rrr(ctx, &expr0_0, expr1_0, expr6_0); - let expr8_0 = constructor_output_reg(ctx, expr7_0); - return Some(expr8_0); - } - &Opcode::Ushr => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/riscv64/lower.isle line 334. - let expr0_0 = AluOPRRR::Srlw; - let expr1_0: bool = false; - let expr2_0 = C::put_in_regs(ctx, pattern7_0); - let expr3_0: Type = I8; - let expr4_0 = constructor_ext_int_if_need(ctx, expr1_0, expr2_0, expr3_0); - let expr5_0 = constructor_convert_valueregs_reg(ctx, expr4_0); - let expr6_0 = C::put_in_regs(ctx, pattern7_1); - let expr7_0: usize = 0i128 as usize; - let expr8_0 = C::value_regs_get(ctx, expr6_0, expr7_0); - let expr9_0: i32 = 7i128 as i32; - let expr10_0 = constructor_alu_andi(ctx, expr8_0, expr9_0); - let expr11_0 = constructor_alu_rrr(ctx, &expr0_0, expr5_0, expr10_0); - let expr12_0 = constructor_output_reg(ctx, expr11_0); - return Some(expr12_0); - } - &Opcode::Sshr => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/riscv64/lower.isle line 361. - let expr0_0 = AluOPRRR::Sra; - let expr1_0: bool = true; - let expr2_0 = C::put_in_regs(ctx, pattern7_0); - let expr3_0: Type = I8; - let expr4_0 = constructor_ext_int_if_need(ctx, expr1_0, expr2_0, expr3_0); - let expr5_0 = constructor_convert_valueregs_reg(ctx, expr4_0); - let expr6_0 = C::put_in_regs(ctx, pattern7_1); - let expr7_0: usize = 0i128 as usize; - let expr8_0 = C::value_regs_get(ctx, expr6_0, expr7_0); - let expr9_0: i32 = 7i128 as i32; - let expr10_0 = constructor_alu_andi(ctx, expr8_0, expr9_0); - let expr11_0 = constructor_alu_rrr(ctx, &expr0_0, expr5_0, expr10_0); - let expr12_0 = constructor_output_reg(ctx, expr11_0); - return Some(expr12_0); - } - _ => {} - } - } - } - if pattern2_0 == I16 { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Binary { - opcode: ref pattern5_0, - args: ref pattern5_1, - } = &pattern4_0 - { - match pattern5_0 { - &Opcode::Ishl => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/riscv64/lower.isle line 314. - let expr0_0 = AluOPRRR::Sllw; - let expr1_0 = C::put_in_reg(ctx, pattern7_0); - let expr2_0 = C::put_in_regs(ctx, pattern7_1); - let expr3_0: usize = 0i128 as usize; - let expr4_0 = C::value_regs_get(ctx, expr2_0, expr3_0); - let expr5_0: i32 = 15i128 as i32; - let expr6_0 = constructor_alu_andi(ctx, expr4_0, expr5_0); - let expr7_0 = constructor_alu_rrr(ctx, &expr0_0, expr1_0, expr6_0); - let expr8_0 = constructor_output_reg(ctx, expr7_0); - return Some(expr8_0); - } - &Opcode::Ushr => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/riscv64/lower.isle line 340. - let expr0_0 = AluOPRRR::Srlw; - let expr1_0: bool = false; - let expr2_0 = C::put_in_regs(ctx, pattern7_0); - let expr3_0: Type = I16; - let expr4_0 = constructor_ext_int_if_need(ctx, expr1_0, expr2_0, expr3_0); - let expr5_0 = constructor_convert_valueregs_reg(ctx, expr4_0); - let expr6_0 = C::put_in_regs(ctx, pattern7_1); - let expr7_0: usize = 0i128 as usize; - let expr8_0 = C::value_regs_get(ctx, expr6_0, expr7_0); - let expr9_0: i32 = 15i128 as i32; - let expr10_0 = constructor_alu_andi(ctx, expr8_0, expr9_0); - let expr11_0 = constructor_alu_rrr(ctx, &expr0_0, expr5_0, expr10_0); - let expr12_0 = constructor_output_reg(ctx, expr11_0); - return Some(expr12_0); - } - &Opcode::Sshr => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/riscv64/lower.isle line 367. - let expr0_0 = AluOPRRR::Sra; - let expr1_0: bool = true; - let expr2_0 = C::put_in_regs(ctx, pattern7_0); - let expr3_0: Type = I16; - let expr4_0 = constructor_ext_int_if_need(ctx, expr1_0, expr2_0, expr3_0); - let expr5_0 = constructor_convert_valueregs_reg(ctx, expr4_0); - let expr6_0 = C::put_in_regs(ctx, pattern7_1); - let expr7_0: usize = 0i128 as usize; - let expr8_0 = C::value_regs_get(ctx, expr6_0, expr7_0); - let expr9_0: i32 = 15i128 as i32; - let expr10_0 = constructor_alu_andi(ctx, expr8_0, expr9_0); - let expr11_0 = constructor_alu_rrr(ctx, &expr0_0, expr5_0, expr10_0); - let expr12_0 = constructor_output_reg(ctx, expr11_0); - return Some(expr12_0); - } - _ => {} - } - } - } - if pattern2_0 == I32 { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Binary { - opcode: ref pattern5_0, - args: ref pattern5_1, - } = &pattern4_0 - { - match pattern5_0 { - &Opcode::Ishl => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/riscv64/lower.isle line 320. - let expr0_0 = AluOPRRR::Sllw; - let expr1_0 = C::put_in_reg(ctx, pattern7_0); - let expr2_0 = C::put_in_regs(ctx, pattern7_1); - let expr3_0: usize = 0i128 as usize; - let expr4_0 = C::value_regs_get(ctx, expr2_0, expr3_0); - let expr5_0 = constructor_alu_rrr(ctx, &expr0_0, expr1_0, expr4_0); - let expr6_0 = constructor_output_reg(ctx, expr5_0); - return Some(expr6_0); - } - &Opcode::Ushr => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/riscv64/lower.isle line 346. - let expr0_0 = AluOPRRR::Srlw; - let expr1_0 = C::put_in_reg(ctx, pattern7_0); - let expr2_0 = C::put_in_regs(ctx, pattern7_1); - let expr3_0: usize = 0i128 as usize; - let expr4_0 = C::value_regs_get(ctx, expr2_0, expr3_0); - let expr5_0 = constructor_alu_rrr(ctx, &expr0_0, expr1_0, expr4_0); - let expr6_0 = constructor_output_reg(ctx, expr5_0); - return Some(expr6_0); - } - &Opcode::Sshr => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/riscv64/lower.isle line 373. - let expr0_0 = AluOPRRR::Sraw; - let expr1_0 = C::put_in_reg(ctx, pattern7_0); - let expr2_0 = C::put_in_regs(ctx, pattern7_1); - let expr3_0: usize = 0i128 as usize; - let expr4_0 = C::value_regs_get(ctx, expr2_0, expr3_0); - let expr5_0 = constructor_alu_rrr(ctx, &expr0_0, expr1_0, expr4_0); - let expr6_0 = constructor_output_reg(ctx, expr5_0); - return Some(expr6_0); - } - _ => {} - } - } - } - if pattern2_0 == I64 { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Binary { - opcode: ref pattern5_0, - args: ref pattern5_1, - } = &pattern4_0 - { - match pattern5_0 { - &Opcode::Ishl => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/riscv64/lower.isle line 327. - let expr0_0 = AluOPRRR::Sll; - let expr1_0 = C::put_in_reg(ctx, pattern7_0); - let expr2_0 = C::put_in_regs(ctx, pattern7_1); - let expr3_0: usize = 0i128 as usize; - let expr4_0 = C::value_regs_get(ctx, expr2_0, expr3_0); - let expr5_0 = constructor_alu_rrr(ctx, &expr0_0, expr1_0, expr4_0); - let expr6_0 = constructor_output_reg(ctx, expr5_0); - return Some(expr6_0); - } - &Opcode::Ushr => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/riscv64/lower.isle line 353. - let expr0_0 = AluOPRRR::Srl; - let expr1_0 = C::put_in_reg(ctx, pattern7_0); - let expr2_0 = C::put_in_regs(ctx, pattern7_1); - let expr3_0: usize = 0i128 as usize; - let expr4_0 = C::value_regs_get(ctx, expr2_0, expr3_0); - let expr5_0 = constructor_alu_rrr(ctx, &expr0_0, expr1_0, expr4_0); - let expr6_0 = constructor_output_reg(ctx, expr5_0); - return Some(expr6_0); - } - &Opcode::Sshr => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/riscv64/lower.isle line 377. - let expr0_0 = AluOPRRR::Sra; - let expr1_0 = C::put_in_reg(ctx, pattern7_0); - let expr2_0 = C::put_in_regs(ctx, pattern7_1); - let expr3_0: usize = 0i128 as usize; - let expr4_0 = C::value_regs_get(ctx, expr2_0, expr3_0); - let expr5_0 = constructor_alu_rrr(ctx, &expr0_0, expr1_0, expr4_0); - let expr6_0 = constructor_output_reg(ctx, expr5_0); - return Some(expr6_0); - } - _ => {} - } - } - } - if pattern2_0 == I128 { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - match &pattern4_0 { - &InstructionData::Unary { - opcode: ref pattern5_0, - arg: pattern5_1, - } => { - match pattern5_0 { - &Opcode::Bitrev => { - // Rule at src/isa/riscv64/lower.isle line 263. - let expr0_0 = C::put_in_regs(ctx, pattern5_1); - let expr1_0: usize = 0i128 as usize; - let expr2_0 = C::value_regs_get(ctx, expr0_0, expr1_0); - let expr3_0: Type = I64; - let expr4_0 = constructor_lower_bit_reverse(ctx, expr2_0, expr3_0); - let expr5_0: usize = 1i128 as usize; - let expr6_0 = C::value_regs_get(ctx, expr0_0, expr5_0); - let expr7_0: Type = I64; - let expr8_0 = constructor_lower_bit_reverse(ctx, expr6_0, expr7_0); - let expr9_0 = C::value_regs(ctx, expr8_0, expr4_0); - let expr10_0 = C::output(ctx, expr9_0); - return Some(expr10_0); - } - &Opcode::Clz => { - // Rule at src/isa/riscv64/lower.isle line 280. - let expr0_0 = C::put_in_regs(ctx, pattern5_1); - let expr1_0 = constructor_lower_clz_i128(ctx, expr0_0); - let expr2_0 = C::output(ctx, expr1_0); - return Some(expr2_0); - } - &Opcode::Cls => { - // Rule at src/isa/riscv64/lower.isle line 426. - let expr0_0 = C::put_in_regs(ctx, pattern5_1); - let expr1_0 = constructor_lower_cls_i128(ctx, expr0_0); - let expr2_0 = C::output(ctx, expr1_0); - return Some(expr2_0); - } - &Opcode::Ctz => { - // Rule at src/isa/riscv64/lower.isle line 274. - let expr0_0 = C::put_in_regs(ctx, pattern5_1); - let expr1_0 = constructor_lower_ctz_128(ctx, expr0_0); - let expr2_0 = C::output(ctx, expr1_0); - return Some(expr2_0); - } - &Opcode::Popcnt => { - // Rule at src/isa/riscv64/lower.isle line 304. - let expr0_0 = C::put_in_regs(ctx, pattern5_1); - let expr1_0 = constructor_lower_popcnt_i128(ctx, expr0_0); - let expr2_0 = C::output(ctx, expr1_0); - return Some(expr2_0); - } - _ => {} - } - } - &InstructionData::Load { - opcode: ref pattern5_0, - arg: pattern5_1, - flags: pattern5_2, - offset: pattern5_3, - } => { - if let &Opcode::Load = pattern5_0 { - // Rule at src/isa/riscv64/lower.isle line 714. - let expr0_0 = C::put_in_reg(ctx, pattern5_1); - let expr1_0 = - constructor_gen_load_128(ctx, expr0_0, pattern5_3, pattern5_2); - let expr2_0 = C::output(ctx, expr1_0); - return Some(expr2_0); - } - } - &InstructionData::Binary { - opcode: ref pattern5_0, - args: ref pattern5_1, - } => { - match pattern5_0 { - &Opcode::BandNot => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/riscv64/lower.isle line 295. - let expr0_0 = C::put_in_regs(ctx, pattern7_0); - let expr1_0: usize = 0i128 as usize; - let expr2_0 = C::value_regs_get(ctx, expr0_0, expr1_0); - let expr3_0 = C::put_in_regs(ctx, pattern7_1); - let expr4_0: usize = 0i128 as usize; - let expr5_0 = C::value_regs_get(ctx, expr3_0, expr4_0); - let expr6_0 = constructor_gen_andn(ctx, expr2_0, expr5_0); - let expr7_0 = C::put_in_regs(ctx, pattern7_0); - let expr8_0: usize = 1i128 as usize; - let expr9_0 = C::value_regs_get(ctx, expr7_0, expr8_0); - let expr10_0 = C::put_in_regs(ctx, pattern7_1); - let expr11_0: usize = 1i128 as usize; - let expr12_0 = C::value_regs_get(ctx, expr10_0, expr11_0); - let expr13_0 = constructor_gen_andn(ctx, expr9_0, expr12_0); - let expr14_0 = C::value_regs(ctx, expr6_0, expr13_0); - let expr15_0 = C::output(ctx, expr14_0); - return Some(expr15_0); - } - &Opcode::BorNot => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/riscv64/lower.isle line 416. - let expr0_0 = C::put_in_regs(ctx, pattern7_0); - let expr1_0: usize = 0i128 as usize; - let expr2_0 = C::value_regs_get(ctx, expr0_0, expr1_0); - let expr3_0 = C::put_in_regs(ctx, pattern7_1); - let expr4_0: usize = 0i128 as usize; - let expr5_0 = C::value_regs_get(ctx, expr3_0, expr4_0); - let expr6_0 = constructor_gen_orn(ctx, expr2_0, expr5_0); - let expr7_0 = C::put_in_regs(ctx, pattern7_0); - let expr8_0: usize = 1i128 as usize; - let expr9_0 = C::value_regs_get(ctx, expr7_0, expr8_0); - let expr10_0 = C::put_in_regs(ctx, pattern7_1); - let expr11_0: usize = 1i128 as usize; - let expr12_0 = C::value_regs_get(ctx, expr10_0, expr11_0); - let expr13_0 = constructor_gen_orn(ctx, expr9_0, expr12_0); - let expr14_0 = C::value_regs(ctx, expr6_0, expr13_0); - let expr15_0 = C::output(ctx, expr14_0); - return Some(expr15_0); - } - &Opcode::BxorNot => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/riscv64/lower.isle line 404. - let expr0_0 = C::put_in_regs(ctx, pattern7_0); - let expr1_0: usize = 0i128 as usize; - let expr2_0 = C::value_regs_get(ctx, expr0_0, expr1_0); - let expr3_0 = C::put_in_regs(ctx, pattern7_1); - let expr4_0: usize = 0i128 as usize; - let expr5_0 = C::value_regs_get(ctx, expr3_0, expr4_0); - let expr6_0 = constructor_gen_xor_not(ctx, expr2_0, expr5_0); - let expr7_0 = C::put_in_regs(ctx, pattern7_0); - let expr8_0: usize = 1i128 as usize; - let expr9_0 = C::value_regs_get(ctx, expr7_0, expr8_0); - let expr10_0 = C::put_in_regs(ctx, pattern7_1); - let expr11_0: usize = 1i128 as usize; - let expr12_0 = C::value_regs_get(ctx, expr10_0, expr11_0); - let expr13_0 = constructor_gen_xor_not(ctx, expr9_0, expr12_0); - let expr14_0 = C::value_regs(ctx, expr6_0, expr13_0); - let expr15_0 = C::output(ctx, expr14_0); - return Some(expr15_0); - } - &Opcode::Rotl => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/riscv64/lower.isle line 389. - let expr0_0 = C::put_in_regs(ctx, pattern7_0); - let expr1_0 = C::put_in_regs(ctx, pattern7_1); - let expr2_0 = constructor_lower_i128_rotl(ctx, expr0_0, expr1_0); - let expr3_0 = C::output(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::Rotr => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/riscv64/lower.isle line 396. - let expr0_0 = C::put_in_regs(ctx, pattern7_0); - let expr1_0 = C::put_in_regs(ctx, pattern7_1); - let expr2_0 = constructor_lower_i128_rotr(ctx, expr0_0, expr1_0); - let expr3_0 = C::output(ctx, expr2_0); - return Some(expr3_0); - } - _ => {} - } - } - _ => {} - } - } - if let Some(pattern3_0) = C::fits_in_64(ctx, pattern2_0) { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Binary { - opcode: ref pattern5_0, - args: ref pattern5_1, - } = &pattern4_0 - { - match pattern5_0 { - &Opcode::Iadd => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - if let Some(pattern8_0) = C::def_inst(ctx, pattern7_1) { - let pattern9_0 = C::inst_data(ctx, pattern8_0); - if let &InstructionData::UnaryImm { - opcode: ref pattern10_0, - imm: pattern10_1, - } = &pattern9_0 - { - if let &Opcode::Iconst = pattern10_0 { - let pattern12_0 = C::u64_from_imm64(ctx, pattern10_1); - if let Some(pattern13_0) = C::imm12_from_u64(ctx, pattern12_0) { - // Rule at src/isa/riscv64/lower.isle line 37. - let expr0_0 = constructor_select_addi(ctx, pattern3_0); - let expr1_0 = C::put_in_reg(ctx, pattern7_0); - let expr2_0 = constructor_alu_rr_imm12( - ctx, - &expr0_0, - expr1_0, - pattern13_0, - ); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - } - } - } - } - &Opcode::Band => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - if let Some(pattern8_0) = C::def_inst(ctx, pattern7_0) { - let pattern9_0 = C::inst_data(ctx, pattern8_0); - if let &InstructionData::UnaryImm { - opcode: ref pattern10_0, - imm: pattern10_1, - } = &pattern9_0 - { - if let &Opcode::Iconst = pattern10_0 { - let pattern12_0 = C::u64_from_imm64(ctx, pattern10_1); - if let Some(pattern13_0) = C::imm12_from_u64(ctx, pattern12_0) { - // Rule at src/isa/riscv64/lower.isle line 196. - let expr0_0 = AluOPRRI::Andi; - let expr1_0 = C::put_in_reg(ctx, pattern7_1); - let expr2_0 = constructor_alu_rr_imm12( - ctx, - &expr0_0, - expr1_0, - pattern13_0, - ); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - } - } - } - } - &Opcode::Bor => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - if let Some(pattern8_0) = C::def_inst(ctx, pattern7_0) { - let pattern9_0 = C::inst_data(ctx, pattern8_0); - if let &InstructionData::UnaryImm { - opcode: ref pattern10_0, - imm: pattern10_1, - } = &pattern9_0 - { - if let &Opcode::Iconst = pattern10_0 { - let pattern12_0 = C::u64_from_imm64(ctx, pattern10_1); - if let Some(pattern13_0) = C::imm12_from_u64(ctx, pattern12_0) { - // Rule at src/isa/riscv64/lower.isle line 216. - let expr0_0 = AluOPRRI::Ori; - let expr1_0 = C::put_in_reg(ctx, pattern7_1); - let expr2_0 = constructor_alu_rr_imm12( - ctx, - &expr0_0, - expr1_0, - pattern13_0, - ); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - } - } - } - } - &Opcode::Bxor => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - if let Some(pattern8_0) = C::def_inst(ctx, pattern7_0) { - let pattern9_0 = C::inst_data(ctx, pattern8_0); - if let &InstructionData::UnaryImm { - opcode: ref pattern10_0, - imm: pattern10_1, - } = &pattern9_0 - { - if let &Opcode::Iconst = pattern10_0 { - let pattern12_0 = C::u64_from_imm64(ctx, pattern10_1); - if let Some(pattern13_0) = C::imm12_from_u64(ctx, pattern12_0) { - // Rule at src/isa/riscv64/lower.isle line 234. - let expr0_0 = AluOPRRI::Xori; - let expr1_0 = C::put_in_reg(ctx, pattern7_1); - let expr2_0 = constructor_alu_rr_imm12( - ctx, - &expr0_0, - expr1_0, - pattern13_0, - ); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - } - } - } - } - _ => {} - } - } - } - if let Some(pattern3_0) = C::valid_atomic_transaction(ctx, pattern2_0) { - if let Some(pattern4_0) = C::fits_in_16(ctx, pattern3_0) { - let pattern5_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::AtomicRmw { - opcode: ref pattern6_0, - args: ref pattern6_1, - flags: pattern6_2, - op: ref pattern6_3, - } = &pattern5_0 - { - if let &Opcode::AtomicRmw = pattern6_0 { - let (pattern8_0, pattern8_1) = C::unpack_value_array_2(ctx, pattern6_1); - // Rule at src/isa/riscv64/lower.isle line 467. - let expr0_0 = C::put_in_reg(ctx, pattern8_0); - let expr1_0 = C::put_in_reg(ctx, pattern8_1); - let expr2_0 = constructor_gen_atomic_rmw_loop( - ctx, pattern6_3, pattern4_0, expr0_0, expr1_0, - ); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - } - } - } - let pattern3_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Ternary { - opcode: ref pattern4_0, - args: ref pattern4_1, - } = &pattern3_0 - { - if let &Opcode::Select = pattern4_0 { - let (pattern6_0, pattern6_1, pattern6_2) = C::unpack_value_array_3(ctx, pattern4_1); - if let Some(pattern7_0) = C::def_inst(ctx, pattern6_0) { - let pattern8_0 = C::inst_data(ctx, pattern7_0); - if let &InstructionData::IntCompare { - opcode: ref pattern9_0, - args: ref pattern9_1, - cond: ref pattern9_2, - } = &pattern8_0 - { - if let &Opcode::Icmp = pattern9_0 { - let (pattern11_0, pattern11_1) = - C::unpack_value_array_2(ctx, pattern9_1); - let pattern12_0 = C::value_type(ctx, pattern11_1); - // Rule at src/isa/riscv64/lower.isle line 614. - let expr0_0 = C::put_in_regs(ctx, pattern11_0); - let expr1_0 = - constructor_normalize_cmp_value(ctx, pattern12_0, expr0_0); - let expr2_0 = constructor_convert_valueregs_reg(ctx, expr1_0); - let expr3_0 = C::put_in_regs(ctx, pattern11_1); - let expr4_0 = - constructor_normalize_cmp_value(ctx, pattern12_0, expr3_0); - let expr5_0 = constructor_convert_valueregs_reg(ctx, expr4_0); - let expr6_0 = C::put_in_reg(ctx, pattern6_1); - let expr7_0 = C::put_in_reg(ctx, pattern6_2); - let expr8_0 = C::gen_select_reg( - ctx, pattern9_2, expr2_0, expr5_0, expr6_0, expr7_0, - ); - let expr9_0 = constructor_output_reg(ctx, expr8_0); - return Some(expr9_0); - } - } - } - } - } - } - let pattern1_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Store { - opcode: ref pattern2_0, - args: ref pattern2_1, - flags: pattern2_2, - offset: pattern2_3, - } = &pattern1_0 - { - if let &Opcode::Store = pattern2_0 { - let (pattern4_0, pattern4_1) = C::unpack_value_array_2(ctx, pattern2_1); - let pattern5_0 = C::value_type(ctx, pattern4_0); - if pattern5_0 == I128 { - // Rule at src/isa/riscv64/lower.isle line 738. - let expr0_0 = C::put_in_reg(ctx, pattern4_1); - let expr1_0 = C::put_in_regs(ctx, pattern4_0); - let expr2_0 = - constructor_gen_store_128(ctx, expr0_0, pattern2_3, pattern2_2, expr1_0); - return Some(expr2_0); - } - } - } - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::first_result(ctx, pattern0_0) { - let pattern2_0 = C::value_type(ctx, pattern1_0); - if pattern2_0 == I32 { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Binary { - opcode: ref pattern5_0, - args: ref pattern5_1, - } = &pattern4_0 - { - match pattern5_0 { - &Opcode::Urem => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/riscv64/lower.isle line 172. - let expr0_0: bool = false; - let expr1_0 = C::put_in_regs(ctx, pattern7_1); - let expr2_0: Type = I32; - let expr3_0 = constructor_ext_int_if_need(ctx, expr0_0, expr1_0, expr2_0); - let expr4_0 = constructor_convert_valueregs_reg(ctx, expr3_0); - let expr5_0 = constructor_gen_div_by_zero(ctx, expr4_0); - let expr6_0 = AluOPRRR::Remuw; - let expr7_0 = C::put_in_reg(ctx, pattern7_0); - let expr8_0 = constructor_alu_rrr(ctx, &expr6_0, expr7_0, expr4_0); - let expr9_0 = constructor_output_reg(ctx, expr8_0); - return Some(expr9_0); - } - &Opcode::Srem => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/riscv64/lower.isle line 166. - let expr0_0: bool = true; - let expr1_0 = C::put_in_regs(ctx, pattern7_1); - let expr2_0: Type = I32; - let expr3_0 = constructor_ext_int_if_need(ctx, expr0_0, expr1_0, expr2_0); - let expr4_0 = constructor_convert_valueregs_reg(ctx, expr3_0); - let expr5_0 = constructor_gen_div_by_zero(ctx, expr4_0); - let expr6_0 = AluOPRRR::Remw; - let expr7_0 = C::put_in_reg(ctx, pattern7_0); - let expr8_0 = constructor_alu_rrr(ctx, &expr6_0, expr7_0, expr4_0); - let expr9_0 = constructor_output_reg(ctx, expr8_0); - return Some(expr9_0); - } - _ => {} - } - } - } - if pattern2_0 == I64 { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Binary { - opcode: ref pattern5_0, - args: ref pattern5_1, - } = &pattern4_0 - { - match pattern5_0 { - &Opcode::Udiv => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/riscv64/lower.isle line 147. - let expr0_0 = C::put_in_reg(ctx, pattern7_1); - let expr1_0 = constructor_gen_div_by_zero(ctx, expr0_0); - let expr2_0 = AluOPRRR::DivU; - let expr3_0 = C::put_in_reg(ctx, pattern7_0); - let expr4_0 = C::put_in_reg(ctx, pattern7_1); - let expr5_0 = constructor_alu_rrr(ctx, &expr2_0, expr3_0, expr4_0); - let expr6_0 = constructor_output_reg(ctx, expr5_0); - return Some(expr6_0); - } - &Opcode::Sdiv => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/riscv64/lower.isle line 141. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = C::put_in_reg(ctx, pattern7_1); - let expr2_0: Type = I64; - let expr3_0 = constructor_gen_div_overflow(ctx, expr0_0, expr1_0, expr2_0); - let expr4_0 = C::put_in_reg(ctx, pattern7_1); - let expr5_0 = constructor_gen_div_by_zero(ctx, expr4_0); - let expr6_0 = AluOPRRR::Div; - let expr7_0 = C::put_in_reg(ctx, pattern7_0); - let expr8_0 = C::put_in_reg(ctx, pattern7_1); - let expr9_0 = constructor_alu_rrr(ctx, &expr6_0, expr7_0, expr8_0); - let expr10_0 = constructor_output_reg(ctx, expr9_0); - return Some(expr10_0); - } - &Opcode::Urem => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/riscv64/lower.isle line 183. - let expr0_0 = C::put_in_reg(ctx, pattern7_1); - let expr1_0 = constructor_gen_div_by_zero(ctx, expr0_0); - let expr2_0 = AluOPRRR::RemU; - let expr3_0 = C::put_in_reg(ctx, pattern7_0); - let expr4_0 = C::put_in_reg(ctx, pattern7_1); - let expr5_0 = constructor_alu_rrr(ctx, &expr2_0, expr3_0, expr4_0); - let expr6_0 = constructor_output_reg(ctx, expr5_0); - return Some(expr6_0); - } - &Opcode::Srem => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/riscv64/lower.isle line 178. - let expr0_0 = C::put_in_reg(ctx, pattern7_1); - let expr1_0 = constructor_gen_div_by_zero(ctx, expr0_0); - let expr2_0 = AluOPRRR::Rem; - let expr3_0 = C::put_in_reg(ctx, pattern7_0); - let expr4_0 = C::put_in_reg(ctx, pattern7_1); - let expr5_0 = constructor_alu_rrr(ctx, &expr2_0, expr3_0, expr4_0); - let expr6_0 = constructor_output_reg(ctx, expr5_0); - return Some(expr6_0); - } - _ => {} - } - } - } - if pattern2_0 == I128 { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - match &pattern4_0 { - &InstructionData::Unary { - opcode: ref pattern5_0, - arg: pattern5_1, - } => { - if let &Opcode::Bnot = pattern5_0 { - // Rule at src/isa/riscv64/lower.isle line 248. - let expr0_0 = C::put_in_regs(ctx, pattern5_1); - let expr1_0 = constructor_bnot_128(ctx, expr0_0); - let expr2_0 = C::output(ctx, expr1_0); - return Some(expr2_0); - } - } - &InstructionData::Binary { - opcode: ref pattern5_0, - args: ref pattern5_1, - } => { - match pattern5_0 { - &Opcode::Iadd => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/riscv64/lower.isle line 44. - let expr0_0 = C::put_in_regs(ctx, pattern7_0); - let expr1_0: usize = 0i128 as usize; - let expr2_0 = C::value_regs_get(ctx, expr0_0, expr1_0); - let expr3_0 = C::put_in_regs(ctx, pattern7_1); - let expr4_0: usize = 0i128 as usize; - let expr5_0 = C::value_regs_get(ctx, expr3_0, expr4_0); - let expr6_0 = constructor_alu_add(ctx, expr2_0, expr5_0); - let expr7_0 = AluOPRRR::SltU; - let expr8_0 = C::put_in_regs(ctx, pattern7_1); - let expr9_0: usize = 0i128 as usize; - let expr10_0 = C::value_regs_get(ctx, expr8_0, expr9_0); - let expr11_0 = constructor_alu_rrr(ctx, &expr7_0, expr6_0, expr10_0); - let expr12_0 = C::put_in_regs(ctx, pattern7_0); - let expr13_0: usize = 1i128 as usize; - let expr14_0 = C::value_regs_get(ctx, expr12_0, expr13_0); - let expr15_0 = C::put_in_regs(ctx, pattern7_1); - let expr16_0: usize = 1i128 as usize; - let expr17_0 = C::value_regs_get(ctx, expr15_0, expr16_0); - let expr18_0 = constructor_alu_add(ctx, expr14_0, expr17_0); - let expr19_0 = constructor_alu_add(ctx, expr18_0, expr11_0); - let expr20_0 = C::value_regs(ctx, expr6_0, expr19_0); - let expr21_0 = C::output(ctx, expr20_0); - return Some(expr21_0); - } - &Opcode::Isub => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/riscv64/lower.isle line 73. - let expr0_0 = C::put_in_regs(ctx, pattern7_0); - let expr1_0 = C::put_in_regs(ctx, pattern7_1); - let expr2_0 = constructor_i128_sub(ctx, expr0_0, expr1_0); - let expr3_0 = C::output(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::Imul => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/riscv64/lower.isle line 98. - let expr0_0 = C::put_in_regs(ctx, pattern7_0); - let expr1_0: usize = 0i128 as usize; - let expr2_0 = C::value_regs_get(ctx, expr0_0, expr1_0); - let expr3_0: usize = 1i128 as usize; - let expr4_0 = C::value_regs_get(ctx, expr0_0, expr3_0); - let expr5_0 = C::put_in_regs(ctx, pattern7_1); - let expr6_0: usize = 0i128 as usize; - let expr7_0 = C::value_regs_get(ctx, expr5_0, expr6_0); - let expr8_0: usize = 1i128 as usize; - let expr9_0 = C::value_regs_get(ctx, expr5_0, expr8_0); - let expr10_0 = constructor_umulh(ctx, expr2_0, expr7_0); - let expr11_0 = constructor_madd(ctx, expr2_0, expr9_0, expr10_0); - let expr12_0 = constructor_madd(ctx, expr4_0, expr7_0, expr11_0); - let expr13_0 = C::zero_reg(ctx); - let expr14_0 = constructor_madd(ctx, expr2_0, expr7_0, expr13_0); - let expr15_0 = C::value_regs(ctx, expr14_0, expr12_0); - let expr16_0 = C::output(ctx, expr15_0); - return Some(expr16_0); - } - &Opcode::Band => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/riscv64/lower.isle line 199. - let expr0_0 = AluOPRRR::And; - let expr1_0 = C::put_in_regs(ctx, pattern7_0); - let expr2_0 = C::put_in_regs(ctx, pattern7_1); - let expr3_0 = - constructor_lower_b128_binary(ctx, &expr0_0, expr1_0, expr2_0); - let expr4_0 = C::output(ctx, expr3_0); - return Some(expr4_0); - } - &Opcode::Bor => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/riscv64/lower.isle line 218. - let expr0_0 = AluOPRRR::Or; - let expr1_0 = C::put_in_regs(ctx, pattern7_0); - let expr2_0 = C::put_in_regs(ctx, pattern7_1); - let expr3_0 = - constructor_lower_b128_binary(ctx, &expr0_0, expr1_0, expr2_0); - let expr4_0 = C::output(ctx, expr3_0); - return Some(expr4_0); - } - &Opcode::Bxor => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/riscv64/lower.isle line 236. - let expr0_0 = AluOPRRR::Xor; - let expr1_0 = C::put_in_regs(ctx, pattern7_0); - let expr2_0 = C::put_in_regs(ctx, pattern7_1); - let expr3_0 = - constructor_lower_b128_binary(ctx, &expr0_0, expr1_0, expr2_0); - let expr4_0 = C::output(ctx, expr3_0); - return Some(expr4_0); - } - &Opcode::Ishl => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/riscv64/lower.isle line 330. - let expr0_0 = C::put_in_regs(ctx, pattern7_0); - let expr1_0 = C::put_in_regs(ctx, pattern7_1); - let expr2_0 = constructor_lower_i128_ishl(ctx, expr0_0, expr1_0); - let expr3_0 = C::output(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::Ushr => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/riscv64/lower.isle line 356. - let expr0_0 = C::put_in_regs(ctx, pattern7_0); - let expr1_0 = C::put_in_regs(ctx, pattern7_1); - let expr2_0 = constructor_lower_i128_ushr(ctx, expr0_0, expr1_0); - let expr3_0 = C::output(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::Sshr => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/riscv64/lower.isle line 381. - let expr0_0 = C::put_in_regs(ctx, pattern7_0); - let expr1_0 = C::put_in_regs(ctx, pattern7_1); - let expr2_0: usize = 0i128 as usize; - let expr3_0 = C::value_regs_get(ctx, expr1_0, expr2_0); - let expr4_0 = C::value_reg(ctx, expr3_0); - let expr5_0 = constructor_lower_i128_sshr(ctx, expr0_0, expr4_0); - let expr6_0 = C::output(ctx, expr5_0); - return Some(expr6_0); - } - &Opcode::Iconcat => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/riscv64/lower.isle line 636. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0: Type = I64; - let expr2_0: Type = I64; - let expr3_0 = C::gen_move2(ctx, expr0_0, expr1_0, expr2_0); - let expr4_0 = C::put_in_reg(ctx, pattern7_1); - let expr5_0: Type = I64; - let expr6_0: Type = I64; - let expr7_0 = C::gen_move2(ctx, expr4_0, expr5_0, expr6_0); - let expr8_0 = C::value_regs(ctx, expr3_0, expr7_0); - let expr9_0 = C::output(ctx, expr8_0); - return Some(expr9_0); - } - _ => {} - } - } - _ => {} - } - } - if pattern2_0 == F32 { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - match &pattern4_0 { - &InstructionData::Unary { - opcode: ref pattern5_0, - arg: pattern5_1, - } => { - match pattern5_0 { - &Opcode::Bnot => { - // Rule at src/isa/riscv64/lower.isle line 251. - let expr0_0 = C::put_in_reg(ctx, pattern5_1); - let expr1_0: Type = F32; - let expr2_0 = constructor_lower_float_bnot(ctx, expr0_0, expr1_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::Sqrt => { - // Rule at src/isa/riscv64/lower.isle line 452. - let expr0_0 = FpuOPRR::FsqrtS; - let expr1_0: Type = F64; - let expr2_0 = C::put_in_reg(ctx, pattern5_1); - let expr3_0 = constructor_fpu_rr(ctx, &expr0_0, expr1_0, expr2_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - _ => {} - } - } - &InstructionData::Binary { - opcode: ref pattern5_0, - args: ref pattern5_1, - } => { - match pattern5_0 { - &Opcode::Band => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/riscv64/lower.isle line 202. - let expr0_0 = AluOPRRR::And; - let expr1_0 = C::put_in_reg(ctx, pattern7_0); - let expr2_0 = C::put_in_reg(ctx, pattern7_1); - let expr3_0: Type = F32; - let expr4_0 = constructor_lower_float_binary( - ctx, &expr0_0, expr1_0, expr2_0, expr3_0, - ); - let expr5_0 = constructor_output_reg(ctx, expr4_0); - return Some(expr5_0); - } - &Opcode::Bor => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/riscv64/lower.isle line 220. - let expr0_0 = AluOPRRR::Or; - let expr1_0 = C::put_in_reg(ctx, pattern7_0); - let expr2_0 = C::put_in_reg(ctx, pattern7_1); - let expr3_0: Type = F32; - let expr4_0 = constructor_lower_float_binary( - ctx, &expr0_0, expr1_0, expr2_0, expr3_0, - ); - let expr5_0 = constructor_output_reg(ctx, expr4_0); - return Some(expr5_0); - } - &Opcode::Bxor => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/riscv64/lower.isle line 238. - let expr0_0 = AluOPRRR::Xor; - let expr1_0 = C::put_in_reg(ctx, pattern7_0); - let expr2_0 = C::put_in_reg(ctx, pattern7_1); - let expr3_0: Type = F32; - let expr4_0 = constructor_lower_float_binary( - ctx, &expr0_0, expr1_0, expr2_0, expr3_0, - ); - let expr5_0 = constructor_output_reg(ctx, expr4_0); - return Some(expr5_0); - } - _ => {} - } - } - &InstructionData::Ternary { - opcode: ref pattern5_0, - args: ref pattern5_1, - } => { - if let &Opcode::Fma = pattern5_0 { - let (pattern7_0, pattern7_1, pattern7_2) = - C::unpack_value_array_3(ctx, pattern5_1); - // Rule at src/isa/riscv64/lower.isle line 445. - let expr0_0 = FpuOPRRRR::FmaddS; - let expr1_0: Type = F64; - let expr2_0 = C::put_in_reg(ctx, pattern7_0); - let expr3_0 = C::put_in_reg(ctx, pattern7_1); - let expr4_0 = C::put_in_reg(ctx, pattern7_2); - let expr5_0 = - constructor_fpu_rrrr(ctx, &expr0_0, expr1_0, expr2_0, expr3_0, expr4_0); - let expr6_0 = constructor_output_reg(ctx, expr5_0); - return Some(expr6_0); - } - } - _ => {} - } - } - if pattern2_0 == F64 { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - match &pattern4_0 { - &InstructionData::Unary { - opcode: ref pattern5_0, - arg: pattern5_1, - } => { - match pattern5_0 { - &Opcode::Bnot => { - // Rule at src/isa/riscv64/lower.isle line 255. - let expr0_0 = C::put_in_reg(ctx, pattern5_1); - let expr1_0: Type = F64; - let expr2_0 = constructor_lower_float_bnot(ctx, expr0_0, expr1_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::Sqrt => { - // Rule at src/isa/riscv64/lower.isle line 455. - let expr0_0 = FpuOPRR::FsqrtD; - let expr1_0: Type = F64; - let expr2_0 = C::put_in_reg(ctx, pattern5_1); - let expr3_0 = constructor_fpu_rr(ctx, &expr0_0, expr1_0, expr2_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - _ => {} - } - } - &InstructionData::Binary { - opcode: ref pattern5_0, - args: ref pattern5_1, - } => { - match pattern5_0 { - &Opcode::Band => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/riscv64/lower.isle line 204. - let expr0_0 = AluOPRRR::And; - let expr1_0 = C::put_in_reg(ctx, pattern7_0); - let expr2_0 = C::put_in_reg(ctx, pattern7_1); - let expr3_0: Type = F64; - let expr4_0 = constructor_lower_float_binary( - ctx, &expr0_0, expr1_0, expr2_0, expr3_0, - ); - let expr5_0 = constructor_output_reg(ctx, expr4_0); - return Some(expr5_0); - } - &Opcode::Bor => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/riscv64/lower.isle line 222. - let expr0_0 = AluOPRRR::Or; - let expr1_0 = C::put_in_reg(ctx, pattern7_0); - let expr2_0 = C::put_in_reg(ctx, pattern7_1); - let expr3_0: Type = F64; - let expr4_0 = constructor_lower_float_binary( - ctx, &expr0_0, expr1_0, expr2_0, expr3_0, - ); - let expr5_0 = constructor_output_reg(ctx, expr4_0); - return Some(expr5_0); - } - &Opcode::Bxor => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/riscv64/lower.isle line 240. - let expr0_0 = AluOPRRR::Xor; - let expr1_0 = C::put_in_reg(ctx, pattern7_0); - let expr2_0 = C::put_in_reg(ctx, pattern7_1); - let expr3_0: Type = F64; - let expr4_0 = constructor_lower_float_binary( - ctx, &expr0_0, expr1_0, expr2_0, expr3_0, - ); - let expr5_0 = constructor_output_reg(ctx, expr4_0); - return Some(expr5_0); - } - _ => {} - } - } - &InstructionData::Ternary { - opcode: ref pattern5_0, - args: ref pattern5_1, - } => { - if let &Opcode::Fma = pattern5_0 { - let (pattern7_0, pattern7_1, pattern7_2) = - C::unpack_value_array_3(ctx, pattern5_1); - // Rule at src/isa/riscv64/lower.isle line 447. - let expr0_0 = FpuOPRRRR::FmaddD; - let expr1_0: Type = F64; - let expr2_0 = C::put_in_reg(ctx, pattern7_0); - let expr3_0 = C::put_in_reg(ctx, pattern7_1); - let expr4_0 = C::put_in_reg(ctx, pattern7_2); - let expr5_0 = - constructor_fpu_rrrr(ctx, &expr0_0, expr1_0, expr2_0, expr3_0, expr4_0); - let expr6_0 = constructor_output_reg(ctx, expr5_0); - return Some(expr6_0); - } - } - _ => {} - } - } - if let Some(pattern3_0) = C::fits_in_64(ctx, pattern2_0) { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - match &pattern4_0 { - &InstructionData::Unary { - opcode: ref pattern5_0, - arg: pattern5_1, - } => { - match pattern5_0 { - &Opcode::Iabs => { - // Rule at src/isa/riscv64/lower.isle line 870. - let expr0_0 = C::put_in_reg(ctx, pattern5_1); - let expr1_0 = constructor_lower_iabs(ctx, pattern3_0, expr0_0); - let expr2_0 = constructor_output_reg(ctx, expr1_0); - return Some(expr2_0); - } - &Opcode::Cls => { - // Rule at src/isa/riscv64/lower.isle line 424. - let expr0_0 = C::put_in_reg(ctx, pattern5_1); - let expr1_0 = constructor_lower_cls(ctx, expr0_0, pattern3_0); - let expr2_0 = constructor_output_reg(ctx, expr1_0); - return Some(expr2_0); - } - &Opcode::Popcnt => { - // Rule at src/isa/riscv64/lower.isle line 302. - let expr0_0 = C::put_in_reg(ctx, pattern5_1); - let expr1_0 = constructor_lower_popcnt(ctx, expr0_0, pattern3_0); - let expr2_0 = constructor_output_reg(ctx, expr1_0); - return Some(expr2_0); - } - _ => {} - } - } - &InstructionData::Binary { - opcode: ref pattern5_0, - args: ref pattern5_1, - } => { - match pattern5_0 { - &Opcode::Umulhi => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/riscv64/lower.isle line 94. - let expr0_0: bool = false; - let expr1_0 = C::put_in_regs(ctx, pattern7_0); - let expr2_0 = - constructor_ext_int_if_need(ctx, expr0_0, expr1_0, pattern3_0); - let expr3_0 = constructor_convert_valueregs_reg(ctx, expr2_0); - let expr4_0: bool = false; - let expr5_0 = C::put_in_regs(ctx, pattern7_1); - let expr6_0 = - constructor_ext_int_if_need(ctx, expr4_0, expr5_0, pattern3_0); - let expr7_0 = constructor_convert_valueregs_reg(ctx, expr6_0); - let expr8_0 = - constructor_lower_umlhi(ctx, pattern3_0, expr3_0, expr7_0); - let expr9_0 = constructor_output_reg(ctx, expr8_0); - return Some(expr9_0); - } - &Opcode::Smulhi => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/riscv64/lower.isle line 90. - let expr0_0: bool = true; - let expr1_0 = C::put_in_regs(ctx, pattern7_0); - let expr2_0 = - constructor_ext_int_if_need(ctx, expr0_0, expr1_0, pattern3_0); - let expr3_0 = constructor_convert_valueregs_reg(ctx, expr2_0); - let expr4_0: bool = true; - let expr5_0 = C::put_in_regs(ctx, pattern7_1); - let expr6_0 = - constructor_ext_int_if_need(ctx, expr4_0, expr5_0, pattern3_0); - let expr7_0 = constructor_convert_valueregs_reg(ctx, expr6_0); - let expr8_0 = - constructor_lower_smlhi(ctx, pattern3_0, expr3_0, expr7_0); - let expr9_0 = constructor_output_reg(ctx, expr8_0); - return Some(expr9_0); - } - &Opcode::BandNot => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/riscv64/lower.isle line 293. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = C::put_in_reg(ctx, pattern7_1); - let expr2_0 = constructor_gen_andn(ctx, expr0_0, expr1_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::BorNot => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/riscv64/lower.isle line 413. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = C::put_in_reg(ctx, pattern7_1); - let expr2_0 = constructor_gen_orn(ctx, expr0_0, expr1_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::BxorNot => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/riscv64/lower.isle line 402. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = C::put_in_reg(ctx, pattern7_1); - let expr2_0 = constructor_gen_xor_not(ctx, expr0_0, expr1_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::Rotl => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/riscv64/lower.isle line 386. - let expr0_0: bool = false; - let expr1_0 = C::put_in_regs(ctx, pattern7_0); - let expr2_0 = - constructor_ext_int_if_need(ctx, expr0_0, expr1_0, pattern3_0); - let expr3_0 = constructor_convert_valueregs_reg(ctx, expr2_0); - let expr4_0 = C::put_in_regs(ctx, pattern7_1); - let expr5_0: usize = 0i128 as usize; - let expr6_0 = C::value_regs_get(ctx, expr4_0, expr5_0); - let expr7_0 = constructor_lower_rotl(ctx, pattern3_0, expr3_0, expr6_0); - let expr8_0 = constructor_output_reg(ctx, expr7_0); - return Some(expr8_0); - } - &Opcode::Rotr => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/riscv64/lower.isle line 393. - let expr0_0: bool = false; - let expr1_0 = C::put_in_regs(ctx, pattern7_0); - let expr2_0 = - constructor_ext_int_if_need(ctx, expr0_0, expr1_0, pattern3_0); - let expr3_0 = constructor_convert_valueregs_reg(ctx, expr2_0); - let expr4_0 = C::put_in_regs(ctx, pattern7_1); - let expr5_0: usize = 0i128 as usize; - let expr6_0 = C::value_regs_get(ctx, expr4_0, expr5_0); - let expr7_0 = constructor_lower_rotr(ctx, pattern3_0, expr3_0, expr6_0); - let expr8_0 = constructor_output_reg(ctx, expr7_0); - return Some(expr8_0); - } - _ => {} - } - } - &InstructionData::IntAddTrap { - opcode: ref pattern5_0, - args: ref pattern5_1, - code: ref pattern5_2, - } => { - if let &Opcode::UaddOverflowTrap = pattern5_0 { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/riscv64/lower.isle line 58. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = C::put_in_reg(ctx, pattern7_1); - let expr2_0 = - constructor_lower_uadd_overflow(ctx, expr0_0, expr1_0, pattern3_0); - let expr3_0: usize = 1i128 as usize; - let expr4_0 = C::value_regs_get(ctx, expr2_0, expr3_0); - let expr5_0 = constructor_gen_trapif(ctx, expr4_0, pattern5_2); - let expr6_0: usize = 0i128 as usize; - let expr7_0 = C::value_regs_get(ctx, expr2_0, expr6_0); - let expr8_0 = constructor_output_reg(ctx, expr7_0); - return Some(expr8_0); - } - } - _ => {} - } - } - if let Some(pattern3_0) = C::valid_atomic_transaction(ctx, pattern2_0) { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - match &pattern4_0 { - &InstructionData::LoadNoOffset { - opcode: ref pattern5_0, - arg: pattern5_1, - flags: pattern5_2, - } => { - if let &Opcode::AtomicLoad = pattern5_0 { - // Rule at src/isa/riscv64/lower.isle line 516. - let expr0_0 = C::put_in_reg(ctx, pattern5_1); - let expr1_0 = constructor_gen_atomic_load(ctx, expr0_0, pattern3_0); - let expr2_0 = constructor_output_reg(ctx, expr1_0); - return Some(expr2_0); - } - } - &InstructionData::AtomicRmw { - opcode: ref pattern5_0, - args: ref pattern5_1, - flags: pattern5_2, - op: ref pattern5_3, - } => { - if let &Opcode::AtomicRmw = pattern5_0 { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - match pattern5_3 { - &AtomicRmwOp::Nand => { - // Rule at src/isa/riscv64/lower.isle line 507. - let expr0_0 = AtomicRmwOp::Nand; - let expr1_0 = C::put_in_reg(ctx, pattern7_0); - let expr2_0 = C::put_in_reg(ctx, pattern7_1); - let expr3_0 = constructor_gen_atomic_rmw_loop( - ctx, &expr0_0, pattern3_0, expr1_0, expr2_0, - ); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - &AtomicRmwOp::Sub => { - // Rule at src/isa/riscv64/lower.isle line 489. - let expr0_0 = C::temp_writable_reg(ctx, pattern3_0); - let expr1_0 = AluOPRRR::Sub; - let expr2_0 = C::zero_reg(ctx); - let expr3_0 = C::put_in_reg(ctx, pattern7_1); - let expr4_0 = constructor_alu_rrr(ctx, &expr1_0, expr2_0, expr3_0); - let expr5_0 = AtomicRmwOp::Add; - let expr6_0 = - constructor_get_atomic_rmw_op(ctx, pattern3_0, &expr5_0); - let expr7_0 = C::put_in_reg(ctx, pattern7_0); - let expr8_0 = C::atomic_amo(ctx); - let expr9_0 = constructor_gen_atomic( - ctx, &expr6_0, expr7_0, expr4_0, expr8_0, - ); - let expr10_0 = constructor_output_reg(ctx, expr9_0); - return Some(expr10_0); - } - _ => {} - } - } - } - &InstructionData::AtomicCas { - opcode: ref pattern5_0, - args: ref pattern5_1, - flags: pattern5_2, - } => { - if let &Opcode::AtomicCas = pattern5_0 { - let (pattern7_0, pattern7_1, pattern7_2) = - C::unpack_value_array_3(ctx, pattern5_1); - // Rule at src/isa/riscv64/lower.isle line 542. - let expr0_0 = C::temp_writable_reg(ctx, pattern3_0); - let expr1_0 = C::temp_writable_reg(ctx, pattern3_0); - let expr2_0 = C::put_in_reg(ctx, pattern7_0); - let expr3_0 = constructor_gen_atomic_offset(ctx, expr2_0, pattern3_0); - let expr4_0: bool = false; - let expr5_0 = C::put_in_regs(ctx, pattern7_1); - let expr6_0 = - constructor_ext_int_if_need(ctx, expr4_0, expr5_0, pattern3_0); - let expr7_0 = constructor_convert_valueregs_reg(ctx, expr6_0); - let expr8_0 = C::put_in_reg(ctx, pattern7_0); - let expr9_0 = constructor_gen_atomic_p(ctx, expr8_0, pattern3_0); - let expr10_0 = C::put_in_reg(ctx, pattern7_2); - let expr11_0 = MInst::AtomicCas { - offset: expr3_0, - t0: expr0_0, - dst: expr1_0, - e: expr7_0, - addr: expr9_0, - v: expr10_0, - ty: pattern3_0, - }; - let expr12_0 = C::emit(ctx, &expr11_0); - let expr13_0 = C::writable_reg_to_reg(ctx, expr1_0); - let expr14_0 = constructor_output_reg(ctx, expr13_0); - return Some(expr14_0); - } - } - _ => {} - } - } - let pattern3_0 = C::inst_data(ctx, pattern0_0); - match &pattern3_0 { - &InstructionData::NullAry { - opcode: ref pattern4_0, - } => { - if let &Opcode::Null = pattern4_0 { - // Rule at src/isa/riscv64/lower.isle line 24. - let expr0_0: u64 = 0i128 as u64; - let expr1_0 = C::imm(ctx, pattern2_0, expr0_0); - let expr2_0 = constructor_output_reg(ctx, expr1_0); - return Some(expr2_0); - } - } - &InstructionData::Unary { - opcode: ref pattern4_0, - arg: pattern4_1, - } => { - match pattern4_0 { - &Opcode::Ineg => { - // Rule at src/isa/riscv64/lower.isle line 79. - let expr0_0 = C::put_in_regs(ctx, pattern4_1); - let expr1_0 = constructor_neg(ctx, pattern2_0, expr0_0); - let expr2_0 = C::output(ctx, expr1_0); - return Some(expr2_0); - } - &Opcode::Bitrev => { - // Rule at src/isa/riscv64/lower.isle line 260. - let expr0_0 = C::put_in_reg(ctx, pattern4_1); - let expr1_0 = constructor_lower_bit_reverse(ctx, expr0_0, pattern2_0); - let expr2_0 = constructor_output_reg(ctx, expr1_0); - return Some(expr2_0); - } - &Opcode::Clz => { - // Rule at src/isa/riscv64/lower.isle line 278. - let expr0_0 = C::put_in_reg(ctx, pattern4_1); - let expr1_0 = constructor_lower_clz(ctx, pattern2_0, expr0_0); - let expr2_0 = constructor_output_reg(ctx, expr1_0); - return Some(expr2_0); - } - &Opcode::Ctz => { - // Rule at src/isa/riscv64/lower.isle line 271. - let expr0_0 = C::put_in_reg(ctx, pattern4_1); - let expr1_0 = constructor_lower_ctz(ctx, pattern2_0, expr0_0); - let expr2_0 = constructor_output_reg(ctx, expr1_0); - return Some(expr2_0); - } - &Opcode::Fneg => { - // Rule at src/isa/riscv64/lower.isle line 437. - let expr0_0 = constructor_f_copy_neg_sign_op(ctx, pattern2_0); - let expr1_0 = C::put_in_reg(ctx, pattern4_1); - let expr2_0 = C::put_in_reg(ctx, pattern4_1); - let expr3_0 = - constructor_fpu_rrr(ctx, &expr0_0, pattern2_0, expr1_0, expr2_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - &Opcode::Fabs => { - // Rule at src/isa/riscv64/lower.isle line 432. - let expr0_0 = C::put_in_reg(ctx, pattern4_1); - let expr1_0 = constructor_gen_fabs(ctx, expr0_0, pattern2_0); - let expr2_0 = constructor_output_reg(ctx, expr1_0); - return Some(expr2_0); - } - &Opcode::Ceil => { - // Rule at src/isa/riscv64/lower.isle line 815. - let expr0_0 = FloatRoundOP::Ceil; - let expr1_0 = C::put_in_reg(ctx, pattern4_1); - let expr2_0 = - constructor_gen_float_round(ctx, &expr0_0, expr1_0, pattern2_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::Floor => { - // Rule at src/isa/riscv64/lower.isle line 821. - let expr0_0 = FloatRoundOP::Floor; - let expr1_0 = C::put_in_reg(ctx, pattern4_1); - let expr2_0 = - constructor_gen_float_round(ctx, &expr0_0, expr1_0, pattern2_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::Trunc => { - // Rule at src/isa/riscv64/lower.isle line 825. - let expr0_0 = FloatRoundOP::Trunc; - let expr1_0 = C::put_in_reg(ctx, pattern4_1); - let expr2_0 = - constructor_gen_float_round(ctx, &expr0_0, expr1_0, pattern2_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::Nearest => { - // Rule at src/isa/riscv64/lower.isle line 830. - let expr0_0 = FloatRoundOP::Nearest; - let expr1_0 = C::put_in_reg(ctx, pattern4_1); - let expr2_0 = - constructor_gen_float_round(ctx, &expr0_0, expr1_0, pattern2_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::Bmask => { - let pattern6_0 = C::value_type(ctx, pattern4_1); - // Rule at src/isa/riscv64/lower.isle line 849. - let expr0_0 = C::put_in_regs(ctx, pattern4_1); - let expr1_0 = constructor_lower_bmask(ctx, pattern2_0, pattern6_0, expr0_0); - let expr2_0 = C::output(ctx, expr1_0); - return Some(expr2_0); - } - &Opcode::Ireduce => { - // Rule at src/isa/riscv64/lower.isle line 551. - let expr0_0 = C::put_in_regs(ctx, pattern4_1); - let expr1_0: usize = 0i128 as usize; - let expr2_0 = C::value_regs_get(ctx, expr0_0, expr1_0); - let expr3_0 = C::gen_move2(ctx, expr2_0, pattern2_0, pattern2_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - &Opcode::Uextend => { - let pattern6_0 = C::value_type(ctx, pattern4_1); - // Rule at src/isa/riscv64/lower.isle line 284. - let expr0_0 = C::put_in_reg(ctx, pattern4_1); - let expr1_0: bool = false; - let expr2_0 = C::ty_bits(ctx, pattern6_0); - let expr3_0 = C::ty_bits(ctx, pattern2_0); - let expr4_0 = - constructor_lower_extend(ctx, expr0_0, expr1_0, expr2_0, expr3_0); - let expr5_0 = C::output(ctx, expr4_0); - return Some(expr5_0); - } - &Opcode::Sextend => { - let pattern6_0 = C::value_type(ctx, pattern4_1); - // Rule at src/isa/riscv64/lower.isle line 288. - let expr0_0 = C::put_in_reg(ctx, pattern4_1); - let expr1_0: bool = true; - let expr2_0 = C::ty_bits(ctx, pattern6_0); - let expr3_0 = C::ty_bits(ctx, pattern2_0); - let expr4_0 = - constructor_lower_extend(ctx, expr0_0, expr1_0, expr2_0, expr3_0); - let expr5_0 = C::output(ctx, expr4_0); - return Some(expr5_0); - } - &Opcode::Fpromote => { - // Rule at src/isa/riscv64/lower.isle line 556. - let expr0_0 = FpuOPRR::FcvtDS; - let expr1_0 = C::put_in_reg(ctx, pattern4_1); - let expr2_0 = constructor_fpu_rr(ctx, &expr0_0, pattern2_0, expr1_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::Fdemote => { - // Rule at src/isa/riscv64/lower.isle line 560. - let expr0_0 = FpuOPRR::FcvtSD; - let expr1_0 = C::put_in_reg(ctx, pattern4_1); - let expr2_0 = constructor_fpu_rr(ctx, &expr0_0, pattern2_0, expr1_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::FcvtToUint => { - let pattern6_0 = C::value_type(ctx, pattern4_1); - // Rule at src/isa/riscv64/lower.isle line 775. - let expr0_0: bool = false; - let expr1_0 = C::put_in_reg(ctx, pattern4_1); - let expr2_0: bool = false; - let expr3_0 = constructor_gen_fcvt_int( - ctx, expr0_0, expr1_0, expr2_0, pattern6_0, pattern2_0, - ); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - &Opcode::FcvtToSint => { - let pattern6_0 = C::value_type(ctx, pattern4_1); - // Rule at src/isa/riscv64/lower.isle line 780. - let expr0_0: bool = false; - let expr1_0 = C::put_in_reg(ctx, pattern4_1); - let expr2_0: bool = true; - let expr3_0 = constructor_gen_fcvt_int( - ctx, expr0_0, expr1_0, expr2_0, pattern6_0, pattern2_0, - ); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - &Opcode::FcvtToUintSat => { - let pattern6_0 = C::value_type(ctx, pattern4_1); - // Rule at src/isa/riscv64/lower.isle line 790. - let expr0_0: bool = true; - let expr1_0 = C::put_in_reg(ctx, pattern4_1); - let expr2_0: bool = false; - let expr3_0 = constructor_gen_fcvt_int( - ctx, expr0_0, expr1_0, expr2_0, pattern6_0, pattern2_0, - ); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - &Opcode::FcvtToSintSat => { - let pattern6_0 = C::value_type(ctx, pattern4_1); - // Rule at src/isa/riscv64/lower.isle line 785. - let expr0_0: bool = true; - let expr1_0 = C::put_in_reg(ctx, pattern4_1); - let expr2_0: bool = true; - let expr3_0 = constructor_gen_fcvt_int( - ctx, expr0_0, expr1_0, expr2_0, pattern6_0, pattern2_0, - ); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - &Opcode::FcvtFromUint => { - let pattern6_0 = C::value_type(ctx, pattern4_1); - // Rule at src/isa/riscv64/lower.isle line 800. - let expr0_0: bool = false; - let expr1_0 = - C::int_convert_2_float_op(ctx, pattern6_0, expr0_0, pattern2_0); - let expr2_0 = C::put_in_reg(ctx, pattern4_1); - let expr3_0 = constructor_fpu_rr(ctx, &expr1_0, pattern2_0, expr2_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - &Opcode::FcvtFromSint => { - let pattern6_0 = C::value_type(ctx, pattern4_1); - // Rule at src/isa/riscv64/lower.isle line 795. - let expr0_0: bool = true; - let expr1_0 = - C::int_convert_2_float_op(ctx, pattern6_0, expr0_0, pattern2_0); - let expr2_0 = C::put_in_reg(ctx, pattern4_1); - let expr3_0 = constructor_fpu_rr(ctx, &expr1_0, pattern2_0, expr2_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - _ => {} - } - } - &InstructionData::LoadNoOffset { - opcode: ref pattern4_0, - arg: pattern4_1, - flags: pattern4_2, - } => { - if let &Opcode::Bitcast = pattern4_0 { - let pattern6_0 = C::value_type(ctx, pattern4_1); - // Rule at src/isa/riscv64/lower.isle line 810. - let expr0_0 = C::put_in_regs(ctx, pattern4_1); - let expr1_0 = C::gen_moves(ctx, expr0_0, pattern6_0, pattern2_0); - let expr2_0 = C::output(ctx, expr1_0); - return Some(expr2_0); - } - } - &InstructionData::Load { - opcode: ref pattern4_0, - arg: pattern4_1, - flags: pattern4_2, - offset: pattern4_3, - } => { - if let &Opcode::Load = pattern4_0 { - // Rule at src/isa/riscv64/lower.isle line 710. - let expr0_0 = C::put_in_reg(ctx, pattern4_1); - let expr1_0 = C::load_op(ctx, pattern2_0); - let expr2_0 = constructor_gen_load( - ctx, expr0_0, pattern4_3, &expr1_0, pattern4_2, pattern2_0, - ); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - } - &InstructionData::UnaryImm { - opcode: ref pattern4_0, - imm: pattern4_1, - } => { - if let &Opcode::Iconst = pattern4_0 { - let pattern6_0 = C::u64_from_imm64(ctx, pattern4_1); - // Rule at src/isa/riscv64/lower.isle line 9. - let expr0_0 = C::imm(ctx, pattern2_0, pattern6_0); - let expr1_0 = constructor_output_reg(ctx, expr0_0); - return Some(expr1_0); - } - } - &InstructionData::Binary { - opcode: ref pattern4_0, - args: ref pattern4_1, - } => { - match pattern4_0 { - &Opcode::Smin => { - let (pattern6_0, pattern6_1) = C::unpack_value_array_2(ctx, pattern4_1); - // Rule at src/isa/riscv64/lower.isle line 649. - let expr0_0 = IntSelectOP::Smin; - let expr1_0: bool = true; - let expr2_0 = C::put_in_regs(ctx, pattern6_0); - let expr3_0 = - constructor_ext_int_if_need(ctx, expr1_0, expr2_0, pattern2_0); - let expr4_0: bool = true; - let expr5_0 = C::put_in_regs(ctx, pattern6_1); - let expr6_0 = - constructor_ext_int_if_need(ctx, expr4_0, expr5_0, pattern2_0); - let expr7_0 = - constructor_gen_int_select(ctx, pattern2_0, &expr0_0, expr3_0, expr6_0); - let expr8_0 = C::output(ctx, expr7_0); - return Some(expr8_0); - } - &Opcode::Umin => { - let (pattern6_0, pattern6_1) = C::unpack_value_array_2(ctx, pattern4_1); - // Rule at src/isa/riscv64/lower.isle line 658. - let expr0_0 = IntSelectOP::Umin; - let expr1_0: bool = false; - let expr2_0 = C::put_in_regs(ctx, pattern6_0); - let expr3_0 = - constructor_ext_int_if_need(ctx, expr1_0, expr2_0, pattern2_0); - let expr4_0: bool = false; - let expr5_0 = C::put_in_regs(ctx, pattern6_1); - let expr6_0 = - constructor_ext_int_if_need(ctx, expr4_0, expr5_0, pattern2_0); - let expr7_0 = - constructor_gen_int_select(ctx, pattern2_0, &expr0_0, expr3_0, expr6_0); - let expr8_0 = C::output(ctx, expr7_0); - return Some(expr8_0); - } - &Opcode::Smax => { - let (pattern6_0, pattern6_1) = C::unpack_value_array_2(ctx, pattern4_1); - // Rule at src/isa/riscv64/lower.isle line 644. - let expr0_0 = IntSelectOP::Smax; - let expr1_0: bool = true; - let expr2_0 = C::put_in_regs(ctx, pattern6_0); - let expr3_0 = - constructor_ext_int_if_need(ctx, expr1_0, expr2_0, pattern2_0); - let expr4_0: bool = true; - let expr5_0 = C::put_in_regs(ctx, pattern6_1); - let expr6_0 = - constructor_ext_int_if_need(ctx, expr4_0, expr5_0, pattern2_0); - let expr7_0 = - constructor_gen_int_select(ctx, pattern2_0, &expr0_0, expr3_0, expr6_0); - let expr8_0 = C::output(ctx, expr7_0); - return Some(expr8_0); - } - &Opcode::Umax => { - let (pattern6_0, pattern6_1) = C::unpack_value_array_2(ctx, pattern4_1); - // Rule at src/isa/riscv64/lower.isle line 653. - let expr0_0 = IntSelectOP::Umax; - let expr1_0: bool = false; - let expr2_0 = C::put_in_regs(ctx, pattern6_0); - let expr3_0 = - constructor_ext_int_if_need(ctx, expr1_0, expr2_0, pattern2_0); - let expr4_0: bool = false; - let expr5_0 = C::put_in_regs(ctx, pattern6_1); - let expr6_0 = - constructor_ext_int_if_need(ctx, expr4_0, expr5_0, pattern2_0); - let expr7_0 = - constructor_gen_int_select(ctx, pattern2_0, &expr0_0, expr3_0, expr6_0); - let expr8_0 = C::output(ctx, expr7_0); - return Some(expr8_0); - } - &Opcode::Fadd => { - let (pattern6_0, pattern6_1) = C::unpack_value_array_2(ctx, pattern4_1); - // Rule at src/isa/riscv64/lower.isle line 566. - let expr0_0 = Opcode::Fadd; - let expr1_0 = constructor_f_arithmatic_op(ctx, pattern2_0, &expr0_0); - let expr2_0 = C::put_in_reg(ctx, pattern6_0); - let expr3_0 = C::put_in_reg(ctx, pattern6_1); - let expr4_0 = - constructor_fpu_rrr(ctx, &expr1_0, pattern2_0, expr2_0, expr3_0); - let expr5_0 = constructor_output_reg(ctx, expr4_0); - return Some(expr5_0); - } - &Opcode::Fsub => { - let (pattern6_0, pattern6_1) = C::unpack_value_array_2(ctx, pattern4_1); - // Rule at src/isa/riscv64/lower.isle line 569. - let expr0_0 = Opcode::Fsub; - let expr1_0 = constructor_f_arithmatic_op(ctx, pattern2_0, &expr0_0); - let expr2_0 = C::put_in_reg(ctx, pattern6_0); - let expr3_0 = C::put_in_reg(ctx, pattern6_1); - let expr4_0 = - constructor_fpu_rrr(ctx, &expr1_0, pattern2_0, expr2_0, expr3_0); - let expr5_0 = constructor_output_reg(ctx, expr4_0); - return Some(expr5_0); - } - &Opcode::Fmul => { - let (pattern6_0, pattern6_1) = C::unpack_value_array_2(ctx, pattern4_1); - // Rule at src/isa/riscv64/lower.isle line 572. - let expr0_0 = Opcode::Fmul; - let expr1_0 = constructor_f_arithmatic_op(ctx, pattern2_0, &expr0_0); - let expr2_0 = C::put_in_reg(ctx, pattern6_0); - let expr3_0 = C::put_in_reg(ctx, pattern6_1); - let expr4_0 = - constructor_fpu_rrr(ctx, &expr1_0, pattern2_0, expr2_0, expr3_0); - let expr5_0 = constructor_output_reg(ctx, expr4_0); - return Some(expr5_0); - } - &Opcode::Fdiv => { - let (pattern6_0, pattern6_1) = C::unpack_value_array_2(ctx, pattern4_1); - // Rule at src/isa/riscv64/lower.isle line 575. - let expr0_0 = Opcode::Fdiv; - let expr1_0 = constructor_f_arithmatic_op(ctx, pattern2_0, &expr0_0); - let expr2_0 = C::put_in_reg(ctx, pattern6_0); - let expr3_0 = C::put_in_reg(ctx, pattern6_1); - let expr4_0 = - constructor_fpu_rrr(ctx, &expr1_0, pattern2_0, expr2_0, expr3_0); - let expr5_0 = constructor_output_reg(ctx, expr4_0); - return Some(expr5_0); - } - &Opcode::Fcopysign => { - let (pattern6_0, pattern6_1) = C::unpack_value_array_2(ctx, pattern4_1); - // Rule at src/isa/riscv64/lower.isle line 441. - let expr0_0 = constructor_f_copysign_op(ctx, pattern2_0); - let expr1_0 = C::put_in_reg(ctx, pattern6_0); - let expr2_0 = C::put_in_reg(ctx, pattern6_1); - let expr3_0 = - constructor_fpu_rrr(ctx, &expr0_0, pattern2_0, expr1_0, expr2_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - &Opcode::Fmin => { - let (pattern6_0, pattern6_1) = C::unpack_value_array_2(ctx, pattern4_1); - // Rule at src/isa/riscv64/lower.isle line 579. - let expr0_0 = FloatSelectOP::Min; - let expr1_0 = C::put_in_reg(ctx, pattern6_0); - let expr2_0 = C::put_in_reg(ctx, pattern6_1); - let expr3_0 = constructor_gen_float_select( - ctx, &expr0_0, expr1_0, expr2_0, pattern2_0, - ); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - &Opcode::FminPseudo => { - let (pattern6_0, pattern6_1) = C::unpack_value_array_2(ctx, pattern4_1); - // Rule at src/isa/riscv64/lower.isle line 583. - let expr0_0 = FloatSelectOP::Min; - let expr1_0 = C::put_in_reg(ctx, pattern6_0); - let expr2_0 = C::put_in_reg(ctx, pattern6_1); - let expr3_0 = constructor_gen_float_select_pseudo( - ctx, &expr0_0, expr1_0, expr2_0, pattern2_0, - ); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - &Opcode::Fmax => { - let (pattern6_0, pattern6_1) = C::unpack_value_array_2(ctx, pattern4_1); - // Rule at src/isa/riscv64/lower.isle line 587. - let expr0_0 = FloatSelectOP::Max; - let expr1_0 = C::put_in_reg(ctx, pattern6_0); - let expr2_0 = C::put_in_reg(ctx, pattern6_1); - let expr3_0 = constructor_gen_float_select( - ctx, &expr0_0, expr1_0, expr2_0, pattern2_0, - ); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - &Opcode::FmaxPseudo => { - let (pattern6_0, pattern6_1) = C::unpack_value_array_2(ctx, pattern4_1); - // Rule at src/isa/riscv64/lower.isle line 591. - let expr0_0 = FloatSelectOP::Max; - let expr1_0 = C::put_in_reg(ctx, pattern6_0); - let expr2_0 = C::put_in_reg(ctx, pattern6_1); - let expr3_0 = constructor_gen_float_select_pseudo( - ctx, &expr0_0, expr1_0, expr2_0, pattern2_0, - ); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - _ => {} - } - } - &InstructionData::Ternary { - opcode: ref pattern4_0, - args: ref pattern4_1, - } => { - match pattern4_0 { - &Opcode::Select => { - let (pattern6_0, pattern6_1, pattern6_2) = - C::unpack_value_array_3(ctx, pattern4_1); - let pattern7_0 = C::value_type(ctx, pattern6_0); - // Rule at src/isa/riscv64/lower.isle line 611. - let expr0_0 = C::put_in_regs(ctx, pattern6_0); - let expr1_0 = constructor_normalize_cmp_value(ctx, pattern7_0, expr0_0); - let expr2_0 = constructor_truthy_to_reg(ctx, pattern7_0, expr1_0); - let expr3_0 = C::put_in_regs(ctx, pattern6_1); - let expr4_0 = C::put_in_regs(ctx, pattern6_2); - let expr5_0 = - constructor_gen_select(ctx, pattern2_0, expr2_0, expr3_0, expr4_0); - let expr6_0 = C::output(ctx, expr5_0); - return Some(expr6_0); - } - &Opcode::SelectSpectreGuard => { - let (pattern6_0, pattern6_1, pattern6_2) = - C::unpack_value_array_3(ctx, pattern4_1); - if let Some(pattern7_0) = C::def_inst(ctx, pattern6_0) { - let pattern8_0 = C::inst_data(ctx, pattern7_0); - if let &InstructionData::IntCompare { - opcode: ref pattern9_0, - args: ref pattern9_1, - cond: ref pattern9_2, - } = &pattern8_0 - { - if let &Opcode::Icmp = pattern9_0 { - let (pattern11_0, pattern11_1) = - C::unpack_value_array_2(ctx, pattern9_1); - let pattern12_0 = C::value_type(ctx, pattern11_0); - // Rule at src/isa/riscv64/lower.isle line 836. - let expr0_0 = C::alloc_vec_writable(ctx, pattern2_0); - let expr1_0 = C::put_in_regs(ctx, pattern11_0); - let expr2_0 = C::put_in_regs(ctx, pattern11_1); - let expr3_0 = constructor_lower_icmp( - ctx, - pattern9_2, - expr1_0, - expr2_0, - pattern12_0, - ); - let expr4_0: bool = true; - let expr5_0 = C::vec_writable_clone(ctx, &expr0_0); - let expr6_0 = C::put_in_regs(ctx, pattern6_1); - let expr7_0 = C::put_in_regs(ctx, pattern6_2); - let expr8_0 = MInst::SelectIf { - if_spectre_guard: expr4_0, - rd: expr5_0, - test: expr3_0, - x: expr6_0, - y: expr7_0, - }; - let expr9_0 = C::emit(ctx, &expr8_0); - let expr10_0 = C::vec_writable_to_regs(ctx, &expr0_0); - let expr11_0 = C::output(ctx, expr10_0); - return Some(expr11_0); - } - } - } - } - &Opcode::Bitselect => { - let (pattern6_0, pattern6_1, pattern6_2) = - C::unpack_value_array_3(ctx, pattern4_1); - // Rule at src/isa/riscv64/lower.isle line 623. - let expr0_0 = C::put_in_reg(ctx, pattern6_0); - let expr1_0 = C::put_in_reg(ctx, pattern6_1); - let expr2_0 = C::put_in_reg(ctx, pattern6_2); - let expr3_0 = - constructor_gen_bitselect(ctx, pattern2_0, expr0_0, expr1_0, expr2_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - _ => {} - } - } - _ => {} - } - } - let pattern1_0 = C::inst_data(ctx, pattern0_0); - match &pattern1_0 { - &InstructionData::NullAry { - opcode: ref pattern2_0, - } => { - match pattern2_0 { - &Opcode::Debugtrap => { - // Rule at src/isa/riscv64/lower.isle line 663. - let expr0_0 = MInst::EBreak; - let expr1_0 = SideEffectNoResult::Inst { inst: expr0_0 }; - let expr2_0 = constructor_side_effect(ctx, &expr1_0); - return Some(expr2_0); - } - &Opcode::GetFramePointer => { - // Rule at src/isa/riscv64/lower.isle line 859. - let expr0_0 = C::fp_reg(ctx); - let expr1_0 = constructor_gen_mov_from_preg(ctx, expr0_0); - let expr2_0 = constructor_output_reg(ctx, expr1_0); - return Some(expr2_0); - } - &Opcode::GetStackPointer => { - // Rule at src/isa/riscv64/lower.isle line 862. - let expr0_0 = C::sp_reg(ctx); - let expr1_0 = constructor_gen_mov_from_preg(ctx, expr0_0); - let expr2_0 = constructor_output_reg(ctx, expr1_0); - return Some(expr2_0); - } - &Opcode::GetReturnAddress => { - // Rule at src/isa/riscv64/lower.isle line 865. - let expr0_0 = C::load_ra(ctx); - let expr1_0 = constructor_output_reg(ctx, expr0_0); - return Some(expr1_0); - } - &Opcode::Fence => { - // Rule at src/isa/riscv64/lower.isle line 668. - let expr0_0: u8 = 15i128 as u8; - let expr1_0: u8 = 15i128 as u8; - let expr2_0 = MInst::Fence { - pred: expr0_0, - succ: expr1_0, - }; - let expr3_0 = SideEffectNoResult::Inst { inst: expr2_0 }; - let expr4_0 = constructor_side_effect(ctx, &expr3_0); - return Some(expr4_0); - } - _ => {} - } - } - &InstructionData::Unary { - opcode: ref pattern2_0, - arg: pattern2_1, - } => { - match pattern2_0 { - &Opcode::IsNull => { - // Rule at src/isa/riscv64/lower.isle line 601. - let expr0_0 = ReferenceCheckOP::IsNull; - let expr1_0 = C::put_in_reg(ctx, pattern2_1); - let expr2_0 = constructor_gen_reference_check(ctx, &expr0_0, expr1_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::IsInvalid => { - // Rule at src/isa/riscv64/lower.isle line 606. - let expr0_0 = ReferenceCheckOP::IsInvalid; - let expr1_0 = C::put_in_reg(ctx, pattern2_1); - let expr2_0 = constructor_gen_reference_check(ctx, &expr0_0, expr1_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::Isplit => { - // Rule at src/isa/riscv64/lower.isle line 628. - let expr0_0 = C::put_in_regs(ctx, pattern2_1); - let expr1_0: usize = 0i128 as usize; - let expr2_0 = C::value_regs_get(ctx, expr0_0, expr1_0); - let expr3_0: Type = I64; - let expr4_0: Type = I64; - let expr5_0 = C::gen_move2(ctx, expr2_0, expr3_0, expr4_0); - let expr6_0 = C::put_in_regs(ctx, pattern2_1); - let expr7_0: usize = 1i128 as usize; - let expr8_0 = C::value_regs_get(ctx, expr6_0, expr7_0); - let expr9_0: Type = I64; - let expr10_0: Type = I64; - let expr11_0 = C::gen_move2(ctx, expr8_0, expr9_0, expr10_0); - let expr12_0 = C::value_reg(ctx, expr5_0); - let expr13_0 = C::value_reg(ctx, expr11_0); - let expr14_0 = C::output_pair(ctx, expr12_0, expr13_0); - return Some(expr14_0); - } - _ => {} - } - } - &InstructionData::Load { - opcode: ref pattern2_0, - arg: pattern2_1, - flags: pattern2_2, - offset: pattern2_3, - } => { - match pattern2_0 { - &Opcode::Uload8 => { - // Rule at src/isa/riscv64/lower.isle line 683. - let expr0_0 = C::put_in_reg(ctx, pattern2_1); - let expr1_0: bool = false; - let expr2_0: u8 = 8i128 as u8; - let expr3_0 = constructor_int_load_op(ctx, expr1_0, expr2_0); - let expr4_0: Type = I64; - let expr5_0 = constructor_gen_load( - ctx, expr0_0, pattern2_3, &expr3_0, pattern2_2, expr4_0, - ); - let expr6_0 = constructor_output_reg(ctx, expr5_0); - return Some(expr6_0); - } - &Opcode::Sload8 => { - // Rule at src/isa/riscv64/lower.isle line 687. - let expr0_0 = C::put_in_reg(ctx, pattern2_1); - let expr1_0: bool = true; - let expr2_0: u8 = 8i128 as u8; - let expr3_0 = constructor_int_load_op(ctx, expr1_0, expr2_0); - let expr4_0: Type = I64; - let expr5_0 = constructor_gen_load( - ctx, expr0_0, pattern2_3, &expr3_0, pattern2_2, expr4_0, - ); - let expr6_0 = constructor_output_reg(ctx, expr5_0); - return Some(expr6_0); - } - &Opcode::Uload16 => { - // Rule at src/isa/riscv64/lower.isle line 691. - let expr0_0 = C::put_in_reg(ctx, pattern2_1); - let expr1_0: bool = false; - let expr2_0: u8 = 16i128 as u8; - let expr3_0 = constructor_int_load_op(ctx, expr1_0, expr2_0); - let expr4_0: Type = I64; - let expr5_0 = constructor_gen_load( - ctx, expr0_0, pattern2_3, &expr3_0, pattern2_2, expr4_0, - ); - let expr6_0 = constructor_output_reg(ctx, expr5_0); - return Some(expr6_0); - } - &Opcode::Sload16 => { - // Rule at src/isa/riscv64/lower.isle line 696. - let expr0_0 = C::put_in_reg(ctx, pattern2_1); - let expr1_0: bool = true; - let expr2_0: u8 = 16i128 as u8; - let expr3_0 = constructor_int_load_op(ctx, expr1_0, expr2_0); - let expr4_0: Type = I64; - let expr5_0 = constructor_gen_load( - ctx, expr0_0, pattern2_3, &expr3_0, pattern2_2, expr4_0, - ); - let expr6_0 = constructor_output_reg(ctx, expr5_0); - return Some(expr6_0); - } - &Opcode::Uload32 => { - // Rule at src/isa/riscv64/lower.isle line 701. - let expr0_0 = C::put_in_reg(ctx, pattern2_1); - let expr1_0: bool = false; - let expr2_0: u8 = 32i128 as u8; - let expr3_0 = constructor_int_load_op(ctx, expr1_0, expr2_0); - let expr4_0: Type = I64; - let expr5_0 = constructor_gen_load( - ctx, expr0_0, pattern2_3, &expr3_0, pattern2_2, expr4_0, - ); - let expr6_0 = constructor_output_reg(ctx, expr5_0); - return Some(expr6_0); - } - &Opcode::Sload32 => { - // Rule at src/isa/riscv64/lower.isle line 706. - let expr0_0 = C::put_in_reg(ctx, pattern2_1); - let expr1_0: bool = true; - let expr2_0: u8 = 32i128 as u8; - let expr3_0 = constructor_int_load_op(ctx, expr1_0, expr2_0); - let expr4_0: Type = I64; - let expr5_0 = constructor_gen_load( - ctx, expr0_0, pattern2_3, &expr3_0, pattern2_2, expr4_0, - ); - let expr6_0 = constructor_output_reg(ctx, expr5_0); - return Some(expr6_0); - } - _ => {} - } - } - &InstructionData::MultiAry { - opcode: ref pattern2_0, - args: pattern2_1, - } => { - if let &Opcode::Return = pattern2_0 { - let pattern4_0 = C::value_list_slice(ctx, pattern2_1); - // Rule at src/isa/riscv64/lower.isle line 853. - let expr0_0: usize = 0i128 as usize; - let expr1_0 = C::value_slice_len(ctx, pattern4_0); - let expr2_0 = C::range(ctx, expr0_0, expr1_0); - let expr3_0 = constructor_lower_return(ctx, expr2_0, pattern4_0); - return Some(expr3_0); - } - } - &InstructionData::Call { - opcode: ref pattern2_0, - args: pattern2_1, - func_ref: pattern2_2, - } => { - if let &Opcode::Call = pattern2_0 { - let pattern4_0 = C::value_list_slice(ctx, pattern2_1); - let (pattern5_0, pattern5_1, pattern5_2) = C::func_ref_data(ctx, pattern2_2); - // Rule at src/isa/riscv64/lower.isle line 875. - let expr0_0 = C::gen_call(ctx, pattern5_0, pattern5_1, pattern5_2, pattern4_0); - return Some(expr0_0); - } - } - &InstructionData::CallIndirect { - opcode: ref pattern2_0, - args: pattern2_1, - sig_ref: pattern2_2, - } => { - if let &Opcode::CallIndirect = pattern2_0 { - let pattern4_0 = C::value_list_slice(ctx, pattern2_1); - if let Some((pattern5_0, pattern5_1)) = C::value_slice_unwrap(ctx, pattern4_0) { - // Rule at src/isa/riscv64/lower.isle line 878. - let expr0_0 = C::gen_call_indirect(ctx, pattern2_2, pattern5_0, pattern5_1); - return Some(expr0_0); - } - } - } - &InstructionData::FuncAddr { - opcode: ref pattern2_0, - func_ref: pattern2_1, - } => { - if let &Opcode::FuncAddr = pattern2_0 { - let (pattern4_0, pattern4_1, pattern4_2) = C::func_ref_data(ctx, pattern2_1); - // Rule at src/isa/riscv64/lower.isle line 770. - let expr0_0: i64 = 0i128 as i64; - let expr1_0 = C::load_ext_name(ctx, pattern4_1, expr0_0); - let expr2_0 = constructor_output_reg(ctx, expr1_0); - return Some(expr2_0); - } - } - &InstructionData::UnaryGlobalValue { - opcode: ref pattern2_0, - global_value: pattern2_1, - } => { - if let &Opcode::SymbolValue = pattern2_0 { - if let Some((pattern4_0, pattern4_1, pattern4_2)) = - C::symbol_value_data(ctx, pattern2_1) - { - // Rule at src/isa/riscv64/lower.isle line 805. - let expr0_0 = C::load_ext_name(ctx, pattern4_0, pattern4_2); - let expr1_0 = constructor_output_reg(ctx, expr0_0); - return Some(expr1_0); - } - } - } - &InstructionData::UnaryIeee32 { - opcode: ref pattern2_0, - imm: pattern2_1, - } => { - if let &Opcode::F32const = pattern2_0 { - let pattern4_0 = C::u64_from_ieee32(ctx, pattern2_1); - // Rule at src/isa/riscv64/lower.isle line 14. - let expr0_0: Type = F32; - let expr1_0 = C::imm(ctx, expr0_0, pattern4_0); - let expr2_0 = constructor_output_reg(ctx, expr1_0); - return Some(expr2_0); - } - } - &InstructionData::UnaryIeee64 { - opcode: ref pattern2_0, - imm: pattern2_1, - } => { - if let &Opcode::F64const = pattern2_0 { - let pattern4_0 = C::u64_from_ieee64(ctx, pattern2_1); - // Rule at src/isa/riscv64/lower.isle line 19. - let expr0_0: Type = F64; - let expr1_0 = C::imm(ctx, expr0_0, pattern4_0); - let expr2_0 = constructor_output_reg(ctx, expr1_0); - return Some(expr2_0); - } - } - &InstructionData::StackLoad { - opcode: ref pattern2_0, - stack_slot: pattern2_1, - offset: pattern2_2, - } => { - if let &Opcode::StackAddr = pattern2_0 { - // Rule at src/isa/riscv64/lower.isle line 596. - let expr0_0 = C::gen_stack_addr(ctx, pattern2_1, pattern2_2); - let expr1_0 = constructor_output_reg(ctx, expr0_0); - return Some(expr1_0); - } - } - &InstructionData::Trap { - opcode: ref pattern2_0, - code: ref pattern2_1, - } => { - match pattern2_0 { - &Opcode::Trap => { - // Rule at src/isa/riscv64/lower.isle line 673. - let expr0_0 = constructor_udf(ctx, pattern2_1); - return Some(expr0_0); - } - &Opcode::ResumableTrap => { - // Rule at src/isa/riscv64/lower.isle line 678. - let expr0_0 = constructor_udf(ctx, pattern2_1); - return Some(expr0_0); - } - _ => {} - } - } - &InstructionData::StoreNoOffset { - opcode: ref pattern2_0, - args: ref pattern2_1, - flags: pattern2_2, - } => { - if let &Opcode::AtomicStore = pattern2_0 { - let (pattern4_0, pattern4_1) = C::unpack_value_array_2(ctx, pattern2_1); - let pattern5_0 = C::value_type(ctx, pattern4_0); - if let Some(pattern6_0) = C::valid_atomic_transaction(ctx, pattern5_0) { - // Rule at src/isa/riscv64/lower.isle line 522. - let expr0_0 = C::put_in_reg(ctx, pattern4_1); - let expr1_0 = C::put_in_reg(ctx, pattern4_0); - let expr2_0 = constructor_gen_atomic_store(ctx, expr0_0, pattern6_0, expr1_0); - return Some(expr2_0); - } - } - } - &InstructionData::Store { - opcode: ref pattern2_0, - args: ref pattern2_1, - flags: pattern2_2, - offset: pattern2_3, - } => { - match pattern2_0 { - &Opcode::Store => { - let (pattern4_0, pattern4_1) = C::unpack_value_array_2(ctx, pattern2_1); - let pattern5_0 = C::value_type(ctx, pattern4_0); - // Rule at src/isa/riscv64/lower.isle line 734. - let expr0_0 = C::put_in_reg(ctx, pattern4_1); - let expr1_0 = C::store_op(ctx, pattern5_0); - let expr2_0 = C::put_in_reg(ctx, pattern4_0); - let expr3_0 = constructor_gen_store( - ctx, expr0_0, pattern2_3, &expr1_0, pattern2_2, expr2_0, - ); - return Some(expr3_0); - } - &Opcode::Istore8 => { - let (pattern4_0, pattern4_1) = C::unpack_value_array_2(ctx, pattern2_1); - // Rule at src/isa/riscv64/lower.isle line 720. - let expr0_0 = C::put_in_reg(ctx, pattern4_1); - let expr1_0 = StoreOP::Sb; - let expr2_0 = C::put_in_reg(ctx, pattern4_0); - let expr3_0 = constructor_gen_store( - ctx, expr0_0, pattern2_3, &expr1_0, pattern2_2, expr2_0, - ); - return Some(expr3_0); - } - &Opcode::Istore16 => { - let (pattern4_0, pattern4_1) = C::unpack_value_array_2(ctx, pattern2_1); - // Rule at src/isa/riscv64/lower.isle line 724. - let expr0_0 = C::put_in_reg(ctx, pattern4_1); - let expr1_0 = StoreOP::Sh; - let expr2_0 = C::put_in_reg(ctx, pattern4_0); - let expr3_0 = constructor_gen_store( - ctx, expr0_0, pattern2_3, &expr1_0, pattern2_2, expr2_0, - ); - return Some(expr3_0); - } - &Opcode::Istore32 => { - let (pattern4_0, pattern4_1) = C::unpack_value_array_2(ctx, pattern2_1); - // Rule at src/isa/riscv64/lower.isle line 729. - let expr0_0 = C::put_in_reg(ctx, pattern4_1); - let expr1_0 = StoreOP::Sw; - let expr2_0 = C::put_in_reg(ctx, pattern4_0); - let expr3_0 = constructor_gen_store( - ctx, expr0_0, pattern2_3, &expr1_0, pattern2_2, expr2_0, - ); - return Some(expr3_0); - } - _ => {} - } - } - &InstructionData::FloatCompare { - opcode: ref pattern2_0, - args: ref pattern2_1, - cond: ref pattern2_2, - } => { - if let &Opcode::Fcmp = pattern2_0 { - let (pattern4_0, pattern4_1) = C::unpack_value_array_2(ctx, pattern2_1); - let pattern5_0 = C::value_type(ctx, pattern4_0); - // Rule at src/isa/riscv64/lower.isle line 765. - let expr0_0 = - constructor_gen_fcmp(ctx, pattern2_2, pattern4_0, pattern4_1, pattern5_0); - let expr1_0 = constructor_output_reg(ctx, expr0_0); - return Some(expr1_0); - } - } - &InstructionData::IntCompare { - opcode: ref pattern2_0, - args: ref pattern2_1, - cond: ref pattern2_2, - } => { - if let &Opcode::Icmp = pattern2_0 { - let (pattern4_0, pattern4_1) = C::unpack_value_array_2(ctx, pattern2_1); - let pattern5_0 = C::value_type(ctx, pattern4_0); - // Rule at src/isa/riscv64/lower.isle line 752. - let expr0_0 = C::put_in_regs(ctx, pattern4_0); - let expr1_0 = C::put_in_regs(ctx, pattern4_1); - let expr2_0 = constructor_lower_icmp(ctx, pattern2_2, expr0_0, expr1_0, pattern5_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - } - _ => {} - } - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::first_result(ctx, pattern0_0) { - let pattern2_0 = C::value_type(ctx, pattern1_0); - if let Some(pattern3_0) = C::fits_in_16(ctx, pattern2_0) { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Binary { - opcode: ref pattern5_0, - args: ref pattern5_1, - } = &pattern4_0 - { - match pattern5_0 { - &Opcode::Urem => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/riscv64/lower.isle line 154. - let expr0_0: bool = false; - let expr1_0 = C::put_in_regs(ctx, pattern7_1); - let expr2_0 = - constructor_ext_int_if_need(ctx, expr0_0, expr1_0, pattern3_0); - let expr3_0 = constructor_convert_valueregs_reg(ctx, expr2_0); - let expr4_0 = constructor_gen_div_by_zero(ctx, expr3_0); - let expr5_0 = AluOPRRR::Remuw; - let expr6_0: bool = false; - let expr7_0 = C::put_in_regs(ctx, pattern7_0); - let expr8_0 = - constructor_ext_int_if_need(ctx, expr6_0, expr7_0, pattern3_0); - let expr9_0 = constructor_convert_valueregs_reg(ctx, expr8_0); - let expr10_0 = constructor_alu_rrr(ctx, &expr5_0, expr9_0, expr3_0); - let expr11_0 = constructor_output_reg(ctx, expr10_0); - return Some(expr11_0); - } - &Opcode::Srem => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/riscv64/lower.isle line 160. - let expr0_0: bool = true; - let expr1_0 = C::put_in_regs(ctx, pattern7_1); - let expr2_0 = - constructor_ext_int_if_need(ctx, expr0_0, expr1_0, pattern3_0); - let expr3_0 = constructor_convert_valueregs_reg(ctx, expr2_0); - let expr4_0 = constructor_gen_div_by_zero(ctx, expr3_0); - let expr5_0 = AluOPRRR::Remw; - let expr6_0: bool = true; - let expr7_0 = C::put_in_regs(ctx, pattern7_0); - let expr8_0 = - constructor_ext_int_if_need(ctx, expr6_0, expr7_0, pattern3_0); - let expr9_0 = constructor_convert_valueregs_reg(ctx, expr8_0); - let expr10_0 = constructor_alu_rrr(ctx, &expr5_0, expr9_0, expr3_0); - let expr11_0 = constructor_output_reg(ctx, expr10_0); - return Some(expr11_0); - } - _ => {} - } - } - } - if let Some(pattern3_0) = C::fits_in_32(ctx, pattern2_0) { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Binary { - opcode: ref pattern5_0, - args: ref pattern5_1, - } = &pattern4_0 - { - match pattern5_0 { - &Opcode::Iadd => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/riscv64/lower.isle line 29. - let expr0_0 = AluOPRRR::Addw; - let expr1_0 = C::put_in_reg(ctx, pattern7_0); - let expr2_0 = C::put_in_reg(ctx, pattern7_1); - let expr3_0 = constructor_alu_rrr(ctx, &expr0_0, expr1_0, expr2_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - &Opcode::Isub => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/riscv64/lower.isle line 70. - let expr0_0 = AluOPRRR::Subw; - let expr1_0 = C::put_in_reg(ctx, pattern7_0); - let expr2_0 = C::put_in_reg(ctx, pattern7_1); - let expr3_0 = constructor_alu_rrr(ctx, &expr0_0, expr1_0, expr2_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - &Opcode::Imul => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/riscv64/lower.isle line 86. - let expr0_0 = AluOPRRR::Mulw; - let expr1_0 = C::put_in_reg(ctx, pattern7_0); - let expr2_0 = C::put_in_reg(ctx, pattern7_1); - let expr3_0 = constructor_alu_rrr(ctx, &expr0_0, expr1_0, expr2_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - &Opcode::Udiv => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/riscv64/lower.isle line 127. - let expr0_0: bool = false; - let expr1_0 = C::put_in_regs(ctx, pattern7_1); - let expr2_0 = - constructor_ext_int_if_need(ctx, expr0_0, expr1_0, pattern3_0); - let expr3_0 = constructor_convert_valueregs_reg(ctx, expr2_0); - let expr4_0 = constructor_gen_div_by_zero(ctx, expr3_0); - let expr5_0 = AluOPRRR::Divuw; - let expr6_0: bool = false; - let expr7_0 = C::put_in_regs(ctx, pattern7_0); - let expr8_0 = - constructor_ext_int_if_need(ctx, expr6_0, expr7_0, pattern3_0); - let expr9_0 = constructor_convert_valueregs_reg(ctx, expr8_0); - let expr10_0 = constructor_alu_rrr(ctx, &expr5_0, expr9_0, expr3_0); - let expr11_0 = constructor_output_reg(ctx, expr10_0); - return Some(expr11_0); - } - &Opcode::Sdiv => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/riscv64/lower.isle line 133. - let expr0_0: bool = true; - let expr1_0 = C::put_in_regs(ctx, pattern7_0); - let expr2_0 = - constructor_ext_int_if_need(ctx, expr0_0, expr1_0, pattern3_0); - let expr3_0 = constructor_convert_valueregs_reg(ctx, expr2_0); - let expr4_0: bool = true; - let expr5_0 = C::put_in_regs(ctx, pattern7_1); - let expr6_0 = - constructor_ext_int_if_need(ctx, expr4_0, expr5_0, pattern3_0); - let expr7_0 = constructor_convert_valueregs_reg(ctx, expr6_0); - let expr8_0 = - constructor_gen_div_overflow(ctx, expr3_0, expr7_0, pattern3_0); - let expr9_0 = constructor_gen_div_by_zero(ctx, expr7_0); - let expr10_0 = AluOPRRR::Divw; - let expr11_0 = constructor_alu_rrr(ctx, &expr10_0, expr3_0, expr7_0); - let expr12_0 = constructor_output_reg(ctx, expr11_0); - return Some(expr12_0); - } - _ => {} - } - } - } - if let Some(pattern3_0) = C::fits_in_64(ctx, pattern2_0) { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Binary { - opcode: ref pattern5_0, - args: ref pattern5_1, - } = &pattern4_0 - { - match pattern5_0 { - &Opcode::Band => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/riscv64/lower.isle line 189. - let expr0_0 = AluOPRRR::And; - let expr1_0 = C::put_in_reg(ctx, pattern7_0); - let expr2_0 = C::put_in_reg(ctx, pattern7_1); - let expr3_0 = constructor_alu_rrr(ctx, &expr0_0, expr1_0, expr2_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - &Opcode::Bor => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/riscv64/lower.isle line 209. - let expr0_0 = AluOPRRR::Or; - let expr1_0 = C::put_in_reg(ctx, pattern7_0); - let expr2_0 = C::put_in_reg(ctx, pattern7_1); - let expr3_0 = constructor_alu_rrr(ctx, &expr0_0, expr1_0, expr2_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - &Opcode::Bxor => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/riscv64/lower.isle line 227. - let expr0_0 = AluOPRRR::Xor; - let expr1_0 = C::put_in_reg(ctx, pattern7_0); - let expr2_0 = C::put_in_reg(ctx, pattern7_1); - let expr3_0 = constructor_alu_rrr(ctx, &expr0_0, expr1_0, expr2_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - _ => {} - } - } - } - if let Some(pattern3_0) = C::valid_atomic_transaction(ctx, pattern2_0) { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::AtomicRmw { - opcode: ref pattern5_0, - args: ref pattern5_1, - flags: pattern5_2, - op: ref pattern5_3, - } = &pattern4_0 - { - if let &Opcode::AtomicRmw = pattern5_0 { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/riscv64/lower.isle line 460. - let expr0_0 = constructor_get_atomic_rmw_op(ctx, pattern3_0, pattern5_3); - let expr1_0 = C::put_in_reg(ctx, pattern7_0); - let expr2_0 = C::put_in_reg(ctx, pattern7_1); - let expr3_0 = C::atomic_amo(ctx); - let expr4_0 = constructor_gen_atomic(ctx, &expr0_0, expr1_0, expr2_0, expr3_0); - let expr5_0 = constructor_output_reg(ctx, expr4_0); - return Some(expr5_0); - } - } - } - let pattern3_0 = C::inst_data(ctx, pattern0_0); - match &pattern3_0 { - &InstructionData::Unary { - opcode: ref pattern4_0, - arg: pattern4_1, - } => { - if let &Opcode::Bnot = pattern4_0 { - // Rule at src/isa/riscv64/lower.isle line 245. - let expr0_0 = AluOPRRI::Xori; - let expr1_0 = C::put_in_reg(ctx, pattern4_1); - let expr2_0: i64 = -1i128 as i64; - let expr3_0 = C::imm_from_neg_bits(ctx, expr2_0); - let expr4_0 = constructor_alu_rr_imm12(ctx, &expr0_0, expr1_0, expr3_0); - let expr5_0 = constructor_output_reg(ctx, expr4_0); - return Some(expr5_0); - } - } - &InstructionData::Ternary { - opcode: ref pattern4_0, - args: ref pattern4_1, - } => { - if let &Opcode::SelectSpectreGuard = pattern4_0 { - let (pattern6_0, pattern6_1, pattern6_2) = - C::unpack_value_array_3(ctx, pattern4_1); - let pattern7_0 = C::value_type(ctx, pattern6_0); - // Rule at src/isa/riscv64/lower.isle line 843. - let expr0_0 = C::put_in_regs(ctx, pattern6_0); - let expr1_0 = constructor_normalize_cmp_value(ctx, pattern7_0, expr0_0); - let expr2_0 = constructor_truthy_to_reg(ctx, pattern7_0, expr1_0); - let expr3_0 = C::put_in_regs(ctx, pattern6_1); - let expr4_0 = C::put_in_regs(ctx, pattern6_2); - let expr5_0 = - constructor_gen_select(ctx, pattern2_0, expr2_0, expr3_0, expr4_0); - let expr6_0 = C::output(ctx, expr5_0); - return Some(expr6_0); - } - } - _ => {} - } - } - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::first_result(ctx, pattern0_0) { - let pattern2_0 = C::value_type(ctx, pattern1_0); - if let Some(pattern3_0) = C::fits_in_64(ctx, pattern2_0) { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Binary { - opcode: ref pattern5_0, - args: ref pattern5_1, - } = &pattern4_0 - { - match pattern5_0 { - &Opcode::Iadd => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/riscv64/lower.isle line 33. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = C::put_in_reg(ctx, pattern7_1); - let expr2_0 = constructor_alu_add(ctx, expr0_0, expr1_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::Isub => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/riscv64/lower.isle line 67. - let expr0_0 = AluOPRRR::Sub; - let expr1_0 = C::put_in_reg(ctx, pattern7_0); - let expr2_0 = C::put_in_reg(ctx, pattern7_1); - let expr3_0 = constructor_alu_rrr(ctx, &expr0_0, expr1_0, expr2_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - &Opcode::Imul => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/riscv64/lower.isle line 84. - let expr0_0 = AluOPRRR::Mul; - let expr1_0 = C::put_in_reg(ctx, pattern7_0); - let expr2_0 = C::put_in_reg(ctx, pattern7_1); - let expr3_0 = constructor_alu_rrr(ctx, &expr0_0, expr1_0, expr2_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - _ => {} - } - } - } - } - return None; -} - -// Generated as internal constructor for term gen_atomic_rmw_loop. -pub fn constructor_gen_atomic_rmw_loop( - ctx: &mut C, - arg0: &AtomicRmwOp, - arg1: Type, - arg2: Reg, - arg3: Reg, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - // Rule at src/isa/riscv64/lower.isle line 498. - let expr0_0: Type = I64; - let expr1_0 = C::temp_writable_reg(ctx, expr0_0); - let expr2_0: Type = I64; - let expr3_0 = C::temp_writable_reg(ctx, expr2_0); - let expr4_0 = constructor_gen_atomic_offset(ctx, pattern2_0, pattern1_0); - let expr5_0 = constructor_gen_atomic_p(ctx, pattern2_0, pattern1_0); - let expr6_0 = MInst::AtomicRmwLoop { - offset: expr4_0, - op: pattern0_0.clone(), - dst: expr1_0, - ty: pattern1_0, - p: expr5_0, - x: pattern3_0, - t0: expr3_0, - }; - let expr7_0 = C::emit(ctx, &expr6_0); - let expr8_0 = C::writable_reg_to_reg(ctx, expr1_0); - return expr8_0; -} - -// Generated as internal constructor for term gen_atomic_offset. -pub fn constructor_gen_atomic_offset(ctx: &mut C, arg0: Reg, arg1: Type) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - if let Some(pattern2_0) = C::fits_in_16(ctx, pattern1_0) { - // Rule at src/isa/riscv64/lower.isle line 526. - let expr0_0: i32 = 3i128 as i32; - let expr1_0 = constructor_alu_andi(ctx, pattern0_0, expr0_0); - let expr2_0: i32 = 3i128 as i32; - let expr3_0 = constructor_alu_slli(ctx, expr1_0, expr2_0); - return expr3_0; - } - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/riscv64/lower.isle line 529. - let expr0_0 = C::zero_reg(ctx); - return expr0_0; -} - -// Generated as internal constructor for term gen_atomic_p. -pub fn constructor_gen_atomic_p(ctx: &mut C, arg0: Reg, arg1: Type) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - if let Some(pattern2_0) = C::fits_in_16(ctx, pattern1_0) { - // Rule at src/isa/riscv64/lower.isle line 533. - let expr0_0: i32 = -4i128 as i32; - let expr1_0 = constructor_alu_andi(ctx, pattern0_0, expr0_0); - return expr1_0; - } - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/riscv64/lower.isle line 536. - return pattern0_0; -} - -// Generated as internal constructor for term gen_icmp. -pub fn constructor_gen_icmp( - ctx: &mut C, - arg0: &IntCC, - arg1: ValueRegs, - arg2: ValueRegs, - arg3: Type, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - // Rule at src/isa/riscv64/lower.isle line 744. - let expr0_0: Type = I64; - let expr1_0 = C::temp_writable_reg(ctx, expr0_0); - let expr2_0 = MInst::Icmp { - cc: pattern0_0.clone(), - rd: expr1_0, - a: pattern1_0, - b: pattern2_0, - ty: pattern3_0, - }; - let expr3_0 = C::emit(ctx, &expr2_0); - let expr4_0 = C::writable_reg_to_reg(ctx, expr1_0); - return expr4_0; -} - -// Generated as internal constructor for term gen_fcmp. -pub fn constructor_gen_fcmp( - ctx: &mut C, - arg0: &FloatCC, - arg1: Value, - arg2: Value, - arg3: Type, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - // Rule at src/isa/riscv64/lower.isle line 757. - let expr0_0: Type = I64; - let expr1_0 = C::temp_writable_reg(ctx, expr0_0); - let expr2_0 = C::put_in_reg(ctx, pattern1_0); - let expr3_0 = C::put_in_reg(ctx, pattern2_0); - let expr4_0 = MInst::Fcmp { - cc: pattern0_0.clone(), - rd: expr1_0, - rs1: expr2_0, - rs2: expr3_0, - ty: pattern3_0, - }; - let expr5_0 = C::emit(ctx, &expr4_0); - let expr6_0 = C::writable_reg_to_reg(ctx, expr1_0); - return expr6_0; -} diff --git a/cranelift/codegen/isle_generated_code/isle_s390x.rs b/cranelift/codegen/isle_generated_code/isle_s390x.rs deleted file mode 100644 index 9a18fea7a858..000000000000 --- a/cranelift/codegen/isle_generated_code/isle_s390x.rs +++ /dev/null @@ -1,30872 +0,0 @@ -// GENERATED BY ISLE. DO NOT EDIT! -// -// Generated automatically from the instruction-selection DSL code in: -// - src/prelude.isle -// - src/prelude_lower.isle -// - src/isa/s390x/inst.isle -// - src/isa/s390x/lower.isle -// - /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_lower.isle - -use super::*; // Pulls in all external types. -use std::marker::PhantomData; - -/// Context during lowering: an implementation of this trait -/// must be provided with all external constructors and extractors. -/// A mutable borrow is passed along through all lowering logic. -pub trait Context { - fn unit(&mut self) -> Unit; - fn value_type(&mut self, arg0: Value) -> Type; - fn u32_add(&mut self, arg0: u32, arg1: u32) -> u32; - fn s32_add_fallible(&mut self, arg0: u32, arg1: u32) -> Option; - fn u32_nonnegative(&mut self, arg0: u32) -> Option; - fn offset32(&mut self, arg0: Offset32) -> u32; - fn u32_lteq(&mut self, arg0: u32, arg1: u32) -> Option; - fn u8_lteq(&mut self, arg0: u8, arg1: u8) -> Option; - fn u8_lt(&mut self, arg0: u8, arg1: u8) -> Option; - fn simm32(&mut self, arg0: Imm64) -> Option; - fn uimm8(&mut self, arg0: Imm64) -> Option; - fn u8_and(&mut self, arg0: u8, arg1: u8) -> u8; - fn u8_as_u32(&mut self, arg0: u8) -> u32; - fn u8_as_u64(&mut self, arg0: u8) -> u64; - fn u16_as_u64(&mut self, arg0: u16) -> u64; - fn u32_as_u64(&mut self, arg0: u32) -> u64; - fn i64_as_u64(&mut self, arg0: i64) -> u64; - fn u64_add(&mut self, arg0: u64, arg1: u64) -> u64; - fn u64_sub(&mut self, arg0: u64, arg1: u64) -> u64; - fn u64_mul(&mut self, arg0: u64, arg1: u64) -> u64; - fn u64_sdiv(&mut self, arg0: u64, arg1: u64) -> Option; - fn u64_udiv(&mut self, arg0: u64, arg1: u64) -> Option; - fn u64_and(&mut self, arg0: u64, arg1: u64) -> u64; - fn u64_or(&mut self, arg0: u64, arg1: u64) -> u64; - fn u64_xor(&mut self, arg0: u64, arg1: u64) -> u64; - fn u64_not(&mut self, arg0: u64) -> u64; - fn u64_sextend_u32(&mut self, arg0: u64) -> u64; - fn u64_uextend_u32(&mut self, arg0: u64) -> u64; - fn u64_is_zero(&mut self, arg0: u64) -> bool; - fn u64_is_odd(&mut self, arg0: u64) -> bool; - fn ty_bits(&mut self, arg0: Type) -> u8; - fn ty_bits_u16(&mut self, arg0: Type) -> u16; - fn ty_bits_u64(&mut self, arg0: Type) -> u64; - fn ty_mask(&mut self, arg0: Type) -> u64; - fn ty_bytes(&mut self, arg0: Type) -> u16; - fn lane_type(&mut self, arg0: Type) -> Type; - fn mem_flags_trusted(&mut self) -> MemFlags; - fn intcc_reverse(&mut self, arg0: &IntCC) -> IntCC; - fn intcc_inverse(&mut self, arg0: &IntCC) -> IntCC; - fn floatcc_reverse(&mut self, arg0: &FloatCC) -> FloatCC; - fn floatcc_inverse(&mut self, arg0: &FloatCC) -> FloatCC; - fn fits_in_16(&mut self, arg0: Type) -> Option; - fn fits_in_32(&mut self, arg0: Type) -> Option; - fn lane_fits_in_32(&mut self, arg0: Type) -> Option; - fn fits_in_64(&mut self, arg0: Type) -> Option; - fn ty_32(&mut self, arg0: Type) -> Option; - fn ty_64(&mut self, arg0: Type) -> Option; - fn ty_int_ref_scalar_64(&mut self, arg0: Type) -> Option; - fn ty_32_or_64(&mut self, arg0: Type) -> Option; - fn ty_8_or_16(&mut self, arg0: Type) -> Option; - fn int_fits_in_32(&mut self, arg0: Type) -> Option; - fn ty_int_ref_64(&mut self, arg0: Type) -> Option; - fn ty_int(&mut self, arg0: Type) -> Option; - fn ty_scalar_float(&mut self, arg0: Type) -> Option; - fn ty_float_or_vec(&mut self, arg0: Type) -> Option; - fn ty_vector_float(&mut self, arg0: Type) -> Option; - fn ty_vector_not_float(&mut self, arg0: Type) -> Option; - fn ty_vec64(&mut self, arg0: Type) -> Option; - fn ty_vec64_ctor(&mut self, arg0: Type) -> Option; - fn ty_vec128(&mut self, arg0: Type) -> Option; - fn ty_dyn_vec64(&mut self, arg0: Type) -> Option; - fn ty_dyn_vec128(&mut self, arg0: Type) -> Option; - fn ty_vec64_int(&mut self, arg0: Type) -> Option; - fn ty_vec128_int(&mut self, arg0: Type) -> Option; - fn not_vec32x2(&mut self, arg0: Type) -> Option; - fn not_i64x2(&mut self, arg0: Type) -> Option<()>; - fn u8_from_uimm8(&mut self, arg0: Uimm8) -> u8; - fn u64_from_bool(&mut self, arg0: bool) -> u64; - fn u64_from_imm64(&mut self, arg0: Imm64) -> u64; - fn nonzero_u64_from_imm64(&mut self, arg0: Imm64) -> Option; - fn imm64(&mut self, arg0: u64) -> Imm64; - fn imm64_masked(&mut self, arg0: Type, arg1: u64) -> Imm64; - fn u64_from_ieee32(&mut self, arg0: Ieee32) -> u64; - fn u64_from_ieee64(&mut self, arg0: Ieee64) -> u64; - fn multi_lane(&mut self, arg0: Type) -> Option<(u32, u32)>; - fn dynamic_lane(&mut self, arg0: Type) -> Option<(u32, u32)>; - fn dynamic_int_lane(&mut self, arg0: Type) -> Option; - fn dynamic_fp_lane(&mut self, arg0: Type) -> Option; - fn ty_dyn64_int(&mut self, arg0: Type) -> Option; - fn ty_dyn128_int(&mut self, arg0: Type) -> Option; - fn offset32_to_u32(&mut self, arg0: Offset32) -> u32; - fn intcc_unsigned(&mut self, arg0: &IntCC) -> IntCC; - fn signed_cond_code(&mut self, arg0: &IntCC) -> Option; - fn trap_code_division_by_zero(&mut self) -> TrapCode; - fn trap_code_integer_overflow(&mut self) -> TrapCode; - fn trap_code_bad_conversion_to_integer(&mut self) -> TrapCode; - fn range(&mut self, arg0: usize, arg1: usize) -> Range; - fn range_view(&mut self, arg0: Range) -> RangeView; - fn value_reg(&mut self, arg0: Reg) -> ValueRegs; - fn value_regs(&mut self, arg0: Reg, arg1: Reg) -> ValueRegs; - fn value_regs_invalid(&mut self) -> ValueRegs; - fn output_none(&mut self) -> InstOutput; - fn output(&mut self, arg0: ValueRegs) -> InstOutput; - fn output_pair(&mut self, arg0: ValueRegs, arg1: ValueRegs) -> InstOutput; - fn output_builder_new(&mut self) -> InstOutputBuilder; - fn output_builder_push(&mut self, arg0: &InstOutputBuilder, arg1: ValueRegs) -> Unit; - fn output_builder_finish(&mut self, arg0: &InstOutputBuilder) -> InstOutput; - fn temp_writable_reg(&mut self, arg0: Type) -> WritableReg; - fn is_valid_reg(&mut self, arg0: Reg) -> bool; - fn invalid_reg(&mut self) -> Reg; - fn mark_value_used(&mut self, arg0: Value) -> Unit; - fn put_in_reg(&mut self, arg0: Value) -> Reg; - fn put_in_regs(&mut self, arg0: Value) -> ValueRegs; - fn ensure_in_vreg(&mut self, arg0: Reg, arg1: Type) -> Reg; - fn value_regs_get(&mut self, arg0: ValueRegs, arg1: usize) -> Reg; - fn value_regs_len(&mut self, arg0: ValueRegs) -> usize; - fn preg_to_reg(&mut self, arg0: PReg) -> Reg; - fn value_list_slice(&mut self, arg0: ValueList) -> ValueSlice; - fn value_slice_empty(&mut self, arg0: ValueSlice) -> Option<()>; - fn value_slice_unwrap(&mut self, arg0: ValueSlice) -> Option<(Value, ValueSlice)>; - fn value_slice_len(&mut self, arg0: ValueSlice) -> usize; - fn value_slice_get(&mut self, arg0: ValueSlice, arg1: usize) -> Value; - fn writable_reg_to_reg(&mut self, arg0: WritableReg) -> Reg; - fn inst_results(&mut self, arg0: Inst) -> ValueSlice; - fn first_result(&mut self, arg0: Inst) -> Option; - fn inst_data(&mut self, arg0: Inst) -> InstructionData; - fn def_inst(&mut self, arg0: Value) -> Option; - fn zero_value(&mut self, arg0: Value) -> Option; - fn is_sinkable_inst(&mut self, arg0: Value) -> Option; - fn maybe_uextend(&mut self, arg0: Value) -> Option; - fn emit(&mut self, arg0: &MInst) -> Unit; - fn sink_inst(&mut self, arg0: Inst) -> Unit; - fn emit_u64_le_const(&mut self, arg0: u64) -> VCodeConstant; - fn emit_u128_le_const(&mut self, arg0: u128) -> VCodeConstant; - fn const_to_vconst(&mut self, arg0: Constant) -> VCodeConstant; - fn avoid_div_traps(&mut self, arg0: Type) -> Option<()>; - fn tls_model(&mut self, arg0: Type) -> TlsModel; - fn tls_model_is_elf_gd(&mut self) -> Option; - fn tls_model_is_macho(&mut self) -> Option; - fn tls_model_is_coff(&mut self) -> Option; - fn preserve_frame_pointers(&mut self) -> Option; - fn box_external_name(&mut self, arg0: ExternalName) -> BoxExternalName; - fn func_ref_data(&mut self, arg0: FuncRef) -> (SigRef, ExternalName, RelocDistance); - fn symbol_value_data( - &mut self, - arg0: GlobalValue, - ) -> Option<(ExternalName, RelocDistance, i64)>; - fn reloc_distance_near(&mut self, arg0: RelocDistance) -> Option<()>; - fn vec_mask_from_immediate(&mut self, arg0: Immediate) -> Option; - fn u128_from_immediate(&mut self, arg0: Immediate) -> Option; - fn u128_from_constant(&mut self, arg0: Constant) -> Option; - fn u64_from_constant(&mut self, arg0: Constant) -> Option; - fn only_writable_reg(&mut self, arg0: WritableValueRegs) -> Option; - fn writable_regs_get(&mut self, arg0: WritableValueRegs, arg1: usize) -> WritableReg; - fn abi_num_args(&mut self, arg0: Sig) -> usize; - fn abi_get_arg(&mut self, arg0: Sig, arg1: usize) -> ABIArg; - fn abi_num_rets(&mut self, arg0: Sig) -> usize; - fn abi_get_ret(&mut self, arg0: Sig, arg1: usize) -> ABIArg; - fn abi_ret_arg(&mut self, arg0: Sig) -> Option; - fn abi_no_ret_arg(&mut self, arg0: Sig) -> Option<()>; - fn abi_sized_stack_arg_space(&mut self, arg0: Sig) -> i64; - fn abi_sized_stack_ret_space(&mut self, arg0: Sig) -> i64; - fn abi_stackslot_addr(&mut self, arg0: WritableReg, arg1: StackSlot, arg2: Offset32) -> MInst; - fn abi_dynamic_stackslot_addr(&mut self, arg0: WritableReg, arg1: DynamicStackSlot) -> MInst; - fn abi_arg_only_slot(&mut self, arg0: &ABIArg) -> Option; - fn abi_arg_struct_pointer(&mut self, arg0: &ABIArg) -> Option<(ABIArgSlot, i64, u64)>; - fn abi_arg_implicit_pointer(&mut self, arg0: &ABIArg) -> Option<(ABIArgSlot, i64, Type)>; - fn real_reg_to_reg(&mut self, arg0: RealReg) -> Reg; - fn real_reg_to_writable_reg(&mut self, arg0: RealReg) -> WritableReg; - fn gen_move(&mut self, arg0: Type, arg1: WritableReg, arg2: Reg) -> MInst; - fn gen_return(&mut self, arg0: ValueSlice) -> Unit; - fn box_symbol_reloc(&mut self, arg0: &SymbolReloc) -> BoxSymbolReloc; - fn mie2_enabled(&mut self, arg0: Type) -> Option<()>; - fn mie2_disabled(&mut self, arg0: Type) -> Option<()>; - fn vxrs_ext2_enabled(&mut self, arg0: Type) -> Option<()>; - fn vxrs_ext2_disabled(&mut self, arg0: Type) -> Option<()>; - fn allow_div_traps(&mut self, arg0: Type) -> Option<()>; - fn lane_order(&mut self) -> LaneOrder; - fn be_lane_idx(&mut self, arg0: Type, arg1: u8) -> u8; - fn be_vec_const(&mut self, arg0: Type, arg1: u128) -> u128; - fn writable_gpr(&mut self, arg0: u8) -> WritableReg; - fn zero_reg(&mut self) -> Reg; - fn gpr32_ty(&mut self, arg0: Type) -> Option; - fn gpr64_ty(&mut self, arg0: Type) -> Option; - fn vr128_ty(&mut self, arg0: Type) -> Option; - fn uimm32shifted(&mut self, arg0: u32, arg1: u8) -> UImm32Shifted; - fn uimm16shifted(&mut self, arg0: u16, arg1: u8) -> UImm16Shifted; - fn i64_nonequal(&mut self, arg0: i64, arg1: i64) -> Option; - fn u8_as_u16(&mut self, arg0: u8) -> u16; - fn u64_as_u32(&mut self, arg0: u64) -> u32; - fn u64_as_i16(&mut self, arg0: u64) -> i16; - fn u64_pair_split(&mut self, arg0: u128) -> (u64, u64); - fn u64_pair_concat(&mut self, arg0: u64, arg1: u64) -> u128; - fn u32_pair_split(&mut self, arg0: u64) -> (u32, u32); - fn u32_pair_concat(&mut self, arg0: u32, arg1: u32) -> u64; - fn u16_pair_split(&mut self, arg0: u32) -> (u16, u16); - fn u16_pair_concat(&mut self, arg0: u16, arg1: u16) -> u32; - fn u8_pair_split(&mut self, arg0: u16) -> (u8, u8); - fn u8_pair_concat(&mut self, arg0: u8, arg1: u8) -> u16; - fn lane_byte_mask(&mut self, arg0: Type, arg1: u8) -> u16; - fn shuffle_mask_from_u128(&mut self, arg0: u128) -> (u128, u16); - fn u64_nonzero_hipart(&mut self, arg0: u64) -> Option; - fn u64_nonzero_lopart(&mut self, arg0: u64) -> Option; - fn i32_from_u64(&mut self, arg0: u64) -> Option; - fn i16_from_u64(&mut self, arg0: u64) -> Option; - fn i16_from_u32(&mut self, arg0: u32) -> Option; - fn uimm32shifted_from_u64(&mut self, arg0: u64) -> Option; - fn uimm16shifted_from_u64(&mut self, arg0: u64) -> Option; - fn u64_from_value(&mut self, arg0: Value) -> Option; - fn u32_from_value(&mut self, arg0: Value) -> Option; - fn u8_from_value(&mut self, arg0: Value) -> Option; - fn u64_from_signed_value(&mut self, arg0: Value) -> Option; - fn u64_from_inverted_value(&mut self, arg0: Value) -> Option; - fn i64_from_value(&mut self, arg0: Value) -> Option; - fn i32_from_value(&mut self, arg0: Value) -> Option; - fn i16_from_value(&mut self, arg0: Value) -> Option; - fn i16_from_swapped_value(&mut self, arg0: Value) -> Option; - fn i64_from_negated_value(&mut self, arg0: Value) -> Option; - fn i32_from_negated_value(&mut self, arg0: Value) -> Option; - fn i16_from_negated_value(&mut self, arg0: Value) -> Option; - fn uimm16shifted_from_value(&mut self, arg0: Value) -> Option; - fn uimm32shifted_from_value(&mut self, arg0: Value) -> Option; - fn uimm16shifted_from_inverted_value(&mut self, arg0: Value) -> Option; - fn uimm32shifted_from_inverted_value(&mut self, arg0: Value) -> Option; - fn len_minus_one(&mut self, arg0: u64) -> Option; - fn mask_amt_imm(&mut self, arg0: Type, arg1: i64) -> u8; - fn mask_as_cond(&mut self, arg0: u8) -> Cond; - fn intcc_as_cond(&mut self, arg0: &IntCC) -> Cond; - fn floatcc_as_cond(&mut self, arg0: &FloatCC) -> Cond; - fn invert_cond(&mut self, arg0: &Cond) -> Cond; - fn signed(&mut self, arg0: &IntCC) -> Option<()>; - fn unsigned(&mut self, arg0: &IntCC) -> Option<()>; - fn vec_length_minus1(&mut self, arg0: &VecMachLabel) -> u32; - fn vec_element(&mut self, arg0: &VecMachLabel, arg1: u8) -> MachLabel; - fn zero_offset(&mut self) -> Offset32; - fn i64_from_offset(&mut self, arg0: Offset32) -> i64; - fn littleendian(&mut self, arg0: MemFlags) -> Option<()>; - fn bigendian(&mut self, arg0: MemFlags) -> Option<()>; - fn memflags_trusted(&mut self) -> MemFlags; - fn memarg_flags(&mut self, arg0: &MemArg) -> MemFlags; - fn memarg_reg_plus_reg(&mut self, arg0: Reg, arg1: Reg, arg2: u8, arg3: MemFlags) -> MemArg; - fn memarg_reg_plus_off(&mut self, arg0: Reg, arg1: i64, arg2: u8, arg3: MemFlags) -> MemArg; - fn memarg_symbol(&mut self, arg0: ExternalName, arg1: i32, arg2: MemFlags) -> MemArg; - fn memarg_got(&mut self) -> MemArg; - fn memarg_stack_off(&mut self, arg0: i64, arg1: i64) -> MemArg; - fn memarg_initial_sp_offset(&mut self, arg0: i64) -> MemArg; - fn memarg_symbol_offset_sum(&mut self, arg0: i64, arg1: i64) -> Option; - fn memarg_pair_from_memarg(&mut self, arg0: &MemArg) -> Option; - fn memarg_pair_from_reg(&mut self, arg0: Reg, arg1: MemFlags) -> MemArgPair; - fn sinkable_inst(&mut self, arg0: Value) -> Option; - fn writable_regpair(&mut self, arg0: WritableReg, arg1: WritableReg) -> WritableRegPair; - fn writable_regpair_hi(&mut self, arg0: WritableRegPair) -> WritableReg; - fn writable_regpair_lo(&mut self, arg0: WritableRegPair) -> WritableReg; - fn regpair(&mut self, arg0: Reg, arg1: Reg) -> RegPair; - fn regpair_hi(&mut self, arg0: RegPair) -> Reg; - fn regpair_lo(&mut self, arg0: RegPair) -> Reg; - fn inst_builder_new(&mut self) -> VecMInstBuilder; - fn inst_builder_push(&mut self, arg0: &VecMInstBuilder, arg1: &MInst) -> Unit; - fn inst_builder_finish(&mut self, arg0: &VecMInstBuilder) -> VecMInst; - fn real_reg(&mut self, arg0: WritableReg) -> Option; - fn same_reg(&mut self, arg0: WritableReg, arg1: Reg) -> Option; - fn preg_stack(&mut self) -> PReg; - fn preg_gpr_0(&mut self) -> PReg; - fn args_builder_new(&mut self) -> CallArgListBuilder; - fn args_builder_push(&mut self, arg0: &CallArgListBuilder, arg1: Reg, arg2: RealReg) -> Unit; - fn args_builder_finish(&mut self, arg0: &CallArgListBuilder) -> CallArgList; - fn defs_init(&mut self, arg0: Sig) -> CallRetList; - fn defs_lookup(&mut self, arg0: &CallRetList, arg1: RealReg) -> Reg; - fn abi_sig(&mut self, arg0: SigRef) -> Sig; - fn abi_first_ret(&mut self, arg0: SigRef, arg1: Sig) -> usize; - fn abi_call_info( - &mut self, - arg0: Sig, - arg1: ExternalName, - arg2: &CallArgList, - arg3: &CallRetList, - arg4: &Opcode, - ) -> BoxCallInfo; - fn abi_call_ind_info( - &mut self, - arg0: Sig, - arg1: Reg, - arg2: &CallArgList, - arg3: &CallRetList, - arg4: &Opcode, - ) -> BoxCallIndInfo; - fn abi_accumulate_outgoing_args_size(&mut self, arg0: Sig) -> Unit; - fn abi_lane_order(&mut self, arg0: Sig) -> LaneOrder; - fn lib_call_info_memcpy(&mut self, arg0: Reg, arg1: Reg, arg2: Reg) -> LibCallInfo; - fn lib_call_info_tls_get_offset( - &mut self, - arg0: WritableReg, - arg1: Reg, - arg2: Reg, - arg3: &SymbolReloc, - ) -> LibCallInfo; - fn lib_call_info(&mut self, arg0: &LibCallInfo) -> BoxCallInfo; - fn lib_accumulate_outgoing_args_size(&mut self, arg0: &LibCallInfo) -> Unit; - fn fcvt_to_uint_ub32(&mut self, arg0: u8) -> u64; - fn fcvt_to_uint_lb32(&mut self) -> u64; - fn fcvt_to_uint_ub64(&mut self, arg0: u8) -> u64; - fn fcvt_to_uint_lb64(&mut self) -> u64; - fn fcvt_to_sint_ub32(&mut self, arg0: u8) -> u64; - fn fcvt_to_sint_lb32(&mut self, arg0: u8) -> u64; - fn fcvt_to_sint_ub64(&mut self, arg0: u8) -> u64; - fn fcvt_to_sint_lb64(&mut self, arg0: u8) -> u64; - fn unpack_value_array_2(&mut self, arg0: &ValueArray2) -> (Value, Value); - fn pack_value_array_2(&mut self, arg0: Value, arg1: Value) -> ValueArray2; - fn unpack_value_array_3(&mut self, arg0: &ValueArray3) -> (Value, Value, Value); - fn pack_value_array_3(&mut self, arg0: Value, arg1: Value, arg2: Value) -> ValueArray3; -} - -pub trait ContextIter { - type Context; - type Output; - fn next(&mut self, ctx: &mut Self::Context) -> Option; -} - -pub struct ContextIterWrapper, C: Context> { - iter: I, - _ctx: PhantomData, -} -impl, C: Context> From for ContextIterWrapper { - fn from(iter: I) -> Self { - Self { - iter, - _ctx: PhantomData, - } - } -} -impl, C: Context> ContextIter for ContextIterWrapper { - type Context = C; - type Output = Item; - fn next(&mut self, _ctx: &mut Self::Context) -> Option { - self.iter.next() - } -} - -/// Internal type SideEffectNoResult: defined at src/prelude_lower.isle line 282. -#[derive(Clone, Debug)] -pub enum SideEffectNoResult { - Inst { - inst: MInst, - }, - Inst2 { - inst1: MInst, - inst2: MInst, - }, - Inst3 { - inst1: MInst, - inst2: MInst, - inst3: MInst, - }, -} - -/// Internal type ProducesFlags: defined at src/prelude_lower.isle line 324. -#[derive(Clone, Debug)] -pub enum ProducesFlags { - AlreadyExistingFlags, - ProducesFlagsSideEffect { inst: MInst }, - ProducesFlagsTwiceSideEffect { inst1: MInst, inst2: MInst }, - ProducesFlagsReturnsReg { inst: MInst, result: Reg }, - ProducesFlagsReturnsResultWithConsumer { inst: MInst, result: Reg }, -} - -/// Internal type ConsumesFlags: defined at src/prelude_lower.isle line 346. -#[derive(Clone, Debug)] -pub enum ConsumesFlags { - ConsumesFlagsSideEffect { - inst: MInst, - }, - ConsumesFlagsSideEffect2 { - inst1: MInst, - inst2: MInst, - }, - ConsumesFlagsReturnsResultWithProducer { - inst: MInst, - result: Reg, - }, - ConsumesFlagsReturnsReg { - inst: MInst, - result: Reg, - }, - ConsumesFlagsTwiceReturnsValueRegs { - inst1: MInst, - inst2: MInst, - result: ValueRegs, - }, - ConsumesFlagsFourTimesReturnsValueRegs { - inst1: MInst, - inst2: MInst, - inst3: MInst, - inst4: MInst, - result: ValueRegs, - }, -} - -/// Internal type MInst: defined at src/isa/s390x/inst.isle line 2. -#[derive(Clone, Debug)] -pub enum MInst { - Nop0, - Nop2, - AluRRR { - alu_op: ALUOp, - rd: WritableReg, - rn: Reg, - rm: Reg, - }, - AluRRSImm16 { - alu_op: ALUOp, - rd: WritableReg, - rn: Reg, - imm: i16, - }, - AluRR { - alu_op: ALUOp, - rd: WritableReg, - ri: Reg, - rm: Reg, - }, - AluRX { - alu_op: ALUOp, - rd: WritableReg, - ri: Reg, - mem: MemArg, - }, - AluRSImm16 { - alu_op: ALUOp, - rd: WritableReg, - ri: Reg, - imm: i16, - }, - AluRSImm32 { - alu_op: ALUOp, - rd: WritableReg, - ri: Reg, - imm: i32, - }, - AluRUImm32 { - alu_op: ALUOp, - rd: WritableReg, - ri: Reg, - imm: u32, - }, - AluRUImm16Shifted { - alu_op: ALUOp, - rd: WritableReg, - ri: Reg, - imm: UImm16Shifted, - }, - AluRUImm32Shifted { - alu_op: ALUOp, - rd: WritableReg, - ri: Reg, - imm: UImm32Shifted, - }, - SMulWide { - rd: WritableRegPair, - rn: Reg, - rm: Reg, - }, - UMulWide { - rd: WritableRegPair, - ri: Reg, - rn: Reg, - }, - SDivMod32 { - rd: WritableRegPair, - ri: Reg, - rn: Reg, - }, - SDivMod64 { - rd: WritableRegPair, - ri: Reg, - rn: Reg, - }, - UDivMod32 { - rd: WritableRegPair, - ri: RegPair, - rn: Reg, - }, - UDivMod64 { - rd: WritableRegPair, - ri: RegPair, - rn: Reg, - }, - Flogr { - rd: WritableRegPair, - rn: Reg, - }, - ShiftRR { - shift_op: ShiftOp, - rd: WritableReg, - rn: Reg, - shift_imm: u8, - shift_reg: Reg, - }, - RxSBG { - op: RxSBGOp, - rd: WritableReg, - ri: Reg, - rn: Reg, - start_bit: u8, - end_bit: u8, - rotate_amt: i8, - }, - RxSBGTest { - op: RxSBGOp, - rd: Reg, - rn: Reg, - start_bit: u8, - end_bit: u8, - rotate_amt: i8, - }, - UnaryRR { - op: UnaryOp, - rd: WritableReg, - rn: Reg, - }, - CmpRR { - op: CmpOp, - rn: Reg, - rm: Reg, - }, - CmpRX { - op: CmpOp, - rn: Reg, - mem: MemArg, - }, - CmpRSImm16 { - op: CmpOp, - rn: Reg, - imm: i16, - }, - CmpRSImm32 { - op: CmpOp, - rn: Reg, - imm: i32, - }, - CmpRUImm32 { - op: CmpOp, - rn: Reg, - imm: u32, - }, - CmpTrapRR { - op: CmpOp, - rn: Reg, - rm: Reg, - cond: Cond, - trap_code: TrapCode, - }, - CmpTrapRSImm16 { - op: CmpOp, - rn: Reg, - imm: i16, - cond: Cond, - trap_code: TrapCode, - }, - CmpTrapRUImm16 { - op: CmpOp, - rn: Reg, - imm: u16, - cond: Cond, - trap_code: TrapCode, - }, - AtomicRmw { - alu_op: ALUOp, - rd: WritableReg, - rn: Reg, - mem: MemArg, - }, - AtomicCas32 { - rd: WritableReg, - ri: Reg, - rn: Reg, - mem: MemArg, - }, - AtomicCas64 { - rd: WritableReg, - ri: Reg, - rn: Reg, - mem: MemArg, - }, - Fence, - Load32 { - rd: WritableReg, - mem: MemArg, - }, - Load32ZExt8 { - rd: WritableReg, - mem: MemArg, - }, - Load32SExt8 { - rd: WritableReg, - mem: MemArg, - }, - Load32ZExt16 { - rd: WritableReg, - mem: MemArg, - }, - Load32SExt16 { - rd: WritableReg, - mem: MemArg, - }, - Load64 { - rd: WritableReg, - mem: MemArg, - }, - Load64ZExt8 { - rd: WritableReg, - mem: MemArg, - }, - Load64SExt8 { - rd: WritableReg, - mem: MemArg, - }, - Load64ZExt16 { - rd: WritableReg, - mem: MemArg, - }, - Load64SExt16 { - rd: WritableReg, - mem: MemArg, - }, - Load64ZExt32 { - rd: WritableReg, - mem: MemArg, - }, - Load64SExt32 { - rd: WritableReg, - mem: MemArg, - }, - LoadRev16 { - rd: WritableReg, - mem: MemArg, - }, - LoadRev32 { - rd: WritableReg, - mem: MemArg, - }, - LoadRev64 { - rd: WritableReg, - mem: MemArg, - }, - Store8 { - rd: Reg, - mem: MemArg, - }, - Store16 { - rd: Reg, - mem: MemArg, - }, - Store32 { - rd: Reg, - mem: MemArg, - }, - Store64 { - rd: Reg, - mem: MemArg, - }, - StoreImm8 { - imm: u8, - mem: MemArg, - }, - StoreImm16 { - imm: i16, - mem: MemArg, - }, - StoreImm32SExt16 { - imm: i16, - mem: MemArg, - }, - StoreImm64SExt16 { - imm: i16, - mem: MemArg, - }, - StoreRev16 { - rd: Reg, - mem: MemArg, - }, - StoreRev32 { - rd: Reg, - mem: MemArg, - }, - StoreRev64 { - rd: Reg, - mem: MemArg, - }, - Mvc { - dst: MemArgPair, - src: MemArgPair, - len_minus_one: u8, - }, - LoadMultiple64 { - rt: WritableReg, - rt2: WritableReg, - mem: MemArg, - }, - StoreMultiple64 { - rt: Reg, - rt2: Reg, - mem: MemArg, - }, - Mov32 { - rd: WritableReg, - rm: Reg, - }, - Mov64 { - rd: WritableReg, - rm: Reg, - }, - MovPReg { - rd: WritableReg, - rm: PReg, - }, - Mov32Imm { - rd: WritableReg, - imm: u32, - }, - Mov32SImm16 { - rd: WritableReg, - imm: i16, - }, - Mov64SImm16 { - rd: WritableReg, - imm: i16, - }, - Mov64SImm32 { - rd: WritableReg, - imm: i32, - }, - Mov64UImm16Shifted { - rd: WritableReg, - imm: UImm16Shifted, - }, - Mov64UImm32Shifted { - rd: WritableReg, - imm: UImm32Shifted, - }, - Insert64UImm16Shifted { - rd: WritableReg, - ri: Reg, - imm: UImm16Shifted, - }, - Insert64UImm32Shifted { - rd: WritableReg, - ri: Reg, - imm: UImm32Shifted, - }, - LoadAR { - rd: WritableReg, - ar: u8, - }, - InsertAR { - rd: WritableReg, - ri: Reg, - ar: u8, - }, - Extend { - rd: WritableReg, - rn: Reg, - signed: bool, - from_bits: u8, - to_bits: u8, - }, - CMov32 { - rd: WritableReg, - cond: Cond, - ri: Reg, - rm: Reg, - }, - CMov64 { - rd: WritableReg, - cond: Cond, - ri: Reg, - rm: Reg, - }, - CMov32SImm16 { - rd: WritableReg, - cond: Cond, - ri: Reg, - imm: i16, - }, - CMov64SImm16 { - rd: WritableReg, - cond: Cond, - ri: Reg, - imm: i16, - }, - FpuMove32 { - rd: WritableReg, - rn: Reg, - }, - FpuMove64 { - rd: WritableReg, - rn: Reg, - }, - FpuCMov32 { - rd: WritableReg, - cond: Cond, - ri: Reg, - rm: Reg, - }, - FpuCMov64 { - rd: WritableReg, - cond: Cond, - ri: Reg, - rm: Reg, - }, - FpuRR { - fpu_op: FPUOp1, - rd: WritableReg, - rn: Reg, - }, - FpuRRR { - fpu_op: FPUOp2, - rd: WritableReg, - rn: Reg, - rm: Reg, - }, - FpuRRRR { - fpu_op: FPUOp3, - rd: WritableReg, - rn: Reg, - rm: Reg, - ra: Reg, - }, - FpuRound { - op: FpuRoundOp, - mode: FpuRoundMode, - rd: WritableReg, - rn: Reg, - }, - FpuCmp32 { - rn: Reg, - rm: Reg, - }, - FpuCmp64 { - rn: Reg, - rm: Reg, - }, - LoadFpuConst32 { - rd: WritableReg, - const_data: u32, - }, - LoadFpuConst64 { - rd: WritableReg, - const_data: u64, - }, - VecRRR { - op: VecBinaryOp, - rd: WritableReg, - rn: Reg, - rm: Reg, - }, - VecRR { - op: VecUnaryOp, - rd: WritableReg, - rn: Reg, - }, - VecShiftRR { - shift_op: VecShiftOp, - rd: WritableReg, - rn: Reg, - shift_imm: u8, - shift_reg: Reg, - }, - VecSelect { - rd: WritableReg, - rn: Reg, - rm: Reg, - ra: Reg, - }, - VecPermute { - rd: WritableReg, - rn: Reg, - rm: Reg, - ra: Reg, - }, - VecPermuteDWImm { - rd: WritableReg, - rn: Reg, - rm: Reg, - idx1: u8, - idx2: u8, - }, - VecIntCmp { - op: VecIntCmpOp, - rd: WritableReg, - rn: Reg, - rm: Reg, - }, - VecIntCmpS { - op: VecIntCmpOp, - rd: WritableReg, - rn: Reg, - rm: Reg, - }, - VecFloatCmp { - op: VecFloatCmpOp, - rd: WritableReg, - rn: Reg, - rm: Reg, - }, - VecFloatCmpS { - op: VecFloatCmpOp, - rd: WritableReg, - rn: Reg, - rm: Reg, - }, - VecInt128SCmpHi { - tmp: WritableReg, - rn: Reg, - rm: Reg, - }, - VecInt128UCmpHi { - tmp: WritableReg, - rn: Reg, - rm: Reg, - }, - VecLoad { - rd: WritableReg, - mem: MemArg, - }, - VecLoadRev { - rd: WritableReg, - mem: MemArg, - }, - VecLoadByte16Rev { - rd: WritableReg, - mem: MemArg, - }, - VecLoadByte32Rev { - rd: WritableReg, - mem: MemArg, - }, - VecLoadByte64Rev { - rd: WritableReg, - mem: MemArg, - }, - VecLoadElt16Rev { - rd: WritableReg, - mem: MemArg, - }, - VecLoadElt32Rev { - rd: WritableReg, - mem: MemArg, - }, - VecLoadElt64Rev { - rd: WritableReg, - mem: MemArg, - }, - VecStore { - rd: Reg, - mem: MemArg, - }, - VecStoreRev { - rd: Reg, - mem: MemArg, - }, - VecStoreByte16Rev { - rd: Reg, - mem: MemArg, - }, - VecStoreByte32Rev { - rd: Reg, - mem: MemArg, - }, - VecStoreByte64Rev { - rd: Reg, - mem: MemArg, - }, - VecStoreElt16Rev { - rd: Reg, - mem: MemArg, - }, - VecStoreElt32Rev { - rd: Reg, - mem: MemArg, - }, - VecStoreElt64Rev { - rd: Reg, - mem: MemArg, - }, - VecLoadReplicate { - size: u32, - rd: WritableReg, - mem: MemArg, - }, - VecLoadReplicateRev { - size: u32, - rd: WritableReg, - mem: MemArg, - }, - VecMov { - rd: WritableReg, - rn: Reg, - }, - VecCMov { - rd: WritableReg, - cond: Cond, - ri: Reg, - rm: Reg, - }, - MovToVec128 { - rd: WritableReg, - rn: Reg, - rm: Reg, - }, - VecLoadConst { - rd: WritableReg, - const_data: u128, - }, - VecLoadConstReplicate { - size: u32, - rd: WritableReg, - const_data: u64, - }, - VecImmByteMask { - rd: WritableReg, - mask: u16, - }, - VecImmBitMask { - size: u32, - rd: WritableReg, - start_bit: u8, - end_bit: u8, - }, - VecImmReplicate { - size: u32, - rd: WritableReg, - imm: i16, - }, - VecLoadLane { - size: u32, - rd: WritableReg, - ri: Reg, - mem: MemArg, - lane_imm: u8, - }, - VecLoadLaneUndef { - size: u32, - rd: WritableReg, - mem: MemArg, - lane_imm: u8, - }, - VecLoadLaneRev { - size: u32, - rd: WritableReg, - ri: Reg, - mem: MemArg, - lane_imm: u8, - }, - VecLoadLaneRevUndef { - size: u32, - rd: WritableReg, - mem: MemArg, - lane_imm: u8, - }, - VecStoreLane { - size: u32, - rd: Reg, - mem: MemArg, - lane_imm: u8, - }, - VecStoreLaneRev { - size: u32, - rd: Reg, - mem: MemArg, - lane_imm: u8, - }, - VecInsertLane { - size: u32, - rd: WritableReg, - ri: Reg, - rn: Reg, - lane_imm: u8, - lane_reg: Reg, - }, - VecInsertLaneUndef { - size: u32, - rd: WritableReg, - rn: Reg, - lane_imm: u8, - lane_reg: Reg, - }, - VecExtractLane { - size: u32, - rd: WritableReg, - rn: Reg, - lane_imm: u8, - lane_reg: Reg, - }, - VecInsertLaneImm { - size: u32, - rd: WritableReg, - ri: Reg, - imm: i16, - lane_imm: u8, - }, - VecReplicateLane { - size: u32, - rd: WritableReg, - rn: Reg, - lane_imm: u8, - }, - Call { - link: WritableReg, - info: BoxCallInfo, - }, - CallInd { - link: WritableReg, - info: BoxCallIndInfo, - }, - Args { - args: VecArgPair, - }, - Ret { - link: Reg, - rets: VecRetPair, - }, - Jump { - dest: MachLabel, - }, - CondBr { - taken: MachLabel, - not_taken: MachLabel, - cond: Cond, - }, - TrapIf { - cond: Cond, - trap_code: TrapCode, - }, - OneWayCondBr { - target: MachLabel, - cond: Cond, - }, - IndirectBr { - rn: Reg, - targets: VecMachLabel, - }, - Debugtrap, - Trap { - trap_code: TrapCode, - }, - JTSequence { - ridx: Reg, - targets: VecMachLabel, - }, - LoadSymbolReloc { - rd: WritableReg, - symbol_reloc: BoxSymbolReloc, - }, - LoadAddr { - rd: WritableReg, - mem: MemArg, - }, - Loop { - body: VecMInst, - cond: Cond, - }, - CondBreak { - cond: Cond, - }, - VirtualSPOffsetAdj { - offset: i64, - }, - DummyUse { - reg: Reg, - }, - Unwind { - inst: UnwindInst, - }, -} - -/// Internal type SymbolReloc: defined at src/isa/s390x/inst.isle line 1017. -#[derive(Clone, Debug)] -pub enum SymbolReloc { - Absolute { name: ExternalName, offset: i64 }, - TlsGd { name: ExternalName }, -} - -/// Internal type ALUOp: defined at src/isa/s390x/inst.isle line 1034. -#[derive(Copy, Clone, PartialEq, Eq, Debug)] -pub enum ALUOp { - Add32, - Add32Ext16, - Add64, - Add64Ext16, - Add64Ext32, - AddLogical32, - AddLogical64, - AddLogical64Ext32, - Sub32, - Sub32Ext16, - Sub64, - Sub64Ext16, - Sub64Ext32, - SubLogical32, - SubLogical64, - SubLogical64Ext32, - Mul32, - Mul32Ext16, - Mul64, - Mul64Ext16, - Mul64Ext32, - And32, - And64, - Orr32, - Orr64, - Xor32, - Xor64, - NotAnd32, - NotAnd64, - NotOrr32, - NotOrr64, - NotXor32, - NotXor64, - AndNot32, - AndNot64, - OrrNot32, - OrrNot64, -} - -/// Internal type UnaryOp: defined at src/isa/s390x/inst.isle line 1081. -#[derive(Copy, Clone, PartialEq, Eq, Debug)] -pub enum UnaryOp { - Abs32, - Abs64, - Abs64Ext32, - Neg32, - Neg64, - Neg64Ext32, - PopcntByte, - PopcntReg, - BSwap32, - BSwap64, -} - -/// Internal type ShiftOp: defined at src/isa/s390x/inst.isle line 1096. -#[derive(Copy, Clone, PartialEq, Eq, Debug)] -pub enum ShiftOp { - RotL32, - RotL64, - LShL32, - LShL64, - LShR32, - LShR64, - AShR32, - AShR64, -} - -/// Internal type RxSBGOp: defined at src/isa/s390x/inst.isle line 1109. -#[derive(Copy, Clone, PartialEq, Eq, Debug)] -pub enum RxSBGOp { - Insert, - And, - Or, - Xor, -} - -/// Internal type CmpOp: defined at src/isa/s390x/inst.isle line 1118. -#[derive(Copy, Clone, PartialEq, Eq, Debug)] -pub enum CmpOp { - CmpS32, - CmpS32Ext16, - CmpS64, - CmpS64Ext16, - CmpS64Ext32, - CmpL32, - CmpL32Ext16, - CmpL64, - CmpL64Ext16, - CmpL64Ext32, -} - -/// Internal type VecBinaryOp: defined at src/isa/s390x/inst.isle line 1133. -#[derive(Copy, Clone, PartialEq, Eq, Debug)] -pub enum VecBinaryOp { - Add8x16, - Add16x8, - Add32x4, - Add64x2, - Add128, - Sub8x16, - Sub16x8, - Sub32x4, - Sub64x2, - Sub128, - Mul8x16, - Mul16x8, - Mul32x4, - UMulHi8x16, - UMulHi16x8, - UMulHi32x4, - SMulHi8x16, - SMulHi16x8, - SMulHi32x4, - UMulEven8x16, - UMulEven16x8, - UMulEven32x4, - SMulEven8x16, - SMulEven16x8, - SMulEven32x4, - UMulOdd8x16, - UMulOdd16x8, - UMulOdd32x4, - SMulOdd8x16, - SMulOdd16x8, - SMulOdd32x4, - UMax8x16, - UMax16x8, - UMax32x4, - UMax64x2, - SMax8x16, - SMax16x8, - SMax32x4, - SMax64x2, - UMin8x16, - UMin16x8, - UMin32x4, - UMin64x2, - SMin8x16, - SMin16x8, - SMin32x4, - SMin64x2, - UAvg8x16, - UAvg16x8, - UAvg32x4, - UAvg64x2, - SAvg8x16, - SAvg16x8, - SAvg32x4, - SAvg64x2, - And128, - Orr128, - Xor128, - NotAnd128, - NotOrr128, - NotXor128, - AndNot128, - OrrNot128, - BitPermute128, - LShLByByte128, - LShRByByte128, - AShRByByte128, - LShLByBit128, - LShRByBit128, - AShRByBit128, - Pack16x8, - Pack32x4, - Pack64x2, - PackUSat16x8, - PackUSat32x4, - PackUSat64x2, - PackSSat16x8, - PackSSat32x4, - PackSSat64x2, - MergeLow8x16, - MergeLow16x8, - MergeLow32x4, - MergeLow64x2, - MergeHigh8x16, - MergeHigh16x8, - MergeHigh32x4, - MergeHigh64x2, -} - -/// Internal type VecUnaryOp: defined at src/isa/s390x/inst.isle line 1235. -#[derive(Copy, Clone, PartialEq, Eq, Debug)] -pub enum VecUnaryOp { - Abs8x16, - Abs16x8, - Abs32x4, - Abs64x2, - Neg8x16, - Neg16x8, - Neg32x4, - Neg64x2, - Popcnt8x16, - Popcnt16x8, - Popcnt32x4, - Popcnt64x2, - Clz8x16, - Clz16x8, - Clz32x4, - Clz64x2, - Ctz8x16, - Ctz16x8, - Ctz32x4, - Ctz64x2, - UnpackULow8x16, - UnpackULow16x8, - UnpackULow32x4, - UnpackUHigh8x16, - UnpackUHigh16x8, - UnpackUHigh32x4, - UnpackSLow8x16, - UnpackSLow16x8, - UnpackSLow32x4, - UnpackSHigh8x16, - UnpackSHigh16x8, - UnpackSHigh32x4, -} - -/// Internal type VecShiftOp: defined at src/isa/s390x/inst.isle line 1276. -#[derive(Copy, Clone, PartialEq, Eq, Debug)] -pub enum VecShiftOp { - RotL8x16, - RotL16x8, - RotL32x4, - RotL64x2, - LShL8x16, - LShL16x8, - LShL32x4, - LShL64x2, - LShR8x16, - LShR16x8, - LShR32x4, - LShR64x2, - AShR8x16, - AShR16x8, - AShR32x4, - AShR64x2, -} - -/// Internal type VecIntCmpOp: defined at src/isa/s390x/inst.isle line 1297. -#[derive(Copy, Clone, PartialEq, Eq, Debug)] -pub enum VecIntCmpOp { - CmpEq8x16, - CmpEq16x8, - CmpEq32x4, - CmpEq64x2, - SCmpHi8x16, - SCmpHi16x8, - SCmpHi32x4, - SCmpHi64x2, - UCmpHi8x16, - UCmpHi16x8, - UCmpHi32x4, - UCmpHi64x2, -} - -/// Internal type VecFloatCmpOp: defined at src/isa/s390x/inst.isle line 1314. -#[derive(Copy, Clone, PartialEq, Eq, Debug)] -pub enum VecFloatCmpOp { - CmpEq32x4, - CmpEq64x2, - CmpHi32x4, - CmpHi64x2, - CmpHiEq32x4, - CmpHiEq64x2, -} - -/// Internal type FPUOp1: defined at src/isa/s390x/inst.isle line 1325. -#[derive(Copy, Clone, PartialEq, Eq, Debug)] -pub enum FPUOp1 { - Abs32, - Abs64, - Abs32x4, - Abs64x2, - Neg32, - Neg64, - Neg32x4, - Neg64x2, - NegAbs32, - NegAbs64, - NegAbs32x4, - NegAbs64x2, - Sqrt32, - Sqrt64, - Sqrt32x4, - Sqrt64x2, - Cvt32To64, - Cvt32x4To64x2, -} - -/// Internal type FPUOp2: defined at src/isa/s390x/inst.isle line 1348. -#[derive(Copy, Clone, PartialEq, Eq, Debug)] -pub enum FPUOp2 { - Add32, - Add64, - Add32x4, - Add64x2, - Sub32, - Sub64, - Sub32x4, - Sub64x2, - Mul32, - Mul64, - Mul32x4, - Mul64x2, - Div32, - Div64, - Div32x4, - Div64x2, - Max32, - Max64, - Max32x4, - Max64x2, - Min32, - Min64, - Min32x4, - Min64x2, - MaxPseudo32, - MaxPseudo64, - MaxPseudo32x4, - MaxPseudo64x2, - MinPseudo32, - MinPseudo64, - MinPseudo32x4, - MinPseudo64x2, -} - -/// Internal type FPUOp3: defined at src/isa/s390x/inst.isle line 1385. -#[derive(Copy, Clone, PartialEq, Eq, Debug)] -pub enum FPUOp3 { - MAdd32, - MAdd64, - MAdd32x4, - MAdd64x2, - MSub32, - MSub64, - MSub32x4, - MSub64x2, -} - -/// Internal type FpuRoundOp: defined at src/isa/s390x/inst.isle line 1398. -#[derive(Copy, Clone, PartialEq, Eq, Debug)] -pub enum FpuRoundOp { - Cvt64To32, - Cvt64x2To32x4, - Round32, - Round64, - Round32x4, - Round64x2, - ToSInt32, - ToSInt64, - ToUInt32, - ToUInt64, - ToSInt32x4, - ToSInt64x2, - ToUInt32x4, - ToUInt64x2, - FromSInt32, - FromSInt64, - FromUInt32, - FromUInt64, - FromSInt32x4, - FromSInt64x2, - FromUInt32x4, - FromUInt64x2, -} - -/// Internal type FpuRoundMode: defined at src/isa/s390x/inst.isle line 1425. -#[derive(Copy, Clone, PartialEq, Eq, Debug)] -pub enum FpuRoundMode { - Current, - ToNearest, - ShorterPrecision, - ToNearestTiesToEven, - ToZero, - ToPosInfinity, - ToNegInfinity, -} - -/// Internal type LaneOrder: defined at src/isa/s390x/inst.isle line 1470. -#[derive(Copy, Clone, PartialEq, Eq, Debug)] -pub enum LaneOrder { - LittleEndian, - BigEndian, -} - -/// Internal type ProducesBool: defined at src/isa/s390x/inst.isle line 3350. -#[derive(Clone, Debug)] -pub enum ProducesBool { - ProducesBool { producer: ProducesFlags, cond: Cond }, -} - -// Generated as internal constructor for term output_reg. -pub fn constructor_output_reg(ctx: &mut C, arg0: Reg) -> InstOutput { - let pattern0_0 = arg0; - // Rule at src/prelude_lower.isle line 55. - let expr0_0 = C::value_reg(ctx, pattern0_0); - let expr1_0 = C::output(ctx, expr0_0); - return expr1_0; -} - -// Generated as internal constructor for term output_value. -pub fn constructor_output_value(ctx: &mut C, arg0: Value) -> InstOutput { - let pattern0_0 = arg0; - // Rule at src/prelude_lower.isle line 59. - let expr0_0 = C::put_in_regs(ctx, pattern0_0); - let expr1_0 = C::output(ctx, expr0_0); - return expr1_0; -} - -// Generated as internal constructor for term temp_reg. -pub fn constructor_temp_reg(ctx: &mut C, arg0: Type) -> Reg { - let pattern0_0 = arg0; - // Rule at src/prelude_lower.isle line 79. - let expr0_0 = C::temp_writable_reg(ctx, pattern0_0); - let expr1_0 = C::writable_reg_to_reg(ctx, expr0_0); - return expr1_0; -} - -// Generated as internal constructor for term value_regs_range. -pub fn constructor_value_regs_range(ctx: &mut C, arg0: ValueRegs) -> Range { - let pattern0_0 = arg0; - // Rule at src/prelude_lower.isle line 128. - let expr0_0: usize = 0i128 as usize; - let expr1_0 = C::value_regs_len(ctx, pattern0_0); - let expr2_0 = C::range(ctx, expr0_0, expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term lo_reg. -pub fn constructor_lo_reg(ctx: &mut C, arg0: Value) -> Reg { - let pattern0_0 = arg0; - // Rule at src/prelude_lower.isle line 139. - let expr0_0 = C::put_in_regs(ctx, pattern0_0); - let expr1_0: usize = 0i128 as usize; - let expr2_0 = C::value_regs_get(ctx, expr0_0, expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term emit_side_effect. -pub fn constructor_emit_side_effect(ctx: &mut C, arg0: &SideEffectNoResult) -> Unit { - let pattern0_0 = arg0; - match pattern0_0 { - &SideEffectNoResult::Inst { - inst: ref pattern1_0, - } => { - // Rule at src/prelude_lower.isle line 292. - let expr0_0 = C::emit(ctx, pattern1_0); - return expr0_0; - } - &SideEffectNoResult::Inst2 { - inst1: ref pattern1_0, - inst2: ref pattern1_1, - } => { - // Rule at src/prelude_lower.isle line 294. - let expr0_0 = C::emit(ctx, pattern1_0); - let expr1_0 = C::emit(ctx, pattern1_1); - return expr1_0; - } - &SideEffectNoResult::Inst3 { - inst1: ref pattern1_0, - inst2: ref pattern1_1, - inst3: ref pattern1_2, - } => { - // Rule at src/prelude_lower.isle line 297. - let expr0_0 = C::emit(ctx, pattern1_0); - let expr1_0 = C::emit(ctx, pattern1_1); - let expr2_0 = C::emit(ctx, pattern1_2); - return expr2_0; - } - _ => {} - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "emit_side_effect", "src/prelude_lower.isle line 291" - ); -} - -// Generated as internal constructor for term side_effect. -pub fn constructor_side_effect(ctx: &mut C, arg0: &SideEffectNoResult) -> InstOutput { - let pattern0_0 = arg0; - // Rule at src/prelude_lower.isle line 305. - let expr0_0 = constructor_emit_side_effect(ctx, pattern0_0); - let expr1_0 = C::output_none(ctx); - return expr1_0; -} - -// Generated as internal constructor for term side_effect_concat. -pub fn constructor_side_effect_concat( - ctx: &mut C, - arg0: &SideEffectNoResult, - arg1: &SideEffectNoResult, -) -> SideEffectNoResult { - let pattern0_0 = arg0; - match pattern0_0 { - &SideEffectNoResult::Inst { - inst: ref pattern1_0, - } => { - let pattern2_0 = arg1; - match pattern2_0 { - &SideEffectNoResult::Inst { - inst: ref pattern3_0, - } => { - // Rule at src/prelude_lower.isle line 310. - let expr0_0 = SideEffectNoResult::Inst2 { - inst1: pattern1_0.clone(), - inst2: pattern3_0.clone(), - }; - return expr0_0; - } - &SideEffectNoResult::Inst2 { - inst1: ref pattern3_0, - inst2: ref pattern3_1, - } => { - // Rule at src/prelude_lower.isle line 312. - let expr0_0 = SideEffectNoResult::Inst3 { - inst1: pattern1_0.clone(), - inst2: pattern3_0.clone(), - inst3: pattern3_1.clone(), - }; - return expr0_0; - } - _ => {} - } - } - &SideEffectNoResult::Inst2 { - inst1: ref pattern1_0, - inst2: ref pattern1_1, - } => { - let pattern2_0 = arg1; - if let &SideEffectNoResult::Inst { - inst: ref pattern3_0, - } = pattern2_0 - { - // Rule at src/prelude_lower.isle line 314. - let expr0_0 = SideEffectNoResult::Inst3 { - inst1: pattern1_0.clone(), - inst2: pattern1_1.clone(), - inst3: pattern3_0.clone(), - }; - return expr0_0; - } - } - _ => {} - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "side_effect_concat", "src/prelude_lower.isle line 309" - ); -} - -// Generated as internal constructor for term produces_flags_append. -pub fn constructor_produces_flags_append( - ctx: &mut C, - arg0: &ProducesFlags, - arg1: &MInst, -) -> ProducesFlags { - let pattern0_0 = arg0; - if let &ProducesFlags::ProducesFlagsSideEffect { - inst: ref pattern1_0, - } = pattern0_0 - { - let pattern2_0 = arg1; - // Rule at src/prelude_lower.isle line 339. - let expr0_0 = ProducesFlags::ProducesFlagsTwiceSideEffect { - inst1: pattern1_0.clone(), - inst2: pattern2_0.clone(), - }; - return expr0_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "produces_flags_append", "src/prelude_lower.isle line 338" - ); -} - -// Generated as internal constructor for term produces_flags_get_reg. -pub fn constructor_produces_flags_get_reg(ctx: &mut C, arg0: &ProducesFlags) -> Reg { - let pattern0_0 = arg0; - if let &ProducesFlags::ProducesFlagsReturnsReg { - inst: ref pattern1_0, - result: pattern1_1, - } = pattern0_0 - { - // Rule at src/prelude_lower.isle line 364. - return pattern1_1; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "produces_flags_get_reg", "src/prelude_lower.isle line 363" - ); -} - -// Generated as internal constructor for term produces_flags_ignore. -pub fn constructor_produces_flags_ignore( - ctx: &mut C, - arg0: &ProducesFlags, -) -> ProducesFlags { - let pattern0_0 = arg0; - match pattern0_0 { - &ProducesFlags::ProducesFlagsReturnsReg { - inst: ref pattern1_0, - result: pattern1_1, - } => { - // Rule at src/prelude_lower.isle line 369. - let expr0_0 = ProducesFlags::ProducesFlagsSideEffect { - inst: pattern1_0.clone(), - }; - return expr0_0; - } - &ProducesFlags::ProducesFlagsReturnsResultWithConsumer { - inst: ref pattern1_0, - result: pattern1_1, - } => { - // Rule at src/prelude_lower.isle line 371. - let expr0_0 = ProducesFlags::ProducesFlagsSideEffect { - inst: pattern1_0.clone(), - }; - return expr0_0; - } - _ => {} - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "produces_flags_ignore", "src/prelude_lower.isle line 368" - ); -} - -// Generated as internal constructor for term consumes_flags_concat. -pub fn constructor_consumes_flags_concat( - ctx: &mut C, - arg0: &ConsumesFlags, - arg1: &ConsumesFlags, -) -> ConsumesFlags { - let pattern0_0 = arg0; - match pattern0_0 { - &ConsumesFlags::ConsumesFlagsSideEffect { - inst: ref pattern1_0, - } => { - let pattern2_0 = arg1; - if let &ConsumesFlags::ConsumesFlagsSideEffect { - inst: ref pattern3_0, - } = pattern2_0 - { - // Rule at src/prelude_lower.isle line 384. - let expr0_0 = ConsumesFlags::ConsumesFlagsSideEffect2 { - inst1: pattern1_0.clone(), - inst2: pattern3_0.clone(), - }; - return expr0_0; - } - } - &ConsumesFlags::ConsumesFlagsReturnsReg { - inst: ref pattern1_0, - result: pattern1_1, - } => { - let pattern2_0 = arg1; - if let &ConsumesFlags::ConsumesFlagsReturnsReg { - inst: ref pattern3_0, - result: pattern3_1, - } = pattern2_0 - { - // Rule at src/prelude_lower.isle line 378. - let expr0_0 = C::value_regs(ctx, pattern1_1, pattern3_1); - let expr1_0 = ConsumesFlags::ConsumesFlagsTwiceReturnsValueRegs { - inst1: pattern1_0.clone(), - inst2: pattern3_0.clone(), - result: expr0_0, - }; - return expr1_0; - } - } - _ => {} - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "consumes_flags_concat", "src/prelude_lower.isle line 377" - ); -} - -// Generated as internal constructor for term with_flags. -pub fn constructor_with_flags( - ctx: &mut C, - arg0: &ProducesFlags, - arg1: &ConsumesFlags, -) -> ValueRegs { - let pattern0_0 = arg0; - match pattern0_0 { - &ProducesFlags::ProducesFlagsSideEffect { - inst: ref pattern1_0, - } => { - let pattern2_0 = arg1; - match pattern2_0 { - &ConsumesFlags::ConsumesFlagsReturnsReg { - inst: ref pattern3_0, - result: pattern3_1, - } => { - // Rule at src/prelude_lower.isle line 415. - let expr0_0 = C::emit(ctx, pattern1_0); - let expr1_0 = C::emit(ctx, pattern3_0); - let expr2_0 = C::value_reg(ctx, pattern3_1); - return expr2_0; - } - &ConsumesFlags::ConsumesFlagsTwiceReturnsValueRegs { - inst1: ref pattern3_0, - inst2: ref pattern3_1, - result: pattern3_2, - } => { - // Rule at src/prelude_lower.isle line 421. - let expr0_0 = C::emit(ctx, pattern1_0); - let expr1_0 = C::emit(ctx, pattern3_0); - let expr2_0 = C::emit(ctx, pattern3_1); - return pattern3_2; - } - &ConsumesFlags::ConsumesFlagsFourTimesReturnsValueRegs { - inst1: ref pattern3_0, - inst2: ref pattern3_1, - inst3: ref pattern3_2, - inst4: ref pattern3_3, - result: pattern3_4, - } => { - // Rule at src/prelude_lower.isle line 433. - let expr0_0 = C::emit(ctx, pattern1_0); - let expr1_0 = C::emit(ctx, pattern3_0); - let expr2_0 = C::emit(ctx, pattern3_1); - let expr3_0 = C::emit(ctx, pattern3_2); - let expr4_0 = C::emit(ctx, pattern3_3); - return pattern3_4; - } - _ => {} - } - } - &ProducesFlags::ProducesFlagsReturnsResultWithConsumer { - inst: ref pattern1_0, - result: pattern1_1, - } => { - let pattern2_0 = arg1; - match pattern2_0 { - &ConsumesFlags::ConsumesFlagsSideEffect { - inst: ref pattern3_0, - } => { - // Rule at src/prelude_lower.isle line 409. - let expr0_0 = C::emit(ctx, pattern1_0); - let expr1_0 = C::emit(ctx, pattern3_0); - let expr2_0 = C::value_reg(ctx, pattern1_1); - return expr2_0; - } - &ConsumesFlags::ConsumesFlagsReturnsResultWithProducer { - inst: ref pattern3_0, - result: pattern3_1, - } => { - // Rule at src/prelude_lower.isle line 401. - let expr0_0 = C::emit(ctx, pattern1_0); - let expr1_0 = C::emit(ctx, pattern3_0); - let expr2_0 = C::value_regs(ctx, pattern1_1, pattern3_1); - return expr2_0; - } - _ => {} - } - } - &ProducesFlags::ProducesFlagsTwiceSideEffect { - inst1: ref pattern1_0, - inst2: ref pattern1_1, - } => { - let pattern2_0 = arg1; - match pattern2_0 { - &ConsumesFlags::ConsumesFlagsReturnsReg { - inst: ref pattern3_0, - result: pattern3_1, - } => { - // Rule at src/prelude_lower.isle line 449. - let expr0_0 = C::emit(ctx, pattern1_0); - let expr1_0 = C::emit(ctx, pattern1_1); - let expr2_0 = C::emit(ctx, pattern3_0); - let expr3_0 = C::value_reg(ctx, pattern3_1); - return expr3_0; - } - &ConsumesFlags::ConsumesFlagsTwiceReturnsValueRegs { - inst1: ref pattern3_0, - inst2: ref pattern3_1, - result: pattern3_2, - } => { - // Rule at src/prelude_lower.isle line 456. - let expr0_0 = C::emit(ctx, pattern1_0); - let expr1_0 = C::emit(ctx, pattern1_1); - let expr2_0 = C::emit(ctx, pattern3_0); - let expr3_0 = C::emit(ctx, pattern3_1); - return pattern3_2; - } - &ConsumesFlags::ConsumesFlagsFourTimesReturnsValueRegs { - inst1: ref pattern3_0, - inst2: ref pattern3_1, - inst3: ref pattern3_2, - inst4: ref pattern3_3, - result: pattern3_4, - } => { - // Rule at src/prelude_lower.isle line 469. - let expr0_0 = C::emit(ctx, pattern1_0); - let expr1_0 = C::emit(ctx, pattern1_1); - let expr2_0 = C::emit(ctx, pattern3_0); - let expr3_0 = C::emit(ctx, pattern3_1); - let expr4_0 = C::emit(ctx, pattern3_2); - let expr5_0 = C::emit(ctx, pattern3_3); - return pattern3_4; - } - _ => {} - } - } - _ => {} - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "with_flags", "src/prelude_lower.isle line 399" - ); -} - -// Generated as internal constructor for term with_flags_reg. -pub fn constructor_with_flags_reg( - ctx: &mut C, - arg0: &ProducesFlags, - arg1: &ConsumesFlags, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/prelude_lower.isle line 487. - let expr0_0 = constructor_with_flags(ctx, pattern0_0, pattern1_0); - let expr1_0: usize = 0i128 as usize; - let expr2_0 = C::value_regs_get(ctx, expr0_0, expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term flags_to_producesflags. -pub fn constructor_flags_to_producesflags(ctx: &mut C, arg0: Value) -> ProducesFlags { - let pattern0_0 = arg0; - // Rule at src/prelude_lower.isle line 494. - let expr0_0 = C::mark_value_used(ctx, pattern0_0); - let expr1_0 = ProducesFlags::AlreadyExistingFlags; - return expr1_0; -} - -// Generated as internal constructor for term with_flags_side_effect. -pub fn constructor_with_flags_side_effect( - ctx: &mut C, - arg0: &ProducesFlags, - arg1: &ConsumesFlags, -) -> SideEffectNoResult { - let pattern0_0 = arg0; - match pattern0_0 { - &ProducesFlags::AlreadyExistingFlags => { - let pattern2_0 = arg1; - match pattern2_0 { - &ConsumesFlags::ConsumesFlagsSideEffect { - inst: ref pattern3_0, - } => { - // Rule at src/prelude_lower.isle line 505. - let expr0_0 = SideEffectNoResult::Inst { - inst: pattern3_0.clone(), - }; - return expr0_0; - } - &ConsumesFlags::ConsumesFlagsSideEffect2 { - inst1: ref pattern3_0, - inst2: ref pattern3_1, - } => { - // Rule at src/prelude_lower.isle line 510. - let expr0_0 = SideEffectNoResult::Inst2 { - inst1: pattern3_0.clone(), - inst2: pattern3_1.clone(), - }; - return expr0_0; - } - _ => {} - } - } - &ProducesFlags::ProducesFlagsSideEffect { - inst: ref pattern1_0, - } => { - let pattern2_0 = arg1; - match pattern2_0 { - &ConsumesFlags::ConsumesFlagsSideEffect { - inst: ref pattern3_0, - } => { - // Rule at src/prelude_lower.isle line 515. - let expr0_0 = SideEffectNoResult::Inst2 { - inst1: pattern1_0.clone(), - inst2: pattern3_0.clone(), - }; - return expr0_0; - } - &ConsumesFlags::ConsumesFlagsSideEffect2 { - inst1: ref pattern3_0, - inst2: ref pattern3_1, - } => { - // Rule at src/prelude_lower.isle line 520. - let expr0_0 = SideEffectNoResult::Inst3 { - inst1: pattern1_0.clone(), - inst2: pattern3_0.clone(), - inst3: pattern3_1.clone(), - }; - return expr0_0; - } - _ => {} - } - } - &ProducesFlags::ProducesFlagsTwiceSideEffect { - inst1: ref pattern1_0, - inst2: ref pattern1_1, - } => { - let pattern2_0 = arg1; - if let &ConsumesFlags::ConsumesFlagsSideEffect { - inst: ref pattern3_0, - } = pattern2_0 - { - // Rule at src/prelude_lower.isle line 525. - let expr0_0 = SideEffectNoResult::Inst3 { - inst1: pattern1_0.clone(), - inst2: pattern1_1.clone(), - inst3: pattern3_0.clone(), - }; - return expr0_0; - } - } - _ => {} - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "with_flags_side_effect", "src/prelude_lower.isle line 503" - ); -} - -// Generated as internal constructor for term lower_return. -pub fn constructor_lower_return( - ctx: &mut C, - arg0: Range, - arg1: ValueSlice, -) -> InstOutput { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/prelude_lower.isle line 705. - let expr0_0 = C::gen_return(ctx, pattern1_0); - let expr1_0 = C::output_none(ctx); - return expr1_0; -} - -// Generated as internal constructor for term lane_order_equal. -pub fn constructor_lane_order_equal( - ctx: &mut C, - arg0: &LaneOrder, - arg1: &LaneOrder, -) -> bool { - let pattern0_0 = arg0; - match pattern0_0 { - &LaneOrder::LittleEndian => { - let pattern2_0 = arg1; - match pattern2_0 { - &LaneOrder::LittleEndian => { - // Rule at src/isa/s390x/inst.isle line 1484. - let expr0_0: bool = true; - return expr0_0; - } - &LaneOrder::BigEndian => { - // Rule at src/isa/s390x/inst.isle line 1485. - let expr0_0: bool = false; - return expr0_0; - } - _ => {} - } - } - &LaneOrder::BigEndian => { - let pattern2_0 = arg1; - match pattern2_0 { - &LaneOrder::LittleEndian => { - // Rule at src/isa/s390x/inst.isle line 1486. - let expr0_0: bool = false; - return expr0_0; - } - &LaneOrder::BigEndian => { - // Rule at src/isa/s390x/inst.isle line 1487. - let expr0_0: bool = true; - return expr0_0; - } - _ => {} - } - } - _ => {} - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "lane_order_equal", "src/isa/s390x/inst.isle line 1483" - ); -} - -// Generated as internal constructor for term lane_order_from_memflags. -pub fn constructor_lane_order_from_memflags(ctx: &mut C, arg0: MemFlags) -> LaneOrder { - let pattern0_0 = arg0; - if let Some(()) = C::bigendian(ctx, pattern0_0) { - // Rule at src/isa/s390x/inst.isle line 1492. - let expr0_0 = LaneOrder::BigEndian; - return expr0_0; - } - let pattern0_0 = arg0; - if let Some(()) = C::littleendian(ctx, pattern0_0) { - // Rule at src/isa/s390x/inst.isle line 1491. - let expr0_0 = LaneOrder::LittleEndian; - return expr0_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "lane_order_from_memflags", "src/isa/s390x/inst.isle line 1490" - ); -} - -// Generated as internal constructor for term i64_nonzero. -pub fn constructor_i64_nonzero(ctx: &mut C, arg0: i64) -> Option { - let pattern0_0 = arg0; - let mut closure1 = || { - let expr0_0: i64 = 0i128 as i64; - let expr1_0 = C::i64_nonequal(ctx, pattern0_0, expr0_0)?; - return Some(expr1_0); - }; - if let Some(pattern1_0) = closure1() { - // Rule at src/isa/s390x/inst.isle line 1544. - return Some(pattern0_0); - } - return None; -} - -// Generated as internal constructor for term i64_not_neg1. -pub fn constructor_i64_not_neg1(ctx: &mut C, arg0: i64) -> Option { - let pattern0_0 = arg0; - let mut closure1 = || { - let expr0_0: i64 = -1i128 as i64; - let expr1_0 = C::i64_nonequal(ctx, pattern0_0, expr0_0)?; - return Some(expr1_0); - }; - if let Some(pattern1_0) = closure1() { - // Rule at src/isa/s390x/inst.isle line 1549. - return Some(pattern0_0); - } - return None; -} - -// Generated as internal constructor for term imm8x16. -pub fn constructor_imm8x16( - ctx: &mut C, - arg0: u8, - arg1: u8, - arg2: u8, - arg3: u8, - arg4: u8, - arg5: u8, - arg6: u8, - arg7: u8, - arg8: u8, - arg9: u8, - arg10: u8, - arg11: u8, - arg12: u8, - arg13: u8, - arg14: u8, - arg15: u8, -) -> u128 { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - let pattern4_0 = arg4; - let pattern5_0 = arg5; - let pattern6_0 = arg6; - let pattern7_0 = arg7; - let pattern8_0 = arg8; - let pattern9_0 = arg9; - let pattern10_0 = arg10; - let pattern11_0 = arg11; - let pattern12_0 = arg12; - let pattern13_0 = arg13; - let pattern14_0 = arg14; - let pattern15_0 = arg15; - // Rule at src/isa/s390x/inst.isle line 1588. - let expr0_0 = C::u8_pair_concat(ctx, pattern0_0, pattern1_0); - let expr1_0 = C::u8_pair_concat(ctx, pattern2_0, pattern3_0); - let expr2_0 = C::u16_pair_concat(ctx, expr0_0, expr1_0); - let expr3_0 = C::u8_pair_concat(ctx, pattern4_0, pattern5_0); - let expr4_0 = C::u8_pair_concat(ctx, pattern6_0, pattern7_0); - let expr5_0 = C::u16_pair_concat(ctx, expr3_0, expr4_0); - let expr6_0 = C::u32_pair_concat(ctx, expr2_0, expr5_0); - let expr7_0 = C::u8_pair_concat(ctx, pattern8_0, pattern9_0); - let expr8_0 = C::u8_pair_concat(ctx, pattern10_0, pattern11_0); - let expr9_0 = C::u16_pair_concat(ctx, expr7_0, expr8_0); - let expr10_0 = C::u8_pair_concat(ctx, pattern12_0, pattern13_0); - let expr11_0 = C::u8_pair_concat(ctx, pattern14_0, pattern15_0); - let expr12_0 = C::u16_pair_concat(ctx, expr10_0, expr11_0); - let expr13_0 = C::u32_pair_concat(ctx, expr9_0, expr12_0); - let expr14_0 = C::u64_pair_concat(ctx, expr6_0, expr13_0); - return expr14_0; -} - -// Generated as internal constructor for term mask_amt_reg. -pub fn constructor_mask_amt_reg(ctx: &mut C, arg0: Type, arg1: Reg) -> Reg { - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::gpr64_ty(ctx, pattern0_0) { - let pattern2_0 = arg1; - // Rule at src/isa/s390x/inst.isle line 1700. - return pattern2_0; - } - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::gpr32_ty(ctx, pattern0_0) { - let pattern2_0 = arg1; - // Rule at src/isa/s390x/inst.isle line 1697. - let expr0_0: i64 = -1i128 as i64; - let expr1_0 = C::mask_amt_imm(ctx, pattern1_0, expr0_0); - let expr2_0 = C::u8_as_u16(ctx, expr1_0); - let expr3_0: u8 = 0i128 as u8; - let expr4_0 = C::uimm16shifted(ctx, expr2_0, expr3_0); - let expr5_0 = constructor_and_uimm16shifted(ctx, pattern1_0, pattern2_0, expr4_0); - return expr5_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "mask_amt_reg", "src/isa/s390x/inst.isle line 1696" - ); -} - -// Generated as internal constructor for term amt_reg. -pub fn constructor_amt_reg(ctx: &mut C, arg0: Value) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = C::value_type(ctx, pattern0_0); - if let Some(pattern2_0) = C::fits_in_64(ctx, pattern1_0) { - // Rule at src/isa/s390x/inst.isle line 1704. - let expr0_0 = C::put_in_reg(ctx, pattern0_0); - return expr0_0; - } - let pattern0_0 = arg0; - let pattern1_0 = C::value_type(ctx, pattern0_0); - if let Some(pattern2_0) = C::vr128_ty(ctx, pattern1_0) { - // Rule at src/isa/s390x/inst.isle line 1705. - let expr0_0: Type = I64X2; - let expr1_0 = C::put_in_reg(ctx, pattern0_0); - let expr2_0: u8 = 1i128 as u8; - let expr3_0 = C::zero_reg(ctx); - let expr4_0 = constructor_vec_extract_lane(ctx, expr0_0, expr1_0, expr2_0, expr3_0); - return expr4_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "amt_reg", "src/isa/s390x/inst.isle line 1703" - ); -} - -// Generated as internal constructor for term amt_vr. -pub fn constructor_amt_vr(ctx: &mut C, arg0: Value) -> Reg { - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::u64_from_value(ctx, pattern0_0) { - // Rule at src/isa/s390x/inst.isle line 1715. - let expr0_0: Type = I8X16; - let expr1_0 = constructor_vec_imm_splat(ctx, expr0_0, pattern1_0); - return expr1_0; - } - let pattern0_0 = arg0; - let pattern1_0 = C::value_type(ctx, pattern0_0); - if let Some(pattern2_0) = C::vr128_ty(ctx, pattern1_0) { - // Rule at src/isa/s390x/inst.isle line 1713. - let expr0_0: Type = I8X16; - let expr1_0 = C::put_in_reg(ctx, pattern0_0); - let expr2_0: u8 = 15i128 as u8; - let expr3_0 = constructor_vec_replicate_lane(ctx, expr0_0, expr1_0, expr2_0); - return expr3_0; - } - let pattern0_0 = arg0; - let pattern1_0 = C::value_type(ctx, pattern0_0); - if let Some(pattern2_0) = C::fits_in_64(ctx, pattern1_0) { - // Rule at src/isa/s390x/inst.isle line 1710. - let expr0_0: Type = I8X16; - let expr1_0: Type = I8X16; - let expr2_0 = C::put_in_reg(ctx, pattern0_0); - let expr3_0: u8 = 0i128 as u8; - let expr4_0 = C::zero_reg(ctx); - let expr5_0 = constructor_vec_insert_lane_undef(ctx, expr1_0, expr2_0, expr3_0, expr4_0); - let expr6_0: u8 = 0i128 as u8; - let expr7_0 = constructor_vec_replicate_lane(ctx, expr0_0, expr5_0, expr6_0); - return expr7_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "amt_vr", "src/isa/s390x/inst.isle line 1709" - ); -} - -// Generated as internal constructor for term memarg_symbol_offset. -pub fn constructor_memarg_symbol_offset(ctx: &mut C, arg0: i64) -> Option { - let pattern0_0 = arg0; - // Rule at src/isa/s390x/inst.isle line 1807. - let expr0_0: i64 = 0i128 as i64; - let expr1_0 = C::memarg_symbol_offset_sum(ctx, pattern0_0, expr0_0)?; - return Some(expr1_0); -} - -// Generated as internal constructor for term lower_address. -pub fn constructor_lower_address( - ctx: &mut C, - arg0: MemFlags, - arg1: Value, - arg2: Offset32, -) -> MemArg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - if let Some(pattern2_0) = C::def_inst(ctx, pattern1_0) { - let pattern3_0 = C::inst_data(ctx, pattern2_0); - match &pattern3_0 { - &InstructionData::UnaryGlobalValue { - opcode: ref pattern4_0, - global_value: pattern4_1, - } => { - if let &Opcode::SymbolValue = pattern4_0 { - if let Some((pattern6_0, pattern6_1, pattern6_2)) = - C::symbol_value_data(ctx, pattern4_1) - { - if let Some(()) = C::reloc_distance_near(ctx, pattern6_1) { - let pattern8_0 = arg2; - let pattern9_0 = C::i64_from_offset(ctx, pattern8_0); - let mut closure10 = || { - let expr0_0 = - C::memarg_symbol_offset_sum(ctx, pattern9_0, pattern6_2)?; - return Some(expr0_0); - }; - if let Some(pattern10_0) = closure10() { - // Rule at src/isa/s390x/inst.isle line 1820. - let expr0_0 = - C::memarg_symbol(ctx, pattern6_0, pattern10_0, pattern0_0); - return expr0_0; - } - } - } - } - } - &InstructionData::Binary { - opcode: ref pattern4_0, - args: ref pattern4_1, - } => { - if let &Opcode::Iadd = pattern4_0 { - let (pattern6_0, pattern6_1) = C::unpack_value_array_2(ctx, pattern4_1); - let pattern7_0 = arg2; - let pattern8_0 = C::i64_from_offset(ctx, pattern7_0); - if pattern8_0 == 0i128 as i64 { - // Rule at src/isa/s390x/inst.isle line 1817. - let expr0_0 = C::put_in_reg(ctx, pattern6_0); - let expr1_0 = C::put_in_reg(ctx, pattern6_1); - let expr2_0: u8 = 0i128 as u8; - let expr3_0 = - C::memarg_reg_plus_reg(ctx, expr0_0, expr1_0, expr2_0, pattern0_0); - return expr3_0; - } - } - } - _ => {} - } - } - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = C::i64_from_offset(ctx, pattern2_0); - // Rule at src/isa/s390x/inst.isle line 1814. - let expr0_0 = C::put_in_reg(ctx, pattern1_0); - let expr1_0: u8 = 0i128 as u8; - let expr2_0 = C::memarg_reg_plus_off(ctx, expr0_0, pattern3_0, expr1_0, pattern0_0); - return expr2_0; -} - -// Generated as internal constructor for term lower_address_bias. -pub fn constructor_lower_address_bias( - ctx: &mut C, - arg0: MemFlags, - arg1: Value, - arg2: Offset32, - arg3: u8, -) -> MemArg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - if let Some(pattern2_0) = C::def_inst(ctx, pattern1_0) { - let pattern3_0 = C::inst_data(ctx, pattern2_0); - if let &InstructionData::Binary { - opcode: ref pattern4_0, - args: ref pattern4_1, - } = &pattern3_0 - { - if let &Opcode::Iadd = pattern4_0 { - let (pattern6_0, pattern6_1) = C::unpack_value_array_2(ctx, pattern4_1); - let pattern7_0 = arg2; - let pattern8_0 = C::i64_from_offset(ctx, pattern7_0); - if pattern8_0 == 0i128 as i64 { - let pattern10_0 = arg3; - // Rule at src/isa/s390x/inst.isle line 1834. - let expr0_0 = C::put_in_reg(ctx, pattern6_0); - let expr1_0 = C::put_in_reg(ctx, pattern6_1); - let expr2_0 = - C::memarg_reg_plus_reg(ctx, expr0_0, expr1_0, pattern10_0, pattern0_0); - return expr2_0; - } - } - } - } - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = C::i64_from_offset(ctx, pattern2_0); - let pattern4_0 = arg3; - // Rule at src/isa/s390x/inst.isle line 1831. - let expr0_0 = C::put_in_reg(ctx, pattern1_0); - let expr1_0 = C::memarg_reg_plus_off(ctx, expr0_0, pattern3_0, pattern4_0, pattern0_0); - return expr1_0; -} - -// Generated as internal constructor for term load_sym. -pub fn constructor_load_sym(ctx: &mut C, arg0: Inst) -> Option { - let pattern0_0 = arg0; - let mut closure1 = || { - return Some(pattern0_0); - }; - if let Some(pattern1_0) = closure1() { - let pattern2_0 = C::inst_data(ctx, pattern1_0); - if let &InstructionData::Load { - opcode: ref pattern3_0, - arg: pattern3_1, - flags: pattern3_2, - offset: pattern3_3, - } = &pattern2_0 - { - if let &Opcode::Load = pattern3_0 { - if let Some(pattern5_0) = C::def_inst(ctx, pattern3_1) { - let pattern6_0 = C::inst_data(ctx, pattern5_0); - if let &InstructionData::UnaryGlobalValue { - opcode: ref pattern7_0, - global_value: pattern7_1, - } = &pattern6_0 - { - if let &Opcode::SymbolValue = pattern7_0 { - if let Some((pattern9_0, pattern9_1, pattern9_2)) = - C::symbol_value_data(ctx, pattern7_1) - { - if let Some(()) = C::reloc_distance_near(ctx, pattern9_1) { - let pattern11_0 = C::i64_from_offset(ctx, pattern3_3); - let mut closure12 = || { - let expr0_0 = C::memarg_symbol_offset_sum( - ctx, - pattern9_2, - pattern11_0, - )?; - return Some(expr0_0); - }; - if let Some(pattern12_0) = closure12() { - // Rule at src/isa/s390x/inst.isle line 1841. - return Some(pattern0_0); - } - } - } - } - } - } - } - } - } - return None; -} - -// Generated as internal constructor for term uload16_sym. -pub fn constructor_uload16_sym(ctx: &mut C, arg0: Inst) -> Option { - let pattern0_0 = arg0; - let mut closure1 = || { - return Some(pattern0_0); - }; - if let Some(pattern1_0) = closure1() { - let pattern2_0 = C::inst_data(ctx, pattern1_0); - if let &InstructionData::Load { - opcode: ref pattern3_0, - arg: pattern3_1, - flags: pattern3_2, - offset: pattern3_3, - } = &pattern2_0 - { - if let &Opcode::Uload16 = pattern3_0 { - if let Some(pattern5_0) = C::def_inst(ctx, pattern3_1) { - let pattern6_0 = C::inst_data(ctx, pattern5_0); - if let &InstructionData::UnaryGlobalValue { - opcode: ref pattern7_0, - global_value: pattern7_1, - } = &pattern6_0 - { - if let &Opcode::SymbolValue = pattern7_0 { - if let Some((pattern9_0, pattern9_1, pattern9_2)) = - C::symbol_value_data(ctx, pattern7_1) - { - if let Some(()) = C::reloc_distance_near(ctx, pattern9_1) { - let pattern11_0 = C::i64_from_offset(ctx, pattern3_3); - let mut closure12 = || { - let expr0_0 = C::memarg_symbol_offset_sum( - ctx, - pattern9_2, - pattern11_0, - )?; - return Some(expr0_0); - }; - if let Some(pattern12_0) = closure12() { - // Rule at src/isa/s390x/inst.isle line 1849. - return Some(pattern0_0); - } - } - } - } - } - } - } - } - } - return None; -} - -// Generated as internal constructor for term memarg_pair. -pub fn constructor_memarg_pair(ctx: &mut C, arg0: &MemArg) -> MemArgPair { - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::memarg_pair_from_memarg(ctx, pattern0_0) { - // Rule at src/isa/s390x/inst.isle line 1863. - return pattern1_0; - } - let pattern0_0 = arg0; - // Rule at src/isa/s390x/inst.isle line 1864. - let expr0_0 = constructor_load_addr(ctx, pattern0_0); - let expr1_0 = C::memarg_flags(ctx, pattern0_0); - let expr2_0 = C::memarg_pair_from_reg(ctx, expr0_0, expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term stack_addr_impl. -pub fn constructor_stack_addr_impl( - ctx: &mut C, - arg0: Type, - arg1: StackSlot, - arg2: Offset32, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 1879. - let expr0_0 = C::temp_writable_reg(ctx, pattern0_0); - let expr1_0 = C::abi_stackslot_addr(ctx, expr0_0, pattern1_0, pattern2_0); - let expr2_0 = C::emit(ctx, &expr1_0); - let expr3_0 = C::writable_reg_to_reg(ctx, expr0_0); - return expr3_0; -} - -// Generated as internal constructor for term sink_load. -pub fn constructor_sink_load(ctx: &mut C, arg0: Inst) -> MemArg { - let pattern0_0 = arg0; - let pattern1_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Load { - opcode: ref pattern2_0, - arg: pattern2_1, - flags: pattern2_2, - offset: pattern2_3, - } = &pattern1_0 - { - if let &Opcode::Load = pattern2_0 { - // Rule at src/isa/s390x/inst.isle line 1945. - let expr0_0 = C::sink_inst(ctx, pattern0_0); - let expr1_0 = constructor_lower_address(ctx, pattern2_2, pattern2_1, pattern2_3); - return expr1_0; - } - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "sink_load", "src/isa/s390x/inst.isle line 1944" - ); -} - -// Generated as internal constructor for term sink_sload16. -pub fn constructor_sink_sload16(ctx: &mut C, arg0: Inst) -> MemArg { - let pattern0_0 = arg0; - let pattern1_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Load { - opcode: ref pattern2_0, - arg: pattern2_1, - flags: pattern2_2, - offset: pattern2_3, - } = &pattern1_0 - { - if let &Opcode::Sload16 = pattern2_0 { - // Rule at src/isa/s390x/inst.isle line 1952. - let expr0_0 = C::sink_inst(ctx, pattern0_0); - let expr1_0 = constructor_lower_address(ctx, pattern2_2, pattern2_1, pattern2_3); - return expr1_0; - } - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "sink_sload16", "src/isa/s390x/inst.isle line 1951" - ); -} - -// Generated as internal constructor for term sink_sload32. -pub fn constructor_sink_sload32(ctx: &mut C, arg0: Inst) -> MemArg { - let pattern0_0 = arg0; - let pattern1_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Load { - opcode: ref pattern2_0, - arg: pattern2_1, - flags: pattern2_2, - offset: pattern2_3, - } = &pattern1_0 - { - if let &Opcode::Sload32 = pattern2_0 { - // Rule at src/isa/s390x/inst.isle line 1959. - let expr0_0 = C::sink_inst(ctx, pattern0_0); - let expr1_0 = constructor_lower_address(ctx, pattern2_2, pattern2_1, pattern2_3); - return expr1_0; - } - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "sink_sload32", "src/isa/s390x/inst.isle line 1958" - ); -} - -// Generated as internal constructor for term sink_uload16. -pub fn constructor_sink_uload16(ctx: &mut C, arg0: Inst) -> MemArg { - let pattern0_0 = arg0; - let pattern1_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Load { - opcode: ref pattern2_0, - arg: pattern2_1, - flags: pattern2_2, - offset: pattern2_3, - } = &pattern1_0 - { - if let &Opcode::Uload16 = pattern2_0 { - // Rule at src/isa/s390x/inst.isle line 1966. - let expr0_0 = C::sink_inst(ctx, pattern0_0); - let expr1_0 = constructor_lower_address(ctx, pattern2_2, pattern2_1, pattern2_3); - return expr1_0; - } - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "sink_uload16", "src/isa/s390x/inst.isle line 1965" - ); -} - -// Generated as internal constructor for term sink_uload32. -pub fn constructor_sink_uload32(ctx: &mut C, arg0: Inst) -> MemArg { - let pattern0_0 = arg0; - let pattern1_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Load { - opcode: ref pattern2_0, - arg: pattern2_1, - flags: pattern2_2, - offset: pattern2_3, - } = &pattern1_0 - { - if let &Opcode::Uload32 = pattern2_0 { - // Rule at src/isa/s390x/inst.isle line 1973. - let expr0_0 = C::sink_inst(ctx, pattern0_0); - let expr1_0 = constructor_lower_address(ctx, pattern2_2, pattern2_1, pattern2_3); - return expr1_0; - } - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "sink_uload32", "src/isa/s390x/inst.isle line 1972" - ); -} - -// Generated as internal constructor for term temp_writable_regpair. -pub fn constructor_temp_writable_regpair(ctx: &mut C) -> WritableRegPair { - // Rule at src/isa/s390x/inst.isle line 1989. - let expr0_0: Type = I64; - let expr1_0 = C::temp_writable_reg(ctx, expr0_0); - let expr2_0: Type = I64; - let expr3_0 = C::temp_writable_reg(ctx, expr2_0); - let expr4_0 = C::writable_regpair(ctx, expr1_0, expr3_0); - return expr4_0; -} - -// Generated as internal constructor for term writable_regpair_to_regpair. -pub fn constructor_writable_regpair_to_regpair( - ctx: &mut C, - arg0: WritableRegPair, -) -> RegPair { - let pattern0_0 = arg0; - // Rule at src/isa/s390x/inst.isle line 2005. - let expr0_0 = C::writable_regpair_hi(ctx, pattern0_0); - let expr1_0 = C::writable_reg_to_reg(ctx, expr0_0); - let expr2_0 = C::writable_regpair_lo(ctx, pattern0_0); - let expr3_0 = C::writable_reg_to_reg(ctx, expr2_0); - let expr4_0 = C::regpair(ctx, expr1_0, expr3_0); - return expr4_0; -} - -// Generated as internal constructor for term alu_rrr. -pub fn constructor_alu_rrr( - ctx: &mut C, - arg0: Type, - arg1: &ALUOp, - arg2: Reg, - arg3: Reg, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - // Rule at src/isa/s390x/inst.isle line 2025. - let expr0_0 = C::temp_writable_reg(ctx, pattern0_0); - let expr1_0 = MInst::AluRRR { - alu_op: pattern1_0.clone(), - rd: expr0_0, - rn: pattern2_0, - rm: pattern3_0, - }; - let expr2_0 = C::emit(ctx, &expr1_0); - let expr3_0 = C::writable_reg_to_reg(ctx, expr0_0); - return expr3_0; -} - -// Generated as internal constructor for term alu_rrr_with_flags_paired. -pub fn constructor_alu_rrr_with_flags_paired( - ctx: &mut C, - arg0: Type, - arg1: &ALUOp, - arg2: Reg, - arg3: Reg, -) -> ProducesFlags { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - // Rule at src/isa/s390x/inst.isle line 2032. - let expr0_0 = C::temp_writable_reg(ctx, pattern0_0); - let expr1_0 = MInst::AluRRR { - alu_op: pattern1_0.clone(), - rd: expr0_0, - rn: pattern2_0, - rm: pattern3_0, - }; - let expr2_0 = C::writable_reg_to_reg(ctx, expr0_0); - let expr3_0 = ProducesFlags::ProducesFlagsReturnsResultWithConsumer { - inst: expr1_0, - result: expr2_0, - }; - return expr3_0; -} - -// Generated as internal constructor for term alu_rrsimm16. -pub fn constructor_alu_rrsimm16( - ctx: &mut C, - arg0: Type, - arg1: &ALUOp, - arg2: Reg, - arg3: i16, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - // Rule at src/isa/s390x/inst.isle line 2039. - let expr0_0 = C::temp_writable_reg(ctx, pattern0_0); - let expr1_0 = MInst::AluRRSImm16 { - alu_op: pattern1_0.clone(), - rd: expr0_0, - rn: pattern2_0, - imm: pattern3_0, - }; - let expr2_0 = C::emit(ctx, &expr1_0); - let expr3_0 = C::writable_reg_to_reg(ctx, expr0_0); - return expr3_0; -} - -// Generated as internal constructor for term alu_rr. -pub fn constructor_alu_rr( - ctx: &mut C, - arg0: Type, - arg1: &ALUOp, - arg2: Reg, - arg3: Reg, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - // Rule at src/isa/s390x/inst.isle line 2046. - let expr0_0 = C::temp_writable_reg(ctx, pattern0_0); - let expr1_0 = MInst::AluRR { - alu_op: pattern1_0.clone(), - rd: expr0_0, - ri: pattern2_0, - rm: pattern3_0, - }; - let expr2_0 = C::emit(ctx, &expr1_0); - let expr3_0 = C::writable_reg_to_reg(ctx, expr0_0); - return expr3_0; -} - -// Generated as internal constructor for term alu_rr_with_flags_paired. -pub fn constructor_alu_rr_with_flags_paired( - ctx: &mut C, - arg0: Type, - arg1: &ALUOp, - arg2: Reg, - arg3: Reg, -) -> ProducesFlags { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - // Rule at src/isa/s390x/inst.isle line 2053. - let expr0_0 = C::temp_writable_reg(ctx, pattern0_0); - let expr1_0 = MInst::AluRR { - alu_op: pattern1_0.clone(), - rd: expr0_0, - ri: pattern2_0, - rm: pattern3_0, - }; - let expr2_0 = C::writable_reg_to_reg(ctx, expr0_0); - let expr3_0 = ProducesFlags::ProducesFlagsReturnsResultWithConsumer { - inst: expr1_0, - result: expr2_0, - }; - return expr3_0; -} - -// Generated as internal constructor for term alu_rx. -pub fn constructor_alu_rx( - ctx: &mut C, - arg0: Type, - arg1: &ALUOp, - arg2: Reg, - arg3: &MemArg, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - // Rule at src/isa/s390x/inst.isle line 2060. - let expr0_0 = C::temp_writable_reg(ctx, pattern0_0); - let expr1_0 = MInst::AluRX { - alu_op: pattern1_0.clone(), - rd: expr0_0, - ri: pattern2_0, - mem: pattern3_0.clone(), - }; - let expr2_0 = C::emit(ctx, &expr1_0); - let expr3_0 = C::writable_reg_to_reg(ctx, expr0_0); - return expr3_0; -} - -// Generated as internal constructor for term alu_rx_with_flags_paired. -pub fn constructor_alu_rx_with_flags_paired( - ctx: &mut C, - arg0: Type, - arg1: &ALUOp, - arg2: Reg, - arg3: &MemArg, -) -> ProducesFlags { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - // Rule at src/isa/s390x/inst.isle line 2067. - let expr0_0 = C::temp_writable_reg(ctx, pattern0_0); - let expr1_0 = MInst::AluRX { - alu_op: pattern1_0.clone(), - rd: expr0_0, - ri: pattern2_0, - mem: pattern3_0.clone(), - }; - let expr2_0 = C::writable_reg_to_reg(ctx, expr0_0); - let expr3_0 = ProducesFlags::ProducesFlagsReturnsResultWithConsumer { - inst: expr1_0, - result: expr2_0, - }; - return expr3_0; -} - -// Generated as internal constructor for term alu_rsimm16. -pub fn constructor_alu_rsimm16( - ctx: &mut C, - arg0: Type, - arg1: &ALUOp, - arg2: Reg, - arg3: i16, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - // Rule at src/isa/s390x/inst.isle line 2074. - let expr0_0 = C::temp_writable_reg(ctx, pattern0_0); - let expr1_0 = MInst::AluRSImm16 { - alu_op: pattern1_0.clone(), - rd: expr0_0, - ri: pattern2_0, - imm: pattern3_0, - }; - let expr2_0 = C::emit(ctx, &expr1_0); - let expr3_0 = C::writable_reg_to_reg(ctx, expr0_0); - return expr3_0; -} - -// Generated as internal constructor for term alu_rsimm32. -pub fn constructor_alu_rsimm32( - ctx: &mut C, - arg0: Type, - arg1: &ALUOp, - arg2: Reg, - arg3: i32, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - // Rule at src/isa/s390x/inst.isle line 2081. - let expr0_0 = C::temp_writable_reg(ctx, pattern0_0); - let expr1_0 = MInst::AluRSImm32 { - alu_op: pattern1_0.clone(), - rd: expr0_0, - ri: pattern2_0, - imm: pattern3_0, - }; - let expr2_0 = C::emit(ctx, &expr1_0); - let expr3_0 = C::writable_reg_to_reg(ctx, expr0_0); - return expr3_0; -} - -// Generated as internal constructor for term alu_ruimm32. -pub fn constructor_alu_ruimm32( - ctx: &mut C, - arg0: Type, - arg1: &ALUOp, - arg2: Reg, - arg3: u32, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - // Rule at src/isa/s390x/inst.isle line 2088. - let expr0_0 = C::temp_writable_reg(ctx, pattern0_0); - let expr1_0 = MInst::AluRUImm32 { - alu_op: pattern1_0.clone(), - rd: expr0_0, - ri: pattern2_0, - imm: pattern3_0, - }; - let expr2_0 = C::emit(ctx, &expr1_0); - let expr3_0 = C::writable_reg_to_reg(ctx, expr0_0); - return expr3_0; -} - -// Generated as internal constructor for term alu_ruimm32_with_flags_paired. -pub fn constructor_alu_ruimm32_with_flags_paired( - ctx: &mut C, - arg0: Type, - arg1: &ALUOp, - arg2: Reg, - arg3: u32, -) -> ProducesFlags { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - // Rule at src/isa/s390x/inst.isle line 2095. - let expr0_0 = C::temp_writable_reg(ctx, pattern0_0); - let expr1_0 = MInst::AluRUImm32 { - alu_op: pattern1_0.clone(), - rd: expr0_0, - ri: pattern2_0, - imm: pattern3_0, - }; - let expr2_0 = C::writable_reg_to_reg(ctx, expr0_0); - let expr3_0 = ProducesFlags::ProducesFlagsReturnsResultWithConsumer { - inst: expr1_0, - result: expr2_0, - }; - return expr3_0; -} - -// Generated as internal constructor for term alu_ruimm16shifted. -pub fn constructor_alu_ruimm16shifted( - ctx: &mut C, - arg0: Type, - arg1: &ALUOp, - arg2: Reg, - arg3: UImm16Shifted, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - // Rule at src/isa/s390x/inst.isle line 2102. - let expr0_0 = C::temp_writable_reg(ctx, pattern0_0); - let expr1_0 = MInst::AluRUImm16Shifted { - alu_op: pattern1_0.clone(), - rd: expr0_0, - ri: pattern2_0, - imm: pattern3_0, - }; - let expr2_0 = C::emit(ctx, &expr1_0); - let expr3_0 = C::writable_reg_to_reg(ctx, expr0_0); - return expr3_0; -} - -// Generated as internal constructor for term alu_ruimm32shifted. -pub fn constructor_alu_ruimm32shifted( - ctx: &mut C, - arg0: Type, - arg1: &ALUOp, - arg2: Reg, - arg3: UImm32Shifted, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - // Rule at src/isa/s390x/inst.isle line 2109. - let expr0_0 = C::temp_writable_reg(ctx, pattern0_0); - let expr1_0 = MInst::AluRUImm32Shifted { - alu_op: pattern1_0.clone(), - rd: expr0_0, - ri: pattern2_0, - imm: pattern3_0, - }; - let expr2_0 = C::emit(ctx, &expr1_0); - let expr3_0 = C::writable_reg_to_reg(ctx, expr0_0); - return expr3_0; -} - -// Generated as internal constructor for term smul_wide. -pub fn constructor_smul_wide(ctx: &mut C, arg0: Reg, arg1: Reg) -> RegPair { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/s390x/inst.isle line 2116. - let expr0_0 = constructor_temp_writable_regpair(ctx); - let expr1_0 = MInst::SMulWide { - rd: expr0_0, - rn: pattern0_0, - rm: pattern1_0, - }; - let expr2_0 = C::emit(ctx, &expr1_0); - let expr3_0 = constructor_writable_regpair_to_regpair(ctx, expr0_0); - return expr3_0; -} - -// Generated as internal constructor for term umul_wide. -pub fn constructor_umul_wide(ctx: &mut C, arg0: Reg, arg1: Reg) -> RegPair { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/s390x/inst.isle line 2123. - let expr0_0 = constructor_temp_writable_regpair(ctx); - let expr1_0 = MInst::UMulWide { - rd: expr0_0, - ri: pattern0_0, - rn: pattern1_0, - }; - let expr2_0 = C::emit(ctx, &expr1_0); - let expr3_0 = constructor_writable_regpair_to_regpair(ctx, expr0_0); - return expr3_0; -} - -// Generated as internal constructor for term sdivmod32. -pub fn constructor_sdivmod32(ctx: &mut C, arg0: Reg, arg1: Reg) -> RegPair { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/s390x/inst.isle line 2130. - let expr0_0 = constructor_temp_writable_regpair(ctx); - let expr1_0 = MInst::SDivMod32 { - rd: expr0_0, - ri: pattern0_0, - rn: pattern1_0, - }; - let expr2_0 = C::emit(ctx, &expr1_0); - let expr3_0 = constructor_writable_regpair_to_regpair(ctx, expr0_0); - return expr3_0; -} - -// Generated as internal constructor for term sdivmod64. -pub fn constructor_sdivmod64(ctx: &mut C, arg0: Reg, arg1: Reg) -> RegPair { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/s390x/inst.isle line 2137. - let expr0_0 = constructor_temp_writable_regpair(ctx); - let expr1_0 = MInst::SDivMod64 { - rd: expr0_0, - ri: pattern0_0, - rn: pattern1_0, - }; - let expr2_0 = C::emit(ctx, &expr1_0); - let expr3_0 = constructor_writable_regpair_to_regpair(ctx, expr0_0); - return expr3_0; -} - -// Generated as internal constructor for term udivmod32. -pub fn constructor_udivmod32(ctx: &mut C, arg0: RegPair, arg1: Reg) -> RegPair { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/s390x/inst.isle line 2144. - let expr0_0 = constructor_temp_writable_regpair(ctx); - let expr1_0 = MInst::UDivMod32 { - rd: expr0_0, - ri: pattern0_0, - rn: pattern1_0, - }; - let expr2_0 = C::emit(ctx, &expr1_0); - let expr3_0 = constructor_writable_regpair_to_regpair(ctx, expr0_0); - return expr3_0; -} - -// Generated as internal constructor for term udivmod64. -pub fn constructor_udivmod64(ctx: &mut C, arg0: RegPair, arg1: Reg) -> RegPair { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/s390x/inst.isle line 2151. - let expr0_0 = constructor_temp_writable_regpair(ctx); - let expr1_0 = MInst::UDivMod64 { - rd: expr0_0, - ri: pattern0_0, - rn: pattern1_0, - }; - let expr2_0 = C::emit(ctx, &expr1_0); - let expr3_0 = constructor_writable_regpair_to_regpair(ctx, expr0_0); - return expr3_0; -} - -// Generated as internal constructor for term shift_rr. -pub fn constructor_shift_rr( - ctx: &mut C, - arg0: Type, - arg1: &ShiftOp, - arg2: Reg, - arg3: u8, - arg4: Reg, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - let pattern4_0 = arg4; - // Rule at src/isa/s390x/inst.isle line 2158. - let expr0_0 = C::temp_writable_reg(ctx, pattern0_0); - let expr1_0 = MInst::ShiftRR { - shift_op: pattern1_0.clone(), - rd: expr0_0, - rn: pattern2_0, - shift_imm: pattern3_0, - shift_reg: pattern4_0, - }; - let expr2_0 = C::emit(ctx, &expr1_0); - let expr3_0 = C::writable_reg_to_reg(ctx, expr0_0); - return expr3_0; -} - -// Generated as internal constructor for term rxsbg_test. -pub fn constructor_rxsbg_test( - ctx: &mut C, - arg0: &RxSBGOp, - arg1: Reg, - arg2: Reg, - arg3: u8, - arg4: u8, - arg5: i8, -) -> ProducesFlags { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - let pattern4_0 = arg4; - let pattern5_0 = arg5; - // Rule at src/isa/s390x/inst.isle line 2165. - let expr0_0 = MInst::RxSBGTest { - op: pattern0_0.clone(), - rd: pattern1_0, - rn: pattern2_0, - start_bit: pattern3_0, - end_bit: pattern4_0, - rotate_amt: pattern5_0, - }; - let expr1_0 = ProducesFlags::ProducesFlagsSideEffect { inst: expr0_0 }; - return expr1_0; -} - -// Generated as internal constructor for term unary_rr. -pub fn constructor_unary_rr(ctx: &mut C, arg0: Type, arg1: &UnaryOp, arg2: Reg) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 2171. - let expr0_0 = C::temp_writable_reg(ctx, pattern0_0); - let expr1_0 = MInst::UnaryRR { - op: pattern1_0.clone(), - rd: expr0_0, - rn: pattern2_0, - }; - let expr2_0 = C::emit(ctx, &expr1_0); - let expr3_0 = C::writable_reg_to_reg(ctx, expr0_0); - return expr3_0; -} - -// Generated as internal constructor for term cmp_rr. -pub fn constructor_cmp_rr( - ctx: &mut C, - arg0: &CmpOp, - arg1: Reg, - arg2: Reg, -) -> ProducesFlags { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 2178. - let expr0_0 = MInst::CmpRR { - op: pattern0_0.clone(), - rn: pattern1_0, - rm: pattern2_0, - }; - let expr1_0 = ProducesFlags::ProducesFlagsSideEffect { inst: expr0_0 }; - return expr1_0; -} - -// Generated as internal constructor for term cmp_rx. -pub fn constructor_cmp_rx( - ctx: &mut C, - arg0: &CmpOp, - arg1: Reg, - arg2: &MemArg, -) -> ProducesFlags { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 2183. - let expr0_0 = MInst::CmpRX { - op: pattern0_0.clone(), - rn: pattern1_0, - mem: pattern2_0.clone(), - }; - let expr1_0 = ProducesFlags::ProducesFlagsSideEffect { inst: expr0_0 }; - return expr1_0; -} - -// Generated as internal constructor for term cmp_rsimm16. -pub fn constructor_cmp_rsimm16( - ctx: &mut C, - arg0: &CmpOp, - arg1: Reg, - arg2: i16, -) -> ProducesFlags { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 2188. - let expr0_0 = MInst::CmpRSImm16 { - op: pattern0_0.clone(), - rn: pattern1_0, - imm: pattern2_0, - }; - let expr1_0 = ProducesFlags::ProducesFlagsSideEffect { inst: expr0_0 }; - return expr1_0; -} - -// Generated as internal constructor for term cmp_rsimm32. -pub fn constructor_cmp_rsimm32( - ctx: &mut C, - arg0: &CmpOp, - arg1: Reg, - arg2: i32, -) -> ProducesFlags { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 2193. - let expr0_0 = MInst::CmpRSImm32 { - op: pattern0_0.clone(), - rn: pattern1_0, - imm: pattern2_0, - }; - let expr1_0 = ProducesFlags::ProducesFlagsSideEffect { inst: expr0_0 }; - return expr1_0; -} - -// Generated as internal constructor for term cmp_ruimm32. -pub fn constructor_cmp_ruimm32( - ctx: &mut C, - arg0: &CmpOp, - arg1: Reg, - arg2: u32, -) -> ProducesFlags { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 2198. - let expr0_0 = MInst::CmpRUImm32 { - op: pattern0_0.clone(), - rn: pattern1_0, - imm: pattern2_0, - }; - let expr1_0 = ProducesFlags::ProducesFlagsSideEffect { inst: expr0_0 }; - return expr1_0; -} - -// Generated as internal constructor for term atomic_rmw_impl. -pub fn constructor_atomic_rmw_impl( - ctx: &mut C, - arg0: Type, - arg1: &ALUOp, - arg2: Reg, - arg3: &MemArg, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - // Rule at src/isa/s390x/inst.isle line 2203. - let expr0_0 = C::temp_writable_reg(ctx, pattern0_0); - let expr1_0 = MInst::AtomicRmw { - alu_op: pattern1_0.clone(), - rd: expr0_0, - rn: pattern2_0, - mem: pattern3_0.clone(), - }; - let expr2_0 = C::emit(ctx, &expr1_0); - let expr3_0 = C::writable_reg_to_reg(ctx, expr0_0); - return expr3_0; -} - -// Generated as internal constructor for term atomic_cas32. -pub fn constructor_atomic_cas32( - ctx: &mut C, - arg0: Reg, - arg1: Reg, - arg2: &MemArg, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 2210. - let expr0_0: Type = I32; - let expr1_0 = C::temp_writable_reg(ctx, expr0_0); - let expr2_0 = MInst::AtomicCas32 { - rd: expr1_0, - ri: pattern0_0, - rn: pattern1_0, - mem: pattern2_0.clone(), - }; - let expr3_0 = C::emit(ctx, &expr2_0); - let expr4_0 = C::writable_reg_to_reg(ctx, expr1_0); - return expr4_0; -} - -// Generated as internal constructor for term atomic_cas64. -pub fn constructor_atomic_cas64( - ctx: &mut C, - arg0: Reg, - arg1: Reg, - arg2: &MemArg, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 2217. - let expr0_0: Type = I64; - let expr1_0 = C::temp_writable_reg(ctx, expr0_0); - let expr2_0 = MInst::AtomicCas64 { - rd: expr1_0, - ri: pattern0_0, - rn: pattern1_0, - mem: pattern2_0.clone(), - }; - let expr3_0 = C::emit(ctx, &expr2_0); - let expr4_0 = C::writable_reg_to_reg(ctx, expr1_0); - return expr4_0; -} - -// Generated as internal constructor for term fence_impl. -pub fn constructor_fence_impl(ctx: &mut C) -> SideEffectNoResult { - // Rule at src/isa/s390x/inst.isle line 2224. - let expr0_0 = MInst::Fence; - let expr1_0 = SideEffectNoResult::Inst { inst: expr0_0 }; - return expr1_0; -} - -// Generated as internal constructor for term load32. -pub fn constructor_load32(ctx: &mut C, arg0: &MemArg) -> Reg { - let pattern0_0 = arg0; - // Rule at src/isa/s390x/inst.isle line 2229. - let expr0_0: Type = I32; - let expr1_0 = C::temp_writable_reg(ctx, expr0_0); - let expr2_0 = MInst::Load32 { - rd: expr1_0, - mem: pattern0_0.clone(), - }; - let expr3_0 = C::emit(ctx, &expr2_0); - let expr4_0 = C::writable_reg_to_reg(ctx, expr1_0); - return expr4_0; -} - -// Generated as internal constructor for term load64. -pub fn constructor_load64(ctx: &mut C, arg0: &MemArg) -> Reg { - let pattern0_0 = arg0; - // Rule at src/isa/s390x/inst.isle line 2236. - let expr0_0: Type = I64; - let expr1_0 = C::temp_writable_reg(ctx, expr0_0); - let expr2_0 = MInst::Load64 { - rd: expr1_0, - mem: pattern0_0.clone(), - }; - let expr3_0 = C::emit(ctx, &expr2_0); - let expr4_0 = C::writable_reg_to_reg(ctx, expr1_0); - return expr4_0; -} - -// Generated as internal constructor for term loadrev16. -pub fn constructor_loadrev16(ctx: &mut C, arg0: &MemArg) -> Reg { - let pattern0_0 = arg0; - // Rule at src/isa/s390x/inst.isle line 2243. - let expr0_0: Type = I32; - let expr1_0 = C::temp_writable_reg(ctx, expr0_0); - let expr2_0 = MInst::LoadRev16 { - rd: expr1_0, - mem: pattern0_0.clone(), - }; - let expr3_0 = C::emit(ctx, &expr2_0); - let expr4_0 = C::writable_reg_to_reg(ctx, expr1_0); - return expr4_0; -} - -// Generated as internal constructor for term loadrev32. -pub fn constructor_loadrev32(ctx: &mut C, arg0: &MemArg) -> Reg { - let pattern0_0 = arg0; - // Rule at src/isa/s390x/inst.isle line 2250. - let expr0_0: Type = I32; - let expr1_0 = C::temp_writable_reg(ctx, expr0_0); - let expr2_0 = MInst::LoadRev32 { - rd: expr1_0, - mem: pattern0_0.clone(), - }; - let expr3_0 = C::emit(ctx, &expr2_0); - let expr4_0 = C::writable_reg_to_reg(ctx, expr1_0); - return expr4_0; -} - -// Generated as internal constructor for term loadrev64. -pub fn constructor_loadrev64(ctx: &mut C, arg0: &MemArg) -> Reg { - let pattern0_0 = arg0; - // Rule at src/isa/s390x/inst.isle line 2257. - let expr0_0: Type = I64; - let expr1_0 = C::temp_writable_reg(ctx, expr0_0); - let expr2_0 = MInst::LoadRev64 { - rd: expr1_0, - mem: pattern0_0.clone(), - }; - let expr3_0 = C::emit(ctx, &expr2_0); - let expr4_0 = C::writable_reg_to_reg(ctx, expr1_0); - return expr4_0; -} - -// Generated as internal constructor for term store8. -pub fn constructor_store8(ctx: &mut C, arg0: Reg, arg1: &MemArg) -> SideEffectNoResult { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/s390x/inst.isle line 2264. - let expr0_0 = MInst::Store8 { - rd: pattern0_0, - mem: pattern1_0.clone(), - }; - let expr1_0 = SideEffectNoResult::Inst { inst: expr0_0 }; - return expr1_0; -} - -// Generated as internal constructor for term store16. -pub fn constructor_store16( - ctx: &mut C, - arg0: Reg, - arg1: &MemArg, -) -> SideEffectNoResult { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/s390x/inst.isle line 2269. - let expr0_0 = MInst::Store16 { - rd: pattern0_0, - mem: pattern1_0.clone(), - }; - let expr1_0 = SideEffectNoResult::Inst { inst: expr0_0 }; - return expr1_0; -} - -// Generated as internal constructor for term store32. -pub fn constructor_store32( - ctx: &mut C, - arg0: Reg, - arg1: &MemArg, -) -> SideEffectNoResult { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/s390x/inst.isle line 2274. - let expr0_0 = MInst::Store32 { - rd: pattern0_0, - mem: pattern1_0.clone(), - }; - let expr1_0 = SideEffectNoResult::Inst { inst: expr0_0 }; - return expr1_0; -} - -// Generated as internal constructor for term store64. -pub fn constructor_store64( - ctx: &mut C, - arg0: Reg, - arg1: &MemArg, -) -> SideEffectNoResult { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/s390x/inst.isle line 2279. - let expr0_0 = MInst::Store64 { - rd: pattern0_0, - mem: pattern1_0.clone(), - }; - let expr1_0 = SideEffectNoResult::Inst { inst: expr0_0 }; - return expr1_0; -} - -// Generated as internal constructor for term store8_imm. -pub fn constructor_store8_imm( - ctx: &mut C, - arg0: u8, - arg1: &MemArg, -) -> SideEffectNoResult { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/s390x/inst.isle line 2284. - let expr0_0 = MInst::StoreImm8 { - imm: pattern0_0, - mem: pattern1_0.clone(), - }; - let expr1_0 = SideEffectNoResult::Inst { inst: expr0_0 }; - return expr1_0; -} - -// Generated as internal constructor for term store16_imm. -pub fn constructor_store16_imm( - ctx: &mut C, - arg0: i16, - arg1: &MemArg, -) -> SideEffectNoResult { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/s390x/inst.isle line 2289. - let expr0_0 = MInst::StoreImm16 { - imm: pattern0_0, - mem: pattern1_0.clone(), - }; - let expr1_0 = SideEffectNoResult::Inst { inst: expr0_0 }; - return expr1_0; -} - -// Generated as internal constructor for term store32_simm16. -pub fn constructor_store32_simm16( - ctx: &mut C, - arg0: i16, - arg1: &MemArg, -) -> SideEffectNoResult { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/s390x/inst.isle line 2294. - let expr0_0 = MInst::StoreImm32SExt16 { - imm: pattern0_0, - mem: pattern1_0.clone(), - }; - let expr1_0 = SideEffectNoResult::Inst { inst: expr0_0 }; - return expr1_0; -} - -// Generated as internal constructor for term store64_simm16. -pub fn constructor_store64_simm16( - ctx: &mut C, - arg0: i16, - arg1: &MemArg, -) -> SideEffectNoResult { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/s390x/inst.isle line 2299. - let expr0_0 = MInst::StoreImm64SExt16 { - imm: pattern0_0, - mem: pattern1_0.clone(), - }; - let expr1_0 = SideEffectNoResult::Inst { inst: expr0_0 }; - return expr1_0; -} - -// Generated as internal constructor for term storerev16. -pub fn constructor_storerev16( - ctx: &mut C, - arg0: Reg, - arg1: &MemArg, -) -> SideEffectNoResult { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/s390x/inst.isle line 2304. - let expr0_0 = MInst::StoreRev16 { - rd: pattern0_0, - mem: pattern1_0.clone(), - }; - let expr1_0 = SideEffectNoResult::Inst { inst: expr0_0 }; - return expr1_0; -} - -// Generated as internal constructor for term storerev32. -pub fn constructor_storerev32( - ctx: &mut C, - arg0: Reg, - arg1: &MemArg, -) -> SideEffectNoResult { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/s390x/inst.isle line 2309. - let expr0_0 = MInst::StoreRev32 { - rd: pattern0_0, - mem: pattern1_0.clone(), - }; - let expr1_0 = SideEffectNoResult::Inst { inst: expr0_0 }; - return expr1_0; -} - -// Generated as internal constructor for term storerev64. -pub fn constructor_storerev64( - ctx: &mut C, - arg0: Reg, - arg1: &MemArg, -) -> SideEffectNoResult { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/s390x/inst.isle line 2314. - let expr0_0 = MInst::StoreRev64 { - rd: pattern0_0, - mem: pattern1_0.clone(), - }; - let expr1_0 = SideEffectNoResult::Inst { inst: expr0_0 }; - return expr1_0; -} - -// Generated as internal constructor for term mvc. -pub fn constructor_mvc( - ctx: &mut C, - arg0: &MemArgPair, - arg1: &MemArgPair, - arg2: u8, -) -> SideEffectNoResult { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 2319. - let expr0_0 = MInst::Mvc { - dst: pattern0_0.clone(), - src: pattern1_0.clone(), - len_minus_one: pattern2_0, - }; - let expr1_0 = SideEffectNoResult::Inst { inst: expr0_0 }; - return expr1_0; -} - -// Generated as internal constructor for term load_ar. -pub fn constructor_load_ar(ctx: &mut C, arg0: u8) -> Reg { - let pattern0_0 = arg0; - // Rule at src/isa/s390x/inst.isle line 2324. - let expr0_0: Type = I64; - let expr1_0 = C::temp_writable_reg(ctx, expr0_0); - let expr2_0 = MInst::LoadAR { - rd: expr1_0, - ar: pattern0_0, - }; - let expr3_0 = C::emit(ctx, &expr2_0); - let expr4_0 = C::writable_reg_to_reg(ctx, expr1_0); - return expr4_0; -} - -// Generated as internal constructor for term insert_ar. -pub fn constructor_insert_ar(ctx: &mut C, arg0: Reg, arg1: u8) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/s390x/inst.isle line 2331. - let expr0_0: Type = I64; - let expr1_0 = C::temp_writable_reg(ctx, expr0_0); - let expr2_0 = MInst::InsertAR { - rd: expr1_0, - ri: pattern0_0, - ar: pattern1_0, - }; - let expr3_0 = C::emit(ctx, &expr2_0); - let expr4_0 = C::writable_reg_to_reg(ctx, expr1_0); - return expr4_0; -} - -// Generated as internal constructor for term fpu_rr. -pub fn constructor_fpu_rr(ctx: &mut C, arg0: Type, arg1: &FPUOp1, arg2: Reg) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 2338. - let expr0_0 = C::temp_writable_reg(ctx, pattern0_0); - let expr1_0 = MInst::FpuRR { - fpu_op: pattern1_0.clone(), - rd: expr0_0, - rn: pattern2_0, - }; - let expr2_0 = C::emit(ctx, &expr1_0); - let expr3_0 = C::writable_reg_to_reg(ctx, expr0_0); - return expr3_0; -} - -// Generated as internal constructor for term fpu_rrr. -pub fn constructor_fpu_rrr( - ctx: &mut C, - arg0: Type, - arg1: &FPUOp2, - arg2: Reg, - arg3: Reg, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - // Rule at src/isa/s390x/inst.isle line 2345. - let expr0_0 = C::temp_writable_reg(ctx, pattern0_0); - let expr1_0 = MInst::FpuRRR { - fpu_op: pattern1_0.clone(), - rd: expr0_0, - rn: pattern2_0, - rm: pattern3_0, - }; - let expr2_0 = C::emit(ctx, &expr1_0); - let expr3_0 = C::writable_reg_to_reg(ctx, expr0_0); - return expr3_0; -} - -// Generated as internal constructor for term fpu_rrrr. -pub fn constructor_fpu_rrrr( - ctx: &mut C, - arg0: Type, - arg1: &FPUOp3, - arg2: Reg, - arg3: Reg, - arg4: Reg, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - let pattern4_0 = arg4; - // Rule at src/isa/s390x/inst.isle line 2352. - let expr0_0 = C::temp_writable_reg(ctx, pattern0_0); - let expr1_0 = MInst::FpuRRRR { - fpu_op: pattern1_0.clone(), - rd: expr0_0, - rn: pattern2_0, - rm: pattern3_0, - ra: pattern4_0, - }; - let expr2_0 = C::emit(ctx, &expr1_0); - let expr3_0 = C::writable_reg_to_reg(ctx, expr0_0); - return expr3_0; -} - -// Generated as internal constructor for term fpu_cmp32. -pub fn constructor_fpu_cmp32(ctx: &mut C, arg0: Reg, arg1: Reg) -> ProducesFlags { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/s390x/inst.isle line 2359. - let expr0_0 = MInst::FpuCmp32 { - rn: pattern0_0, - rm: pattern1_0, - }; - let expr1_0 = ProducesFlags::ProducesFlagsSideEffect { inst: expr0_0 }; - return expr1_0; -} - -// Generated as internal constructor for term fpu_cmp64. -pub fn constructor_fpu_cmp64(ctx: &mut C, arg0: Reg, arg1: Reg) -> ProducesFlags { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/s390x/inst.isle line 2364. - let expr0_0 = MInst::FpuCmp64 { - rn: pattern0_0, - rm: pattern1_0, - }; - let expr1_0 = ProducesFlags::ProducesFlagsSideEffect { inst: expr0_0 }; - return expr1_0; -} - -// Generated as internal constructor for term fpu_round. -pub fn constructor_fpu_round( - ctx: &mut C, - arg0: Type, - arg1: &FpuRoundOp, - arg2: &FpuRoundMode, - arg3: Reg, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - // Rule at src/isa/s390x/inst.isle line 2369. - let expr0_0 = C::temp_writable_reg(ctx, pattern0_0); - let expr1_0 = MInst::FpuRound { - op: pattern1_0.clone(), - mode: pattern2_0.clone(), - rd: expr0_0, - rn: pattern3_0, - }; - let expr2_0 = C::emit(ctx, &expr1_0); - let expr3_0 = C::writable_reg_to_reg(ctx, expr0_0); - return expr3_0; -} - -// Generated as internal constructor for term vec_rrr. -pub fn constructor_vec_rrr( - ctx: &mut C, - arg0: Type, - arg1: &VecBinaryOp, - arg2: Reg, - arg3: Reg, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - // Rule at src/isa/s390x/inst.isle line 2376. - let expr0_0 = C::temp_writable_reg(ctx, pattern0_0); - let expr1_0 = MInst::VecRRR { - op: pattern1_0.clone(), - rd: expr0_0, - rn: pattern2_0, - rm: pattern3_0, - }; - let expr2_0 = C::emit(ctx, &expr1_0); - let expr3_0 = C::writable_reg_to_reg(ctx, expr0_0); - return expr3_0; -} - -// Generated as internal constructor for term vec_rr. -pub fn constructor_vec_rr( - ctx: &mut C, - arg0: Type, - arg1: &VecUnaryOp, - arg2: Reg, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 2383. - let expr0_0 = C::temp_writable_reg(ctx, pattern0_0); - let expr1_0 = MInst::VecRR { - op: pattern1_0.clone(), - rd: expr0_0, - rn: pattern2_0, - }; - let expr2_0 = C::emit(ctx, &expr1_0); - let expr3_0 = C::writable_reg_to_reg(ctx, expr0_0); - return expr3_0; -} - -// Generated as internal constructor for term vec_shift_rr. -pub fn constructor_vec_shift_rr( - ctx: &mut C, - arg0: Type, - arg1: &VecShiftOp, - arg2: Reg, - arg3: u8, - arg4: Reg, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - let pattern4_0 = arg4; - // Rule at src/isa/s390x/inst.isle line 2390. - let expr0_0 = C::temp_writable_reg(ctx, pattern0_0); - let expr1_0 = MInst::VecShiftRR { - shift_op: pattern1_0.clone(), - rd: expr0_0, - rn: pattern2_0, - shift_imm: pattern3_0, - shift_reg: pattern4_0, - }; - let expr2_0 = C::emit(ctx, &expr1_0); - let expr3_0 = C::writable_reg_to_reg(ctx, expr0_0); - return expr3_0; -} - -// Generated as internal constructor for term vec_select. -pub fn constructor_vec_select( - ctx: &mut C, - arg0: Type, - arg1: Reg, - arg2: Reg, - arg3: Reg, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - // Rule at src/isa/s390x/inst.isle line 2397. - let expr0_0 = C::temp_writable_reg(ctx, pattern0_0); - let expr1_0 = MInst::VecSelect { - rd: expr0_0, - rn: pattern1_0, - rm: pattern2_0, - ra: pattern3_0, - }; - let expr2_0 = C::emit(ctx, &expr1_0); - let expr3_0 = C::writable_reg_to_reg(ctx, expr0_0); - return expr3_0; -} - -// Generated as internal constructor for term vec_permute. -pub fn constructor_vec_permute( - ctx: &mut C, - arg0: Type, - arg1: Reg, - arg2: Reg, - arg3: Reg, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - // Rule at src/isa/s390x/inst.isle line 2404. - let expr0_0 = C::temp_writable_reg(ctx, pattern0_0); - let expr1_0 = MInst::VecPermute { - rd: expr0_0, - rn: pattern1_0, - rm: pattern2_0, - ra: pattern3_0, - }; - let expr2_0 = C::emit(ctx, &expr1_0); - let expr3_0 = C::writable_reg_to_reg(ctx, expr0_0); - return expr3_0; -} - -// Generated as internal constructor for term vec_permute_dw_imm. -pub fn constructor_vec_permute_dw_imm( - ctx: &mut C, - arg0: Type, - arg1: Reg, - arg2: u8, - arg3: Reg, - arg4: u8, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - let pattern4_0 = arg4; - // Rule at src/isa/s390x/inst.isle line 2411. - let expr0_0 = C::temp_writable_reg(ctx, pattern0_0); - let expr1_0 = MInst::VecPermuteDWImm { - rd: expr0_0, - rn: pattern1_0, - rm: pattern3_0, - idx1: pattern2_0, - idx2: pattern4_0, - }; - let expr2_0 = C::emit(ctx, &expr1_0); - let expr3_0 = C::writable_reg_to_reg(ctx, expr0_0); - return expr3_0; -} - -// Generated as internal constructor for term vec_int_cmp. -pub fn constructor_vec_int_cmp( - ctx: &mut C, - arg0: Type, - arg1: &VecIntCmpOp, - arg2: Reg, - arg3: Reg, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - // Rule at src/isa/s390x/inst.isle line 2418. - let expr0_0 = C::temp_writable_reg(ctx, pattern0_0); - let expr1_0 = MInst::VecIntCmp { - op: pattern1_0.clone(), - rd: expr0_0, - rn: pattern2_0, - rm: pattern3_0, - }; - let expr2_0 = C::emit(ctx, &expr1_0); - let expr3_0 = C::writable_reg_to_reg(ctx, expr0_0); - return expr3_0; -} - -// Generated as internal constructor for term vec_int_cmps. -pub fn constructor_vec_int_cmps( - ctx: &mut C, - arg0: Type, - arg1: &VecIntCmpOp, - arg2: Reg, - arg3: Reg, -) -> ProducesFlags { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - // Rule at src/isa/s390x/inst.isle line 2425. - let expr0_0 = C::temp_writable_reg(ctx, pattern0_0); - let expr1_0 = MInst::VecIntCmpS { - op: pattern1_0.clone(), - rd: expr0_0, - rn: pattern2_0, - rm: pattern3_0, - }; - let expr2_0 = ProducesFlags::ProducesFlagsSideEffect { inst: expr1_0 }; - return expr2_0; -} - -// Generated as internal constructor for term vec_float_cmp. -pub fn constructor_vec_float_cmp( - ctx: &mut C, - arg0: Type, - arg1: &VecFloatCmpOp, - arg2: Reg, - arg3: Reg, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - // Rule at src/isa/s390x/inst.isle line 2431. - let expr0_0 = C::temp_writable_reg(ctx, pattern0_0); - let expr1_0 = MInst::VecFloatCmp { - op: pattern1_0.clone(), - rd: expr0_0, - rn: pattern2_0, - rm: pattern3_0, - }; - let expr2_0 = C::emit(ctx, &expr1_0); - let expr3_0 = C::writable_reg_to_reg(ctx, expr0_0); - return expr3_0; -} - -// Generated as internal constructor for term vec_float_cmps. -pub fn constructor_vec_float_cmps( - ctx: &mut C, - arg0: Type, - arg1: &VecFloatCmpOp, - arg2: Reg, - arg3: Reg, -) -> ProducesFlags { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - // Rule at src/isa/s390x/inst.isle line 2438. - let expr0_0 = C::temp_writable_reg(ctx, pattern0_0); - let expr1_0 = MInst::VecFloatCmpS { - op: pattern1_0.clone(), - rd: expr0_0, - rn: pattern2_0, - rm: pattern3_0, - }; - let expr2_0 = ProducesFlags::ProducesFlagsSideEffect { inst: expr1_0 }; - return expr2_0; -} - -// Generated as internal constructor for term vec_int128_scmphi. -pub fn constructor_vec_int128_scmphi( - ctx: &mut C, - arg0: Reg, - arg1: Reg, -) -> ProducesBool { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/s390x/inst.isle line 2444. - let expr0_0: Type = I128; - let expr1_0 = C::temp_writable_reg(ctx, expr0_0); - let expr2_0 = MInst::VecInt128SCmpHi { - tmp: expr1_0, - rn: pattern0_0, - rm: pattern1_0, - }; - let expr3_0 = ProducesFlags::ProducesFlagsSideEffect { inst: expr2_0 }; - let expr4_0: u8 = 4i128 as u8; - let expr5_0 = C::mask_as_cond(ctx, expr4_0); - let expr6_0 = constructor_bool(ctx, &expr3_0, &expr5_0); - return expr6_0; -} - -// Generated as internal constructor for term vec_int128_ucmphi. -pub fn constructor_vec_int128_ucmphi( - ctx: &mut C, - arg0: Reg, - arg1: Reg, -) -> ProducesBool { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/s390x/inst.isle line 2451. - let expr0_0: Type = I128; - let expr1_0 = C::temp_writable_reg(ctx, expr0_0); - let expr2_0 = MInst::VecInt128UCmpHi { - tmp: expr1_0, - rn: pattern0_0, - rm: pattern1_0, - }; - let expr3_0 = ProducesFlags::ProducesFlagsSideEffect { inst: expr2_0 }; - let expr4_0: u8 = 4i128 as u8; - let expr5_0 = C::mask_as_cond(ctx, expr4_0); - let expr6_0 = constructor_bool(ctx, &expr3_0, &expr5_0); - return expr6_0; -} - -// Generated as internal constructor for term vec_load. -pub fn constructor_vec_load(ctx: &mut C, arg0: Type, arg1: &MemArg) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/s390x/inst.isle line 2458. - let expr0_0 = C::temp_writable_reg(ctx, pattern0_0); - let expr1_0 = MInst::VecLoad { - rd: expr0_0, - mem: pattern1_0.clone(), - }; - let expr2_0 = C::emit(ctx, &expr1_0); - let expr3_0 = C::writable_reg_to_reg(ctx, expr0_0); - return expr3_0; -} - -// Generated as internal constructor for term vec_loadrev. -pub fn constructor_vec_loadrev(ctx: &mut C, arg0: Type, arg1: &MemArg) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/s390x/inst.isle line 2465. - let expr0_0 = C::temp_writable_reg(ctx, pattern0_0); - let expr1_0 = MInst::VecLoadRev { - rd: expr0_0, - mem: pattern1_0.clone(), - }; - let expr2_0 = C::emit(ctx, &expr1_0); - let expr3_0 = C::writable_reg_to_reg(ctx, expr0_0); - return expr3_0; -} - -// Generated as internal constructor for term vec_load_byte16rev. -pub fn constructor_vec_load_byte16rev(ctx: &mut C, arg0: Type, arg1: &MemArg) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/s390x/inst.isle line 2472. - let expr0_0 = C::temp_writable_reg(ctx, pattern0_0); - let expr1_0 = MInst::VecLoadByte16Rev { - rd: expr0_0, - mem: pattern1_0.clone(), - }; - let expr2_0 = C::emit(ctx, &expr1_0); - let expr3_0 = C::writable_reg_to_reg(ctx, expr0_0); - return expr3_0; -} - -// Generated as internal constructor for term vec_load_byte32rev. -pub fn constructor_vec_load_byte32rev(ctx: &mut C, arg0: Type, arg1: &MemArg) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/s390x/inst.isle line 2479. - let expr0_0 = C::temp_writable_reg(ctx, pattern0_0); - let expr1_0 = MInst::VecLoadByte32Rev { - rd: expr0_0, - mem: pattern1_0.clone(), - }; - let expr2_0 = C::emit(ctx, &expr1_0); - let expr3_0 = C::writable_reg_to_reg(ctx, expr0_0); - return expr3_0; -} - -// Generated as internal constructor for term vec_load_byte64rev. -pub fn constructor_vec_load_byte64rev(ctx: &mut C, arg0: Type, arg1: &MemArg) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/s390x/inst.isle line 2486. - let expr0_0 = C::temp_writable_reg(ctx, pattern0_0); - let expr1_0 = MInst::VecLoadByte64Rev { - rd: expr0_0, - mem: pattern1_0.clone(), - }; - let expr2_0 = C::emit(ctx, &expr1_0); - let expr3_0 = C::writable_reg_to_reg(ctx, expr0_0); - return expr3_0; -} - -// Generated as internal constructor for term vec_load_elt16rev. -pub fn constructor_vec_load_elt16rev(ctx: &mut C, arg0: Type, arg1: &MemArg) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/s390x/inst.isle line 2493. - let expr0_0 = C::temp_writable_reg(ctx, pattern0_0); - let expr1_0 = MInst::VecLoadElt16Rev { - rd: expr0_0, - mem: pattern1_0.clone(), - }; - let expr2_0 = C::emit(ctx, &expr1_0); - let expr3_0 = C::writable_reg_to_reg(ctx, expr0_0); - return expr3_0; -} - -// Generated as internal constructor for term vec_load_elt32rev. -pub fn constructor_vec_load_elt32rev(ctx: &mut C, arg0: Type, arg1: &MemArg) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/s390x/inst.isle line 2500. - let expr0_0 = C::temp_writable_reg(ctx, pattern0_0); - let expr1_0 = MInst::VecLoadElt32Rev { - rd: expr0_0, - mem: pattern1_0.clone(), - }; - let expr2_0 = C::emit(ctx, &expr1_0); - let expr3_0 = C::writable_reg_to_reg(ctx, expr0_0); - return expr3_0; -} - -// Generated as internal constructor for term vec_load_elt64rev. -pub fn constructor_vec_load_elt64rev(ctx: &mut C, arg0: Type, arg1: &MemArg) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/s390x/inst.isle line 2507. - let expr0_0 = C::temp_writable_reg(ctx, pattern0_0); - let expr1_0 = MInst::VecLoadElt64Rev { - rd: expr0_0, - mem: pattern1_0.clone(), - }; - let expr2_0 = C::emit(ctx, &expr1_0); - let expr3_0 = C::writable_reg_to_reg(ctx, expr0_0); - return expr3_0; -} - -// Generated as internal constructor for term vec_store. -pub fn constructor_vec_store( - ctx: &mut C, - arg0: Reg, - arg1: &MemArg, -) -> SideEffectNoResult { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/s390x/inst.isle line 2514. - let expr0_0 = MInst::VecStore { - rd: pattern0_0, - mem: pattern1_0.clone(), - }; - let expr1_0 = SideEffectNoResult::Inst { inst: expr0_0 }; - return expr1_0; -} - -// Generated as internal constructor for term vec_storerev. -pub fn constructor_vec_storerev( - ctx: &mut C, - arg0: Reg, - arg1: &MemArg, -) -> SideEffectNoResult { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/s390x/inst.isle line 2519. - let expr0_0 = MInst::VecStoreRev { - rd: pattern0_0, - mem: pattern1_0.clone(), - }; - let expr1_0 = SideEffectNoResult::Inst { inst: expr0_0 }; - return expr1_0; -} - -// Generated as internal constructor for term vec_store_byte16rev. -pub fn constructor_vec_store_byte16rev( - ctx: &mut C, - arg0: Reg, - arg1: &MemArg, -) -> SideEffectNoResult { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/s390x/inst.isle line 2524. - let expr0_0 = MInst::VecStoreByte16Rev { - rd: pattern0_0, - mem: pattern1_0.clone(), - }; - let expr1_0 = SideEffectNoResult::Inst { inst: expr0_0 }; - return expr1_0; -} - -// Generated as internal constructor for term vec_store_byte32rev. -pub fn constructor_vec_store_byte32rev( - ctx: &mut C, - arg0: Reg, - arg1: &MemArg, -) -> SideEffectNoResult { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/s390x/inst.isle line 2529. - let expr0_0 = MInst::VecStoreByte32Rev { - rd: pattern0_0, - mem: pattern1_0.clone(), - }; - let expr1_0 = SideEffectNoResult::Inst { inst: expr0_0 }; - return expr1_0; -} - -// Generated as internal constructor for term vec_store_byte64rev. -pub fn constructor_vec_store_byte64rev( - ctx: &mut C, - arg0: Reg, - arg1: &MemArg, -) -> SideEffectNoResult { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/s390x/inst.isle line 2534. - let expr0_0 = MInst::VecStoreByte64Rev { - rd: pattern0_0, - mem: pattern1_0.clone(), - }; - let expr1_0 = SideEffectNoResult::Inst { inst: expr0_0 }; - return expr1_0; -} - -// Generated as internal constructor for term vec_store_elt16rev. -pub fn constructor_vec_store_elt16rev( - ctx: &mut C, - arg0: Reg, - arg1: &MemArg, -) -> SideEffectNoResult { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/s390x/inst.isle line 2539. - let expr0_0 = MInst::VecStoreElt16Rev { - rd: pattern0_0, - mem: pattern1_0.clone(), - }; - let expr1_0 = SideEffectNoResult::Inst { inst: expr0_0 }; - return expr1_0; -} - -// Generated as internal constructor for term vec_store_elt32rev. -pub fn constructor_vec_store_elt32rev( - ctx: &mut C, - arg0: Reg, - arg1: &MemArg, -) -> SideEffectNoResult { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/s390x/inst.isle line 2544. - let expr0_0 = MInst::VecStoreElt32Rev { - rd: pattern0_0, - mem: pattern1_0.clone(), - }; - let expr1_0 = SideEffectNoResult::Inst { inst: expr0_0 }; - return expr1_0; -} - -// Generated as internal constructor for term vec_store_elt64rev. -pub fn constructor_vec_store_elt64rev( - ctx: &mut C, - arg0: Reg, - arg1: &MemArg, -) -> SideEffectNoResult { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/s390x/inst.isle line 2549. - let expr0_0 = MInst::VecStoreElt64Rev { - rd: pattern0_0, - mem: pattern1_0.clone(), - }; - let expr1_0 = SideEffectNoResult::Inst { inst: expr0_0 }; - return expr1_0; -} - -// Generated as internal constructor for term vec_load_replicate. -pub fn constructor_vec_load_replicate(ctx: &mut C, arg0: Type, arg1: &MemArg) -> Reg { - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::ty_vec128(ctx, pattern0_0) { - if let Some((pattern2_0, pattern2_1)) = C::multi_lane(ctx, pattern1_0) { - let pattern3_0 = arg1; - // Rule at src/isa/s390x/inst.isle line 2554. - let expr0_0 = C::temp_writable_reg(ctx, pattern1_0); - let expr1_0 = MInst::VecLoadReplicate { - size: pattern2_0, - rd: expr0_0, - mem: pattern3_0.clone(), - }; - let expr2_0 = C::emit(ctx, &expr1_0); - let expr3_0 = C::writable_reg_to_reg(ctx, expr0_0); - return expr3_0; - } - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "vec_load_replicate", "src/isa/s390x/inst.isle line 2553" - ); -} - -// Generated as internal constructor for term vec_load_replicate_rev. -pub fn constructor_vec_load_replicate_rev( - ctx: &mut C, - arg0: Type, - arg1: &MemArg, -) -> Reg { - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::ty_vec128(ctx, pattern0_0) { - if let Some((pattern2_0, pattern2_1)) = C::multi_lane(ctx, pattern1_0) { - let pattern3_0 = arg1; - // Rule at src/isa/s390x/inst.isle line 2561. - let expr0_0 = C::temp_writable_reg(ctx, pattern1_0); - let expr1_0 = MInst::VecLoadReplicateRev { - size: pattern2_0, - rd: expr0_0, - mem: pattern3_0.clone(), - }; - let expr2_0 = C::emit(ctx, &expr1_0); - let expr3_0 = C::writable_reg_to_reg(ctx, expr0_0); - return expr3_0; - } - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "vec_load_replicate_rev", "src/isa/s390x/inst.isle line 2560" - ); -} - -// Generated as internal constructor for term mov_to_vec128. -pub fn constructor_mov_to_vec128(ctx: &mut C, arg0: Type, arg1: Reg, arg2: Reg) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 2568. - let expr0_0 = C::temp_writable_reg(ctx, pattern0_0); - let expr1_0 = MInst::MovToVec128 { - rd: expr0_0, - rn: pattern1_0, - rm: pattern2_0, - }; - let expr2_0 = C::emit(ctx, &expr1_0); - let expr3_0 = C::writable_reg_to_reg(ctx, expr0_0); - return expr3_0; -} - -// Generated as internal constructor for term vec_load_const. -pub fn constructor_vec_load_const(ctx: &mut C, arg0: Type, arg1: u128) -> Reg { - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::vr128_ty(ctx, pattern0_0) { - let pattern2_0 = arg1; - // Rule at src/isa/s390x/inst.isle line 2575. - let expr0_0 = C::temp_writable_reg(ctx, pattern1_0); - let expr1_0 = MInst::VecLoadConst { - rd: expr0_0, - const_data: pattern2_0, - }; - let expr2_0 = C::emit(ctx, &expr1_0); - let expr3_0 = C::writable_reg_to_reg(ctx, expr0_0); - return expr3_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "vec_load_const", "src/isa/s390x/inst.isle line 2574" - ); -} - -// Generated as internal constructor for term vec_load_const_replicate. -pub fn constructor_vec_load_const_replicate(ctx: &mut C, arg0: Type, arg1: u64) -> Reg { - let pattern0_0 = arg0; - if let Some((pattern1_0, pattern1_1)) = C::multi_lane(ctx, pattern0_0) { - let pattern2_0 = arg1; - // Rule at src/isa/s390x/inst.isle line 2582. - let expr0_0 = C::temp_writable_reg(ctx, pattern0_0); - let expr1_0 = MInst::VecLoadConstReplicate { - size: pattern1_0, - rd: expr0_0, - const_data: pattern2_0, - }; - let expr2_0 = C::emit(ctx, &expr1_0); - let expr3_0 = C::writable_reg_to_reg(ctx, expr0_0); - return expr3_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "vec_load_const_replicate", "src/isa/s390x/inst.isle line 2581" - ); -} - -// Generated as internal constructor for term vec_imm_byte_mask. -pub fn constructor_vec_imm_byte_mask(ctx: &mut C, arg0: Type, arg1: u16) -> Reg { - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::vr128_ty(ctx, pattern0_0) { - let pattern2_0 = arg1; - // Rule at src/isa/s390x/inst.isle line 2589. - let expr0_0 = C::temp_writable_reg(ctx, pattern1_0); - let expr1_0 = MInst::VecImmByteMask { - rd: expr0_0, - mask: pattern2_0, - }; - let expr2_0 = C::emit(ctx, &expr1_0); - let expr3_0 = C::writable_reg_to_reg(ctx, expr0_0); - return expr3_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "vec_imm_byte_mask", "src/isa/s390x/inst.isle line 2588" - ); -} - -// Generated as internal constructor for term vec_imm_bit_mask. -pub fn constructor_vec_imm_bit_mask( - ctx: &mut C, - arg0: Type, - arg1: u8, - arg2: u8, -) -> Reg { - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::ty_vec128(ctx, pattern0_0) { - if let Some((pattern2_0, pattern2_1)) = C::multi_lane(ctx, pattern1_0) { - let pattern3_0 = arg1; - let pattern4_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 2596. - let expr0_0 = C::temp_writable_reg(ctx, pattern1_0); - let expr1_0 = MInst::VecImmBitMask { - size: pattern2_0, - rd: expr0_0, - start_bit: pattern3_0, - end_bit: pattern4_0, - }; - let expr2_0 = C::emit(ctx, &expr1_0); - let expr3_0 = C::writable_reg_to_reg(ctx, expr0_0); - return expr3_0; - } - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "vec_imm_bit_mask", "src/isa/s390x/inst.isle line 2595" - ); -} - -// Generated as internal constructor for term vec_imm_replicate. -pub fn constructor_vec_imm_replicate(ctx: &mut C, arg0: Type, arg1: i16) -> Reg { - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::ty_vec128(ctx, pattern0_0) { - if let Some((pattern2_0, pattern2_1)) = C::multi_lane(ctx, pattern1_0) { - let pattern3_0 = arg1; - // Rule at src/isa/s390x/inst.isle line 2603. - let expr0_0 = C::temp_writable_reg(ctx, pattern1_0); - let expr1_0 = MInst::VecImmReplicate { - size: pattern2_0, - rd: expr0_0, - imm: pattern3_0, - }; - let expr2_0 = C::emit(ctx, &expr1_0); - let expr3_0 = C::writable_reg_to_reg(ctx, expr0_0); - return expr3_0; - } - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "vec_imm_replicate", "src/isa/s390x/inst.isle line 2602" - ); -} - -// Generated as internal constructor for term vec_load_lane. -pub fn constructor_vec_load_lane( - ctx: &mut C, - arg0: Type, - arg1: Reg, - arg2: &MemArg, - arg3: u8, -) -> Reg { - let pattern0_0 = arg0; - if let Some((pattern1_0, pattern1_1)) = C::multi_lane(ctx, pattern0_0) { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - let pattern4_0 = arg3; - // Rule at src/isa/s390x/inst.isle line 2610. - let expr0_0 = C::temp_writable_reg(ctx, pattern0_0); - let expr1_0 = MInst::VecLoadLane { - size: pattern1_0, - rd: expr0_0, - ri: pattern2_0, - mem: pattern3_0.clone(), - lane_imm: pattern4_0, - }; - let expr2_0 = C::emit(ctx, &expr1_0); - let expr3_0 = C::writable_reg_to_reg(ctx, expr0_0); - return expr3_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "vec_load_lane", "src/isa/s390x/inst.isle line 2609" - ); -} - -// Generated as internal constructor for term vec_load_lane_undef. -pub fn constructor_vec_load_lane_undef( - ctx: &mut C, - arg0: Type, - arg1: &MemArg, - arg2: u8, -) -> Reg { - let pattern0_0 = arg0; - if let Some((pattern1_0, pattern1_1)) = C::multi_lane(ctx, pattern0_0) { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 2617. - let expr0_0 = C::temp_writable_reg(ctx, pattern0_0); - let expr1_0 = MInst::VecLoadLaneUndef { - size: pattern1_0, - rd: expr0_0, - mem: pattern2_0.clone(), - lane_imm: pattern3_0, - }; - let expr2_0 = C::emit(ctx, &expr1_0); - let expr3_0 = C::writable_reg_to_reg(ctx, expr0_0); - return expr3_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "vec_load_lane_undef", "src/isa/s390x/inst.isle line 2616" - ); -} - -// Generated as internal constructor for term vec_load_lane_rev. -pub fn constructor_vec_load_lane_rev( - ctx: &mut C, - arg0: Type, - arg1: Reg, - arg2: &MemArg, - arg3: u8, -) -> Reg { - let pattern0_0 = arg0; - if let Some((pattern1_0, pattern1_1)) = C::multi_lane(ctx, pattern0_0) { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - let pattern4_0 = arg3; - // Rule at src/isa/s390x/inst.isle line 2624. - let expr0_0 = C::temp_writable_reg(ctx, pattern0_0); - let expr1_0 = MInst::VecLoadLaneRev { - size: pattern1_0, - rd: expr0_0, - ri: pattern2_0, - mem: pattern3_0.clone(), - lane_imm: pattern4_0, - }; - let expr2_0 = C::emit(ctx, &expr1_0); - let expr3_0 = C::writable_reg_to_reg(ctx, expr0_0); - return expr3_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "vec_load_lane_rev", "src/isa/s390x/inst.isle line 2623" - ); -} - -// Generated as internal constructor for term vec_load_lane_rev_undef. -pub fn constructor_vec_load_lane_rev_undef( - ctx: &mut C, - arg0: Type, - arg1: &MemArg, - arg2: u8, -) -> Reg { - let pattern0_0 = arg0; - if let Some((pattern1_0, pattern1_1)) = C::multi_lane(ctx, pattern0_0) { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 2631. - let expr0_0 = C::temp_writable_reg(ctx, pattern0_0); - let expr1_0 = MInst::VecLoadLaneRevUndef { - size: pattern1_0, - rd: expr0_0, - mem: pattern2_0.clone(), - lane_imm: pattern3_0, - }; - let expr2_0 = C::emit(ctx, &expr1_0); - let expr3_0 = C::writable_reg_to_reg(ctx, expr0_0); - return expr3_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "vec_load_lane_rev_undef", "src/isa/s390x/inst.isle line 2630" - ); -} - -// Generated as internal constructor for term vec_store_lane. -pub fn constructor_vec_store_lane( - ctx: &mut C, - arg0: Type, - arg1: Reg, - arg2: &MemArg, - arg3: u8, -) -> SideEffectNoResult { - let pattern0_0 = arg0; - if let Some((pattern1_0, pattern1_1)) = C::multi_lane(ctx, pattern0_0) { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - let pattern4_0 = arg3; - // Rule at src/isa/s390x/inst.isle line 2638. - let expr0_0 = MInst::VecStoreLane { - size: pattern1_0, - rd: pattern2_0, - mem: pattern3_0.clone(), - lane_imm: pattern4_0, - }; - let expr1_0 = SideEffectNoResult::Inst { inst: expr0_0 }; - return expr1_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "vec_store_lane", "src/isa/s390x/inst.isle line 2637" - ); -} - -// Generated as internal constructor for term vec_store_lane_rev. -pub fn constructor_vec_store_lane_rev( - ctx: &mut C, - arg0: Type, - arg1: Reg, - arg2: &MemArg, - arg3: u8, -) -> SideEffectNoResult { - let pattern0_0 = arg0; - if let Some((pattern1_0, pattern1_1)) = C::multi_lane(ctx, pattern0_0) { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - let pattern4_0 = arg3; - // Rule at src/isa/s390x/inst.isle line 2643. - let expr0_0 = MInst::VecStoreLaneRev { - size: pattern1_0, - rd: pattern2_0, - mem: pattern3_0.clone(), - lane_imm: pattern4_0, - }; - let expr1_0 = SideEffectNoResult::Inst { inst: expr0_0 }; - return expr1_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "vec_store_lane_rev", "src/isa/s390x/inst.isle line 2642" - ); -} - -// Generated as internal constructor for term vec_insert_lane. -pub fn constructor_vec_insert_lane( - ctx: &mut C, - arg0: Type, - arg1: Reg, - arg2: Reg, - arg3: u8, - arg4: Reg, -) -> Reg { - let pattern0_0 = arg0; - if let Some((pattern1_0, pattern1_1)) = C::multi_lane(ctx, pattern0_0) { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - let pattern4_0 = arg3; - let pattern5_0 = arg4; - // Rule at src/isa/s390x/inst.isle line 2648. - let expr0_0 = C::temp_writable_reg(ctx, pattern0_0); - let expr1_0 = MInst::VecInsertLane { - size: pattern1_0, - rd: expr0_0, - ri: pattern2_0, - rn: pattern3_0, - lane_imm: pattern4_0, - lane_reg: pattern5_0, - }; - let expr2_0 = C::emit(ctx, &expr1_0); - let expr3_0 = C::writable_reg_to_reg(ctx, expr0_0); - return expr3_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "vec_insert_lane", "src/isa/s390x/inst.isle line 2647" - ); -} - -// Generated as internal constructor for term vec_insert_lane_undef. -pub fn constructor_vec_insert_lane_undef( - ctx: &mut C, - arg0: Type, - arg1: Reg, - arg2: u8, - arg3: Reg, -) -> Reg { - let pattern0_0 = arg0; - if let Some((pattern1_0, pattern1_1)) = C::multi_lane(ctx, pattern0_0) { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - let pattern4_0 = arg3; - // Rule at src/isa/s390x/inst.isle line 2655. - let expr0_0 = C::temp_writable_reg(ctx, pattern0_0); - let expr1_0 = MInst::VecInsertLaneUndef { - size: pattern1_0, - rd: expr0_0, - rn: pattern2_0, - lane_imm: pattern3_0, - lane_reg: pattern4_0, - }; - let expr2_0 = C::emit(ctx, &expr1_0); - let expr3_0 = C::writable_reg_to_reg(ctx, expr0_0); - return expr3_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "vec_insert_lane_undef", "src/isa/s390x/inst.isle line 2654" - ); -} - -// Generated as internal constructor for term vec_extract_lane. -pub fn constructor_vec_extract_lane( - ctx: &mut C, - arg0: Type, - arg1: Reg, - arg2: u8, - arg3: Reg, -) -> Reg { - let pattern0_0 = arg0; - if let Some((pattern1_0, pattern1_1)) = C::multi_lane(ctx, pattern0_0) { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - let pattern4_0 = arg3; - // Rule at src/isa/s390x/inst.isle line 2662. - let expr0_0: Type = I64; - let expr1_0 = C::temp_writable_reg(ctx, expr0_0); - let expr2_0 = MInst::VecExtractLane { - size: pattern1_0, - rd: expr1_0, - rn: pattern2_0, - lane_imm: pattern3_0, - lane_reg: pattern4_0, - }; - let expr3_0 = C::emit(ctx, &expr2_0); - let expr4_0 = C::writable_reg_to_reg(ctx, expr1_0); - return expr4_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "vec_extract_lane", "src/isa/s390x/inst.isle line 2661" - ); -} - -// Generated as internal constructor for term vec_insert_lane_imm. -pub fn constructor_vec_insert_lane_imm( - ctx: &mut C, - arg0: Type, - arg1: Reg, - arg2: i16, - arg3: u8, -) -> Reg { - let pattern0_0 = arg0; - if let Some((pattern1_0, pattern1_1)) = C::multi_lane(ctx, pattern0_0) { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - let pattern4_0 = arg3; - // Rule at src/isa/s390x/inst.isle line 2669. - let expr0_0 = C::temp_writable_reg(ctx, pattern0_0); - let expr1_0 = MInst::VecInsertLaneImm { - size: pattern1_0, - rd: expr0_0, - ri: pattern2_0, - imm: pattern3_0, - lane_imm: pattern4_0, - }; - let expr2_0 = C::emit(ctx, &expr1_0); - let expr3_0 = C::writable_reg_to_reg(ctx, expr0_0); - return expr3_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "vec_insert_lane_imm", "src/isa/s390x/inst.isle line 2668" - ); -} - -// Generated as internal constructor for term vec_replicate_lane. -pub fn constructor_vec_replicate_lane( - ctx: &mut C, - arg0: Type, - arg1: Reg, - arg2: u8, -) -> Reg { - let pattern0_0 = arg0; - if let Some((pattern1_0, pattern1_1)) = C::multi_lane(ctx, pattern0_0) { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 2676. - let expr0_0 = C::temp_writable_reg(ctx, pattern0_0); - let expr1_0 = MInst::VecReplicateLane { - size: pattern1_0, - rd: expr0_0, - rn: pattern2_0, - lane_imm: pattern3_0, - }; - let expr2_0 = C::emit(ctx, &expr1_0); - let expr3_0 = C::writable_reg_to_reg(ctx, expr0_0); - return expr3_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "vec_replicate_lane", "src/isa/s390x/inst.isle line 2675" - ); -} - -// Generated as internal constructor for term load_symbol_reloc. -pub fn constructor_load_symbol_reloc(ctx: &mut C, arg0: &SymbolReloc) -> Reg { - let pattern0_0 = arg0; - // Rule at src/isa/s390x/inst.isle line 2683. - let expr0_0: Type = I64; - let expr1_0 = C::temp_writable_reg(ctx, expr0_0); - let expr2_0 = C::box_symbol_reloc(ctx, pattern0_0); - let expr3_0 = MInst::LoadSymbolReloc { - rd: expr1_0, - symbol_reloc: expr2_0, - }; - let expr4_0 = C::emit(ctx, &expr3_0); - let expr5_0 = C::writable_reg_to_reg(ctx, expr1_0); - return expr5_0; -} - -// Generated as internal constructor for term load_addr. -pub fn constructor_load_addr(ctx: &mut C, arg0: &MemArg) -> Reg { - let pattern0_0 = arg0; - // Rule at src/isa/s390x/inst.isle line 2690. - let expr0_0: Type = I64; - let expr1_0 = C::temp_writable_reg(ctx, expr0_0); - let expr2_0 = MInst::LoadAddr { - rd: expr1_0, - mem: pattern0_0.clone(), - }; - let expr3_0 = C::emit(ctx, &expr2_0); - let expr4_0 = C::writable_reg_to_reg(ctx, expr1_0); - return expr4_0; -} - -// Generated as internal constructor for term call_impl. -pub fn constructor_call_impl( - ctx: &mut C, - arg0: WritableReg, - arg1: BoxCallInfo, -) -> SideEffectNoResult { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/s390x/inst.isle line 2697. - let expr0_0 = MInst::Call { - link: pattern0_0, - info: pattern1_0, - }; - let expr1_0 = SideEffectNoResult::Inst { inst: expr0_0 }; - return expr1_0; -} - -// Generated as internal constructor for term call_ind_impl. -pub fn constructor_call_ind_impl( - ctx: &mut C, - arg0: WritableReg, - arg1: BoxCallIndInfo, -) -> SideEffectNoResult { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/s390x/inst.isle line 2702. - let expr0_0 = MInst::CallInd { - link: pattern0_0, - info: pattern1_0, - }; - let expr1_0 = SideEffectNoResult::Inst { inst: expr0_0 }; - return expr1_0; -} - -// Generated as internal constructor for term jump_impl. -pub fn constructor_jump_impl(ctx: &mut C, arg0: MachLabel) -> SideEffectNoResult { - let pattern0_0 = arg0; - // Rule at src/isa/s390x/inst.isle line 2707. - let expr0_0 = MInst::Jump { dest: pattern0_0 }; - let expr1_0 = SideEffectNoResult::Inst { inst: expr0_0 }; - return expr1_0; -} - -// Generated as internal constructor for term cond_br. -pub fn constructor_cond_br( - ctx: &mut C, - arg0: MachLabel, - arg1: MachLabel, - arg2: &Cond, -) -> ConsumesFlags { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 2712. - let expr0_0 = MInst::CondBr { - taken: pattern0_0, - not_taken: pattern1_0, - cond: pattern2_0.clone(), - }; - let expr1_0 = ConsumesFlags::ConsumesFlagsSideEffect { inst: expr0_0 }; - return expr1_0; -} - -// Generated as internal constructor for term oneway_cond_br. -pub fn constructor_oneway_cond_br( - ctx: &mut C, - arg0: MachLabel, - arg1: &Cond, -) -> ConsumesFlags { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/s390x/inst.isle line 2717. - let expr0_0 = MInst::OneWayCondBr { - target: pattern0_0, - cond: pattern1_0.clone(), - }; - let expr1_0 = ConsumesFlags::ConsumesFlagsSideEffect { inst: expr0_0 }; - return expr1_0; -} - -// Generated as internal constructor for term jt_sequence. -pub fn constructor_jt_sequence( - ctx: &mut C, - arg0: Reg, - arg1: &VecMachLabel, -) -> SideEffectNoResult { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/s390x/inst.isle line 2722. - let expr0_0 = MInst::JTSequence { - ridx: pattern0_0, - targets: pattern1_0.clone(), - }; - let expr1_0 = SideEffectNoResult::Inst { inst: expr0_0 }; - return expr1_0; -} - -// Generated as internal constructor for term push_alu_reg. -pub fn constructor_push_alu_reg( - ctx: &mut C, - arg0: &VecMInstBuilder, - arg1: &ALUOp, - arg2: WritableReg, - arg3: Reg, - arg4: Reg, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - if let Some(pattern3_0) = C::real_reg(ctx, pattern2_0) { - let pattern4_0 = arg3; - let pattern5_0 = arg4; - // Rule at src/isa/s390x/inst.isle line 2760. - let expr0_0 = MInst::AluRRR { - alu_op: pattern1_0.clone(), - rd: pattern3_0, - rn: pattern4_0, - rm: pattern5_0, - }; - let expr1_0 = C::inst_builder_push(ctx, pattern0_0, &expr0_0); - let expr2_0 = C::writable_reg_to_reg(ctx, pattern3_0); - return expr2_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "push_alu_reg", "src/isa/s390x/inst.isle line 2759" - ); -} - -// Generated as internal constructor for term push_alu_uimm32shifted. -pub fn constructor_push_alu_uimm32shifted( - ctx: &mut C, - arg0: &VecMInstBuilder, - arg1: &ALUOp, - arg2: WritableReg, - arg3: Reg, - arg4: UImm32Shifted, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - if let Some(pattern3_0) = C::real_reg(ctx, pattern2_0) { - let pattern4_0 = arg3; - let pattern5_0 = arg4; - // Rule at src/isa/s390x/inst.isle line 2766. - let expr0_0 = MInst::AluRUImm32Shifted { - alu_op: pattern1_0.clone(), - rd: pattern3_0, - ri: pattern4_0, - imm: pattern5_0, - }; - let expr1_0 = C::inst_builder_push(ctx, pattern0_0, &expr0_0); - let expr2_0 = C::writable_reg_to_reg(ctx, pattern3_0); - return expr2_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "push_alu_uimm32shifted", "src/isa/s390x/inst.isle line 2765" - ); -} - -// Generated as internal constructor for term push_shift. -pub fn constructor_push_shift( - ctx: &mut C, - arg0: &VecMInstBuilder, - arg1: &ShiftOp, - arg2: WritableReg, - arg3: Reg, - arg4: u8, - arg5: Reg, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - if let Some(pattern3_0) = C::real_reg(ctx, pattern2_0) { - let pattern4_0 = arg3; - let pattern5_0 = arg4; - let pattern6_0 = arg5; - // Rule at src/isa/s390x/inst.isle line 2772. - let expr0_0 = MInst::ShiftRR { - shift_op: pattern1_0.clone(), - rd: pattern3_0, - rn: pattern4_0, - shift_imm: pattern5_0, - shift_reg: pattern6_0, - }; - let expr1_0 = C::inst_builder_push(ctx, pattern0_0, &expr0_0); - let expr2_0 = C::writable_reg_to_reg(ctx, pattern3_0); - return expr2_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "push_shift", "src/isa/s390x/inst.isle line 2771" - ); -} - -// Generated as internal constructor for term push_rxsbg. -pub fn constructor_push_rxsbg( - ctx: &mut C, - arg0: &VecMInstBuilder, - arg1: &RxSBGOp, - arg2: WritableReg, - arg3: Reg, - arg4: Reg, - arg5: u8, - arg6: u8, - arg7: i8, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - if let Some(pattern3_0) = C::real_reg(ctx, pattern2_0) { - let pattern4_0 = arg3; - let pattern5_0 = arg4; - let pattern6_0 = arg5; - let pattern7_0 = arg6; - let pattern8_0 = arg7; - let mut closure9 = || { - let expr0_0 = C::same_reg(ctx, pattern3_0, pattern4_0)?; - return Some(expr0_0); - }; - if let Some(pattern9_0) = closure9() { - // Rule at src/isa/s390x/inst.isle line 2779. - let expr0_0 = MInst::RxSBG { - op: pattern1_0.clone(), - rd: pattern3_0, - ri: pattern4_0, - rn: pattern5_0, - start_bit: pattern6_0, - end_bit: pattern7_0, - rotate_amt: pattern8_0, - }; - let expr1_0 = C::inst_builder_push(ctx, pattern0_0, &expr0_0); - let expr2_0 = C::writable_reg_to_reg(ctx, pattern3_0); - return expr2_0; - } - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "push_rxsbg", "src/isa/s390x/inst.isle line 2778" - ); -} - -// Generated as internal constructor for term push_unary. -pub fn constructor_push_unary( - ctx: &mut C, - arg0: &VecMInstBuilder, - arg1: &UnaryOp, - arg2: WritableReg, - arg3: Reg, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - if let Some(pattern3_0) = C::real_reg(ctx, pattern2_0) { - let pattern4_0 = arg3; - // Rule at src/isa/s390x/inst.isle line 2787. - let expr0_0 = MInst::UnaryRR { - op: pattern1_0.clone(), - rd: pattern3_0, - rn: pattern4_0, - }; - let expr1_0 = C::inst_builder_push(ctx, pattern0_0, &expr0_0); - let expr2_0 = C::writable_reg_to_reg(ctx, pattern3_0); - return expr2_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "push_unary", "src/isa/s390x/inst.isle line 2786" - ); -} - -// Generated as internal constructor for term push_atomic_cas32. -pub fn constructor_push_atomic_cas32( - ctx: &mut C, - arg0: &VecMInstBuilder, - arg1: WritableReg, - arg2: Reg, - arg3: &MemArg, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - if let Some(pattern2_0) = C::real_reg(ctx, pattern1_0) { - let pattern3_0 = arg2; - let pattern4_0 = arg3; - // Rule at src/isa/s390x/inst.isle line 2793. - let expr0_0 = C::writable_reg_to_reg(ctx, pattern2_0); - let expr1_0 = MInst::AtomicCas32 { - rd: pattern2_0, - ri: expr0_0, - rn: pattern3_0, - mem: pattern4_0.clone(), - }; - let expr2_0 = C::inst_builder_push(ctx, pattern0_0, &expr1_0); - let expr3_0 = C::writable_reg_to_reg(ctx, pattern2_0); - return expr3_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "push_atomic_cas32", "src/isa/s390x/inst.isle line 2792" - ); -} - -// Generated as internal constructor for term push_atomic_cas64. -pub fn constructor_push_atomic_cas64( - ctx: &mut C, - arg0: &VecMInstBuilder, - arg1: WritableReg, - arg2: Reg, - arg3: &MemArg, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - if let Some(pattern2_0) = C::real_reg(ctx, pattern1_0) { - let pattern3_0 = arg2; - let pattern4_0 = arg3; - // Rule at src/isa/s390x/inst.isle line 2799. - let expr0_0 = C::writable_reg_to_reg(ctx, pattern2_0); - let expr1_0 = MInst::AtomicCas64 { - rd: pattern2_0, - ri: expr0_0, - rn: pattern3_0, - mem: pattern4_0.clone(), - }; - let expr2_0 = C::inst_builder_push(ctx, pattern0_0, &expr1_0); - let expr3_0 = C::writable_reg_to_reg(ctx, pattern2_0); - return expr3_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "push_atomic_cas64", "src/isa/s390x/inst.isle line 2798" - ); -} - -// Generated as internal constructor for term push_break_if. -pub fn constructor_push_break_if( - ctx: &mut C, - arg0: &VecMInstBuilder, - arg1: &ProducesFlags, - arg2: &Cond, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - if let &ProducesFlags::ProducesFlagsSideEffect { - inst: ref pattern2_0, - } = pattern1_0 - { - let pattern3_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 2805. - let expr0_0 = C::inst_builder_push(ctx, pattern0_0, pattern2_0); - let expr1_0 = MInst::CondBreak { - cond: pattern3_0.clone(), - }; - let expr2_0 = C::inst_builder_push(ctx, pattern0_0, &expr1_0); - let expr3_0 = C::invalid_reg(ctx); - return expr3_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "push_break_if", "src/isa/s390x/inst.isle line 2804" - ); -} - -// Generated as internal constructor for term emit_loop. -pub fn constructor_emit_loop(ctx: &mut C, arg0: &VecMInstBuilder, arg1: &Cond) -> Unit { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/s390x/inst.isle line 2812. - let expr0_0 = C::inst_builder_finish(ctx, pattern0_0); - let expr1_0 = MInst::Loop { - body: expr0_0, - cond: pattern1_0.clone(), - }; - let expr2_0 = C::emit(ctx, &expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term copy_reg. -pub fn constructor_copy_reg(ctx: &mut C, arg0: Type, arg1: Reg) -> Reg { - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::gpr64_ty(ctx, pattern0_0) { - let pattern2_0 = arg1; - // Rule at src/isa/s390x/inst.isle line 2824. - let expr0_0 = C::temp_writable_reg(ctx, pattern1_0); - let expr1_0 = MInst::Mov64 { - rd: expr0_0, - rm: pattern2_0, - }; - let expr2_0 = C::emit(ctx, &expr1_0); - let expr3_0 = C::writable_reg_to_reg(ctx, expr0_0); - return expr3_0; - } - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::gpr32_ty(ctx, pattern0_0) { - let pattern2_0 = arg1; - // Rule at src/isa/s390x/inst.isle line 2820. - let expr0_0 = C::temp_writable_reg(ctx, pattern1_0); - let expr1_0 = MInst::Mov32 { - rd: expr0_0, - rm: pattern2_0, - }; - let expr2_0 = C::emit(ctx, &expr1_0); - let expr3_0 = C::writable_reg_to_reg(ctx, expr0_0); - return expr3_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "copy_reg", "src/isa/s390x/inst.isle line 2819" - ); -} - -// Generated as internal constructor for term emit_load. -pub fn constructor_emit_load( - ctx: &mut C, - arg0: Type, - arg1: WritableReg, - arg2: &MemArg, -) -> Unit { - let pattern0_0 = arg0; - if pattern0_0 == I32 { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 2831. - let expr0_0 = MInst::Load32 { - rd: pattern2_0, - mem: pattern3_0.clone(), - }; - let expr1_0 = C::emit(ctx, &expr0_0); - return expr1_0; - } - if pattern0_0 == I64 { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 2833. - let expr0_0 = MInst::Load64 { - rd: pattern2_0, - mem: pattern3_0.clone(), - }; - let expr1_0 = C::emit(ctx, &expr0_0); - return expr1_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "emit_load", "src/isa/s390x/inst.isle line 2830" - ); -} - -// Generated as internal constructor for term mov_preg. -pub fn constructor_mov_preg(ctx: &mut C, arg0: PReg) -> Reg { - let pattern0_0 = arg0; - // Rule at src/isa/s390x/inst.isle line 2838. - let expr0_0: Type = I64; - let expr1_0 = C::temp_writable_reg(ctx, expr0_0); - let expr2_0 = MInst::MovPReg { - rd: expr1_0, - rm: pattern0_0, - }; - let expr3_0 = C::emit(ctx, &expr2_0); - let expr4_0 = C::writable_reg_to_reg(ctx, expr1_0); - return expr4_0; -} - -// Generated as internal constructor for term sp. -pub fn constructor_sp(ctx: &mut C) -> Reg { - // Rule at src/isa/s390x/inst.isle line 2851. - let expr0_0 = C::preg_stack(ctx); - let expr1_0 = constructor_mov_preg(ctx, expr0_0); - return expr1_0; -} - -// Generated as internal constructor for term arg_store. -pub fn constructor_arg_store( - ctx: &mut C, - arg0: Type, - arg1: Reg, - arg2: &MemArg, -) -> SideEffectNoResult { - let pattern0_0 = arg0; - if pattern0_0 == I8 { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 2857. - let expr0_0 = constructor_store8(ctx, pattern2_0, pattern3_0); - return expr0_0; - } - if pattern0_0 == I16 { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 2858. - let expr0_0 = constructor_store16(ctx, pattern2_0, pattern3_0); - return expr0_0; - } - if pattern0_0 == I32 { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 2859. - let expr0_0 = constructor_store32(ctx, pattern2_0, pattern3_0); - return expr0_0; - } - if pattern0_0 == I64 { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 2860. - let expr0_0 = constructor_store64(ctx, pattern2_0, pattern3_0); - return expr0_0; - } - if pattern0_0 == R64 { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 2861. - let expr0_0 = constructor_store64(ctx, pattern2_0, pattern3_0); - return expr0_0; - } - if pattern0_0 == F32 { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 2862. - let expr0_0: Type = F32X4; - let expr1_0: u8 = 0i128 as u8; - let expr2_0 = constructor_vec_store_lane(ctx, expr0_0, pattern2_0, pattern3_0, expr1_0); - return expr2_0; - } - if pattern0_0 == F64 { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 2863. - let expr0_0: Type = F64X2; - let expr1_0: u8 = 0i128 as u8; - let expr2_0 = constructor_vec_store_lane(ctx, expr0_0, pattern2_0, pattern3_0, expr1_0); - return expr2_0; - } - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::vr128_ty(ctx, pattern0_0) { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 2864. - let expr0_0 = constructor_vec_store(ctx, pattern2_0, pattern3_0); - return expr0_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "arg_store", "src/isa/s390x/inst.isle line 2856" - ); -} - -// Generated as internal constructor for term arg_load. -pub fn constructor_arg_load(ctx: &mut C, arg0: Type, arg1: &MemArg) -> Reg { - let pattern0_0 = arg0; - if pattern0_0 == I8 { - let pattern2_0 = arg1; - // Rule at src/isa/s390x/inst.isle line 2867. - let expr0_0: Type = I8; - let expr1_0 = constructor_zext32_mem(ctx, expr0_0, pattern2_0); - return expr1_0; - } - if pattern0_0 == I16 { - let pattern2_0 = arg1; - // Rule at src/isa/s390x/inst.isle line 2868. - let expr0_0: Type = I16; - let expr1_0 = constructor_zext32_mem(ctx, expr0_0, pattern2_0); - return expr1_0; - } - if pattern0_0 == I32 { - let pattern2_0 = arg1; - // Rule at src/isa/s390x/inst.isle line 2869. - let expr0_0 = constructor_load32(ctx, pattern2_0); - return expr0_0; - } - if pattern0_0 == I64 { - let pattern2_0 = arg1; - // Rule at src/isa/s390x/inst.isle line 2870. - let expr0_0 = constructor_load64(ctx, pattern2_0); - return expr0_0; - } - if pattern0_0 == R64 { - let pattern2_0 = arg1; - // Rule at src/isa/s390x/inst.isle line 2871. - let expr0_0 = constructor_load64(ctx, pattern2_0); - return expr0_0; - } - if pattern0_0 == F32 { - let pattern2_0 = arg1; - // Rule at src/isa/s390x/inst.isle line 2872. - let expr0_0: Type = F32X4; - let expr1_0: u8 = 0i128 as u8; - let expr2_0 = constructor_vec_load_lane_undef(ctx, expr0_0, pattern2_0, expr1_0); - return expr2_0; - } - if pattern0_0 == F64 { - let pattern2_0 = arg1; - // Rule at src/isa/s390x/inst.isle line 2873. - let expr0_0: Type = F64X2; - let expr1_0: u8 = 0i128 as u8; - let expr2_0 = constructor_vec_load_lane_undef(ctx, expr0_0, pattern2_0, expr1_0); - return expr2_0; - } - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::vr128_ty(ctx, pattern0_0) { - let pattern2_0 = arg1; - // Rule at src/isa/s390x/inst.isle line 2874. - let expr0_0 = constructor_vec_load(ctx, pattern1_0, pattern2_0); - return expr0_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "arg_load", "src/isa/s390x/inst.isle line 2866" - ); -} - -// Generated as internal constructor for term vec_elt_rev. -pub fn constructor_vec_elt_rev(ctx: &mut C, arg0: Type, arg1: Reg) -> Reg { - let pattern0_0 = arg0; - if let Some((pattern1_0, pattern1_1)) = C::multi_lane(ctx, pattern0_0) { - if pattern1_0 == 8i128 as u32 { - if pattern1_1 == 16i128 as u32 { - let pattern4_0 = arg1; - // Rule at src/isa/s390x/inst.isle line 2886. - let expr0_0: Type = I64X2; - let expr1_0: u8 = 1i128 as u8; - let expr2_0: u8 = 0i128 as u8; - let expr3_0 = constructor_vec_permute_dw_imm( - ctx, expr0_0, pattern4_0, expr1_0, pattern4_0, expr2_0, - ); - let expr4_0: Type = I16X8; - let expr5_0: Type = I32X4; - let expr6_0: Type = I64X2; - let expr7_0: u8 = 32i128 as u8; - let expr8_0 = constructor_vec_rot_imm(ctx, expr6_0, expr3_0, expr7_0); - let expr9_0: u8 = 16i128 as u8; - let expr10_0 = constructor_vec_rot_imm(ctx, expr5_0, expr8_0, expr9_0); - let expr11_0: u8 = 8i128 as u8; - let expr12_0 = constructor_vec_rot_imm(ctx, expr4_0, expr10_0, expr11_0); - return expr12_0; - } - } - if pattern1_0 == 16i128 as u32 { - if pattern1_1 == 8i128 as u32 { - let pattern4_0 = arg1; - // Rule at src/isa/s390x/inst.isle line 2883. - let expr0_0: Type = I64X2; - let expr1_0: u8 = 1i128 as u8; - let expr2_0: u8 = 0i128 as u8; - let expr3_0 = constructor_vec_permute_dw_imm( - ctx, expr0_0, pattern4_0, expr1_0, pattern4_0, expr2_0, - ); - let expr4_0: Type = I32X4; - let expr5_0: Type = I64X2; - let expr6_0: u8 = 32i128 as u8; - let expr7_0 = constructor_vec_rot_imm(ctx, expr5_0, expr3_0, expr6_0); - let expr8_0: u8 = 16i128 as u8; - let expr9_0 = constructor_vec_rot_imm(ctx, expr4_0, expr7_0, expr8_0); - return expr9_0; - } - } - if pattern1_0 == 32i128 as u32 { - if pattern1_1 == 4i128 as u32 { - let pattern4_0 = arg1; - // Rule at src/isa/s390x/inst.isle line 2880. - let expr0_0: Type = I64X2; - let expr1_0: u8 = 1i128 as u8; - let expr2_0: u8 = 0i128 as u8; - let expr3_0 = constructor_vec_permute_dw_imm( - ctx, expr0_0, pattern4_0, expr1_0, pattern4_0, expr2_0, - ); - let expr4_0: Type = I64X2; - let expr5_0: u8 = 32i128 as u8; - let expr6_0 = constructor_vec_rot_imm(ctx, expr4_0, expr3_0, expr5_0); - return expr6_0; - } - } - if pattern1_0 == 64i128 as u32 { - if pattern1_1 == 2i128 as u32 { - let pattern4_0 = arg1; - // Rule at src/isa/s390x/inst.isle line 2878. - let expr0_0: Type = I64X2; - let expr1_0: u8 = 1i128 as u8; - let expr2_0: u8 = 0i128 as u8; - let expr3_0 = constructor_vec_permute_dw_imm( - ctx, expr0_0, pattern4_0, expr1_0, pattern4_0, expr2_0, - ); - return expr3_0; - } - } - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "vec_elt_rev", "src/isa/s390x/inst.isle line 2877" - ); -} - -// Generated as internal constructor for term abi_vec_elt_rev. -pub fn constructor_abi_vec_elt_rev( - ctx: &mut C, - arg0: &LaneOrder, - arg1: Type, - arg2: Reg, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - if let Some(pattern2_0) = C::gpr32_ty(ctx, pattern1_0) { - let pattern3_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 2894. - return pattern3_0; - } - let pattern0_0 = arg0; - let pattern1_0 = arg1; - if let Some(pattern2_0) = C::gpr64_ty(ctx, pattern1_0) { - let pattern3_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 2895. - return pattern3_0; - } - let pattern0_0 = arg0; - let pattern1_0 = arg1; - if let Some(pattern2_0) = C::ty_scalar_float(ctx, pattern1_0) { - let pattern3_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 2896. - return pattern3_0; - } - let pattern0_0 = arg0; - let pattern1_0 = arg1; - if let Some(pattern2_0) = C::vr128_ty(ctx, pattern1_0) { - let pattern3_0 = arg2; - let mut closure4 = || { - let expr0_0 = C::lane_order(ctx); - let expr1_0 = constructor_lane_order_equal(ctx, pattern0_0, &expr0_0); - return Some(expr1_0); - }; - if let Some(pattern4_0) = closure4() { - if pattern4_0 == false { - // Rule at src/isa/s390x/inst.isle line 2900. - let expr0_0 = constructor_vec_elt_rev(ctx, pattern2_0, pattern3_0); - return expr0_0; - } - } - } - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let mut closure3 = || { - let expr0_0 = C::lane_order(ctx); - let expr1_0 = constructor_lane_order_equal(ctx, pattern0_0, &expr0_0); - return Some(expr1_0); - }; - if let Some(pattern3_0) = closure3() { - if pattern3_0 == true { - // Rule at src/isa/s390x/inst.isle line 2897. - return pattern2_0; - } - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "abi_vec_elt_rev", "src/isa/s390x/inst.isle line 2893" - ); -} - -// Generated as internal constructor for term memcpy. -pub fn constructor_memcpy( - ctx: &mut C, - arg0: &MemArg, - arg1: &MemArg, - arg2: u64, -) -> SideEffectNoResult { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - if let Some(pattern3_0) = C::len_minus_one(ctx, pattern2_0) { - // Rule at src/isa/s390x/inst.isle line 2906. - let expr0_0 = constructor_memarg_pair(ctx, pattern0_0); - let expr1_0 = constructor_memarg_pair(ctx, pattern1_0); - let expr2_0 = constructor_mvc(ctx, &expr0_0, &expr1_0, pattern3_0); - return expr2_0; - } - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 2908. - let expr0_0 = constructor_load_addr(ctx, pattern0_0); - let expr1_0 = constructor_load_addr(ctx, pattern1_0); - let expr2_0: Type = I64; - let expr3_0 = constructor_imm(ctx, expr2_0, pattern2_0); - let expr4_0 = C::lib_call_info_memcpy(ctx, expr0_0, expr1_0, expr3_0); - let expr5_0 = C::lib_accumulate_outgoing_args_size(ctx, &expr4_0); - let expr6_0 = constructor_lib_call(ctx, &expr4_0); - return expr6_0; -} - -// Generated as internal constructor for term copy_to_buffer. -pub fn constructor_copy_to_buffer( - ctx: &mut C, - arg0: i64, - arg1: &ABIArg, - arg2: Value, -) -> InstOutput { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - if let Some(pattern2_0) = C::abi_arg_only_slot(ctx, pattern1_0) { - let pattern3_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 2915. - let expr0_0 = C::output_none(ctx); - return expr0_0; - } - let pattern0_0 = arg0; - let pattern1_0 = arg1; - if let Some((pattern2_0, pattern2_1, pattern2_2)) = C::abi_arg_struct_pointer(ctx, pattern1_0) { - let pattern3_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 2916. - let expr0_0 = C::memarg_stack_off(ctx, pattern0_0, pattern2_1); - let expr1_0 = C::put_in_reg(ctx, pattern3_0); - let expr2_0: i64 = 0i128 as i64; - let expr3_0: u8 = 0i128 as u8; - let expr4_0 = C::memflags_trusted(ctx); - let expr5_0 = C::memarg_reg_plus_off(ctx, expr1_0, expr2_0, expr3_0, expr4_0); - let expr6_0 = constructor_memcpy(ctx, &expr0_0, &expr5_0, pattern2_2); - let expr7_0 = constructor_side_effect(ctx, &expr6_0); - return expr7_0; - } - let pattern0_0 = arg0; - let pattern1_0 = arg1; - if let Some((pattern2_0, pattern2_1, pattern2_2)) = C::abi_arg_implicit_pointer(ctx, pattern1_0) - { - let pattern3_0 = arg2; - let pattern4_0 = C::value_type(ctx, pattern3_0); - if pattern4_0 == pattern2_2 { - // Rule at src/isa/s390x/inst.isle line 2920. - let expr0_0 = C::put_in_reg(ctx, pattern3_0); - let expr1_0 = C::memarg_stack_off(ctx, pattern0_0, pattern2_1); - let expr2_0 = constructor_arg_store(ctx, pattern2_2, expr0_0, &expr1_0); - let expr3_0 = constructor_side_effect(ctx, &expr2_0); - return expr3_0; - } - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "copy_to_buffer", "src/isa/s390x/inst.isle line 2914" - ); -} - -// Generated as internal constructor for term copy_to_arg. -pub fn constructor_copy_to_arg( - ctx: &mut C, - arg0: &CallArgListBuilder, - arg1: &LaneOrder, - arg2: i64, - arg3: &ABIArg, - arg4: Value, -) -> InstOutput { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - if let Some(pattern4_0) = C::abi_arg_only_slot(ctx, pattern3_0) { - let pattern5_0 = arg4; - // Rule at src/isa/s390x/inst.isle line 2927. - let expr0_0 = constructor_prepare_arg_val(ctx, &pattern4_0, pattern5_0); - let expr1_0 = constructor_copy_reg_to_arg_slot( - ctx, - pattern0_0, - pattern1_0, - pattern2_0, - &pattern4_0, - expr0_0, - ); - return expr1_0; - } - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - if let Some((pattern4_0, pattern4_1, pattern4_2)) = C::abi_arg_struct_pointer(ctx, pattern3_0) { - let pattern5_0 = arg4; - // Rule at src/isa/s390x/inst.isle line 2929. - let expr0_0 = C::memarg_stack_off(ctx, pattern2_0, pattern4_1); - let expr1_0 = constructor_load_addr(ctx, &expr0_0); - let expr2_0 = constructor_copy_reg_to_arg_slot( - ctx, - pattern0_0, - pattern1_0, - pattern2_0, - &pattern4_0, - expr1_0, - ); - return expr2_0; - } - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - if let Some((pattern4_0, pattern4_1, pattern4_2)) = C::abi_arg_implicit_pointer(ctx, pattern3_0) - { - let pattern5_0 = arg4; - // Rule at src/isa/s390x/inst.isle line 2932. - let expr0_0 = C::memarg_stack_off(ctx, pattern2_0, pattern4_1); - let expr1_0 = constructor_load_addr(ctx, &expr0_0); - let expr2_0 = constructor_copy_reg_to_arg_slot( - ctx, - pattern0_0, - pattern1_0, - pattern2_0, - &pattern4_0, - expr1_0, - ); - return expr2_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "copy_to_arg", "src/isa/s390x/inst.isle line 2926" - ); -} - -// Generated as internal constructor for term copy_from_arg. -pub fn constructor_copy_from_arg( - ctx: &mut C, - arg0: &CallRetList, - arg1: &LaneOrder, - arg2: i64, - arg3: &ABIArg, -) -> ValueRegs { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - if let Some(pattern4_0) = C::abi_arg_only_slot(ctx, pattern3_0) { - // Rule at src/isa/s390x/inst.isle line 2938. - let expr0_0 = constructor_copy_reg_from_arg_slot( - ctx, - pattern0_0, - pattern1_0, - pattern2_0, - &pattern4_0, - ); - let expr1_0 = C::value_reg(ctx, expr0_0); - return expr1_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "copy_from_arg", "src/isa/s390x/inst.isle line 2937" - ); -} - -// Generated as internal constructor for term prepare_arg_val. -pub fn constructor_prepare_arg_val(ctx: &mut C, arg0: &ABIArgSlot, arg1: Value) -> Reg { - let pattern0_0 = arg0; - if let &ABIArgSlot::Reg { - reg: pattern1_0, - ty: pattern1_1, - extension: ref pattern1_2, - } = pattern0_0 - { - if pattern1_1 == R64 { - if let &ArgumentExtension::None = pattern1_2 { - let pattern4_0 = arg1; - // Rule at src/isa/s390x/inst.isle line 2945. - let expr0_0: Type = I64; - let expr1_0 = C::put_in_reg(ctx, pattern4_0); - let expr2_0 = constructor_copy_reg(ctx, expr0_0, expr1_0); - return expr2_0; - } - } - } - let pattern0_0 = arg0; - match pattern0_0 { - &ABIArgSlot::Stack { - offset: pattern1_0, - ty: pattern1_1, - extension: ref pattern1_2, - } => { - match pattern1_2 { - &ArgumentExtension::None => { - let pattern3_0 = arg1; - // Rule at src/isa/s390x/inst.isle line 2953. - let expr0_0 = C::put_in_reg(ctx, pattern3_0); - return expr0_0; - } - &ArgumentExtension::Uext => { - let pattern3_0 = arg1; - // Rule at src/isa/s390x/inst.isle line 2955. - let expr0_0 = constructor_put_in_reg_zext64(ctx, pattern3_0); - return expr0_0; - } - &ArgumentExtension::Sext => { - let pattern3_0 = arg1; - // Rule at src/isa/s390x/inst.isle line 2957. - let expr0_0 = constructor_put_in_reg_sext64(ctx, pattern3_0); - return expr0_0; - } - _ => {} - } - } - &ABIArgSlot::Reg { - reg: pattern1_0, - ty: pattern1_1, - extension: ref pattern1_2, - } => { - match pattern1_2 { - &ArgumentExtension::None => { - let pattern3_0 = arg1; - // Rule at src/isa/s390x/inst.isle line 2947. - let expr0_0 = C::put_in_reg(ctx, pattern3_0); - return expr0_0; - } - &ArgumentExtension::Uext => { - let pattern3_0 = arg1; - // Rule at src/isa/s390x/inst.isle line 2949. - let expr0_0 = constructor_put_in_reg_zext64(ctx, pattern3_0); - return expr0_0; - } - &ArgumentExtension::Sext => { - let pattern3_0 = arg1; - // Rule at src/isa/s390x/inst.isle line 2951. - let expr0_0 = constructor_put_in_reg_sext64(ctx, pattern3_0); - return expr0_0; - } - _ => {} - } - } - _ => {} - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "prepare_arg_val", "src/isa/s390x/inst.isle line 2944" - ); -} - -// Generated as internal constructor for term copy_reg_to_arg_slot. -pub fn constructor_copy_reg_to_arg_slot( - ctx: &mut C, - arg0: &CallArgListBuilder, - arg1: &LaneOrder, - arg2: i64, - arg3: &ABIArgSlot, - arg4: Reg, -) -> InstOutput { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - match pattern3_0 { - &ABIArgSlot::Stack { - offset: pattern4_0, - ty: pattern4_1, - extension: ref pattern4_2, - } => { - let pattern5_0 = arg4; - // Rule at src/isa/s390x/inst.isle line 2966. - let expr0_0 = constructor_abi_ext_ty(ctx, pattern4_2, pattern4_1); - let expr1_0 = C::memarg_stack_off(ctx, pattern2_0, pattern4_0); - let expr2_0 = constructor_arg_store(ctx, expr0_0, pattern5_0, &expr1_0); - let expr3_0 = constructor_side_effect(ctx, &expr2_0); - return expr3_0; - } - &ABIArgSlot::Reg { - reg: pattern4_0, - ty: pattern4_1, - extension: ref pattern4_2, - } => { - let pattern5_0 = arg4; - // Rule at src/isa/s390x/inst.isle line 2963. - let expr0_0 = constructor_abi_vec_elt_rev(ctx, pattern1_0, pattern4_1, pattern5_0); - let expr1_0 = C::args_builder_push(ctx, pattern0_0, expr0_0, pattern4_0); - let expr2_0 = C::output_none(ctx); - return expr2_0; - } - _ => {} - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "copy_reg_to_arg_slot", "src/isa/s390x/inst.isle line 2962" - ); -} - -// Generated as internal constructor for term copy_reg_from_arg_slot. -pub fn constructor_copy_reg_from_arg_slot( - ctx: &mut C, - arg0: &CallRetList, - arg1: &LaneOrder, - arg2: i64, - arg3: &ABIArgSlot, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - match pattern3_0 { - &ABIArgSlot::Stack { - offset: pattern4_0, - ty: pattern4_1, - extension: ref pattern4_2, - } => { - // Rule at src/isa/s390x/inst.isle line 2973. - let expr0_0 = constructor_abi_ext_ty(ctx, pattern4_2, pattern4_1); - let expr1_0 = C::memarg_stack_off(ctx, pattern2_0, pattern4_0); - let expr2_0 = constructor_arg_load(ctx, expr0_0, &expr1_0); - return expr2_0; - } - &ABIArgSlot::Reg { - reg: pattern4_0, - ty: pattern4_1, - extension: ref pattern4_2, - } => { - // Rule at src/isa/s390x/inst.isle line 2971. - let expr0_0 = C::defs_lookup(ctx, pattern0_0, pattern4_0); - let expr1_0 = constructor_abi_vec_elt_rev(ctx, pattern1_0, pattern4_1, expr0_0); - return expr1_0; - } - _ => {} - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "copy_reg_from_arg_slot", "src/isa/s390x/inst.isle line 2970" - ); -} - -// Generated as internal constructor for term abi_ext_ty. -pub fn constructor_abi_ext_ty( - ctx: &mut C, - arg0: &ArgumentExtension, - arg1: Type, -) -> Type { - let pattern0_0 = arg0; - match pattern0_0 { - &ArgumentExtension::None => { - let pattern2_0 = arg1; - // Rule at src/isa/s390x/inst.isle line 2978. - return pattern2_0; - } - &ArgumentExtension::Uext => { - let pattern2_0 = arg1; - // Rule at src/isa/s390x/inst.isle line 2979. - let expr0_0: Type = I64; - return expr0_0; - } - &ArgumentExtension::Sext => { - let pattern2_0 = arg1; - // Rule at src/isa/s390x/inst.isle line 2980. - let expr0_0: Type = I64; - return expr0_0; - } - _ => {} - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "abi_ext_ty", "src/isa/s390x/inst.isle line 2977" - ); -} - -// Generated as internal constructor for term imm. -pub fn constructor_imm(ctx: &mut C, arg0: Type, arg1: u64) -> Reg { - let pattern0_0 = arg0; - if pattern0_0 == F32 { - let pattern2_0 = arg1; - // Rule at src/isa/s390x/inst.isle line 3052. - let expr0_0: Type = F32; - let expr1_0 = C::temp_writable_reg(ctx, expr0_0); - let expr2_0 = C::u64_as_u32(ctx, pattern2_0); - let expr3_0 = MInst::LoadFpuConst32 { - rd: expr1_0, - const_data: expr2_0, - }; - let expr4_0 = C::emit(ctx, &expr3_0); - let expr5_0 = C::writable_reg_to_reg(ctx, expr1_0); - return expr5_0; - } - if pattern0_0 == F64 { - let pattern2_0 = arg1; - // Rule at src/isa/s390x/inst.isle line 3059. - let expr0_0: Type = F64; - let expr1_0 = C::temp_writable_reg(ctx, expr0_0); - let expr2_0 = MInst::LoadFpuConst64 { - rd: expr1_0, - const_data: pattern2_0, - }; - let expr3_0 = C::emit(ctx, &expr2_0); - let expr4_0 = C::writable_reg_to_reg(ctx, expr1_0); - return expr4_0; - } - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::fits_in_16(ctx, pattern0_0) { - let pattern2_0 = arg1; - // Rule at src/isa/s390x/inst.isle line 2989. - let expr0_0 = C::temp_writable_reg(ctx, pattern1_0); - let expr1_0 = C::u64_as_i16(ctx, pattern2_0); - let expr2_0 = MInst::Mov32SImm16 { - rd: expr0_0, - imm: expr1_0, - }; - let expr3_0 = C::emit(ctx, &expr2_0); - let expr4_0 = C::writable_reg_to_reg(ctx, expr0_0); - return expr4_0; - } - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::gpr32_ty(ctx, pattern0_0) { - let pattern2_0 = arg1; - if let Some(pattern3_0) = C::i16_from_u64(ctx, pattern2_0) { - // Rule at src/isa/s390x/inst.isle line 2995. - let expr0_0 = C::temp_writable_reg(ctx, pattern1_0); - let expr1_0 = MInst::Mov32SImm16 { - rd: expr0_0, - imm: pattern3_0, - }; - let expr2_0 = C::emit(ctx, &expr1_0); - let expr3_0 = C::writable_reg_to_reg(ctx, expr0_0); - return expr3_0; - } - } - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::gpr32_ty(ctx, pattern0_0) { - let pattern2_0 = arg1; - // Rule at src/isa/s390x/inst.isle line 3001. - let expr0_0 = C::temp_writable_reg(ctx, pattern1_0); - let expr1_0 = C::u64_as_u32(ctx, pattern2_0); - let expr2_0 = MInst::Mov32Imm { - rd: expr0_0, - imm: expr1_0, - }; - let expr3_0 = C::emit(ctx, &expr2_0); - let expr4_0 = C::writable_reg_to_reg(ctx, expr0_0); - return expr4_0; - } - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::gpr64_ty(ctx, pattern0_0) { - let pattern2_0 = arg1; - if let Some(pattern3_0) = C::i16_from_u64(ctx, pattern2_0) { - // Rule at src/isa/s390x/inst.isle line 3007. - let expr0_0 = C::temp_writable_reg(ctx, pattern1_0); - let expr1_0 = MInst::Mov64SImm16 { - rd: expr0_0, - imm: pattern3_0, - }; - let expr2_0 = C::emit(ctx, &expr1_0); - let expr3_0 = C::writable_reg_to_reg(ctx, expr0_0); - return expr3_0; - } - } - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::gpr64_ty(ctx, pattern0_0) { - let pattern2_0 = arg1; - if let Some(pattern3_0) = C::i32_from_u64(ctx, pattern2_0) { - // Rule at src/isa/s390x/inst.isle line 3013. - let expr0_0 = C::temp_writable_reg(ctx, pattern1_0); - let expr1_0 = MInst::Mov64SImm32 { - rd: expr0_0, - imm: pattern3_0, - }; - let expr2_0 = C::emit(ctx, &expr1_0); - let expr3_0 = C::writable_reg_to_reg(ctx, expr0_0); - return expr3_0; - } - } - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::gpr64_ty(ctx, pattern0_0) { - let pattern2_0 = arg1; - if let Some(pattern3_0) = C::uimm16shifted_from_u64(ctx, pattern2_0) { - // Rule at src/isa/s390x/inst.isle line 3019. - let expr0_0 = C::temp_writable_reg(ctx, pattern1_0); - let expr1_0 = MInst::Mov64UImm16Shifted { - rd: expr0_0, - imm: pattern3_0, - }; - let expr2_0 = C::emit(ctx, &expr1_0); - let expr3_0 = C::writable_reg_to_reg(ctx, expr0_0); - return expr3_0; - } - } - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::gpr64_ty(ctx, pattern0_0) { - let pattern2_0 = arg1; - if let Some(pattern3_0) = C::uimm32shifted_from_u64(ctx, pattern2_0) { - // Rule at src/isa/s390x/inst.isle line 3025. - let expr0_0 = C::temp_writable_reg(ctx, pattern1_0); - let expr1_0 = MInst::Mov64UImm32Shifted { - rd: expr0_0, - imm: pattern3_0, - }; - let expr2_0 = C::emit(ctx, &expr1_0); - let expr3_0 = C::writable_reg_to_reg(ctx, expr0_0); - return expr3_0; - } - } - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::gpr64_ty(ctx, pattern0_0) { - let pattern2_0 = arg1; - if let Some(pattern3_0) = C::u64_nonzero_hipart(ctx, pattern2_0) { - if let Some(pattern4_0) = C::u64_nonzero_lopart(ctx, pattern2_0) { - // Rule at src/isa/s390x/inst.isle line 3031. - let expr0_0 = constructor_imm(ctx, pattern1_0, pattern3_0); - let expr1_0 = constructor_insert_imm(ctx, pattern1_0, expr0_0, pattern4_0); - return expr1_0; - } - } - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "imm", "src/isa/s390x/inst.isle line 2986" - ); -} - -// Generated as internal constructor for term insert_imm. -pub fn constructor_insert_imm(ctx: &mut C, arg0: Type, arg1: Reg, arg2: u64) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - if let Some(pattern3_0) = C::uimm16shifted_from_u64(ctx, pattern2_0) { - // Rule at src/isa/s390x/inst.isle line 3039. - let expr0_0 = C::temp_writable_reg(ctx, pattern0_0); - let expr1_0 = MInst::Insert64UImm16Shifted { - rd: expr0_0, - ri: pattern1_0, - imm: pattern3_0, - }; - let expr2_0 = C::emit(ctx, &expr1_0); - let expr3_0 = C::writable_reg_to_reg(ctx, expr0_0); - return expr3_0; - } - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - if let Some(pattern3_0) = C::uimm32shifted_from_u64(ctx, pattern2_0) { - // Rule at src/isa/s390x/inst.isle line 3045. - let expr0_0 = C::temp_writable_reg(ctx, pattern0_0); - let expr1_0 = MInst::Insert64UImm32Shifted { - rd: expr0_0, - ri: pattern1_0, - imm: pattern3_0, - }; - let expr2_0 = C::emit(ctx, &expr1_0); - let expr3_0 = C::writable_reg_to_reg(ctx, expr0_0); - return expr3_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "insert_imm", "src/isa/s390x/inst.isle line 3036" - ); -} - -// Generated as internal constructor for term imm32. -pub fn constructor_imm32(ctx: &mut C, arg0: Type, arg1: i32) -> Reg { - let pattern0_0 = arg0; - if pattern0_0 == I64 { - let pattern2_0 = arg1; - // Rule at src/isa/s390x/inst.isle line 3066. - let expr0_0: Type = I64; - let expr1_0 = C::temp_writable_reg(ctx, expr0_0); - let expr2_0 = MInst::Mov64SImm32 { - rd: expr1_0, - imm: pattern2_0, - }; - let expr3_0 = C::emit(ctx, &expr2_0); - let expr4_0 = C::writable_reg_to_reg(ctx, expr1_0); - return expr4_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "imm32", "src/isa/s390x/inst.isle line 3065" - ); -} - -// Generated as internal constructor for term vec_imm. -pub fn constructor_vec_imm(ctx: &mut C, arg0: Type, arg1: u128) -> Reg { - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::vr128_ty(ctx, pattern0_0) { - let pattern2_0 = arg1; - if pattern2_0 == 0i128 as u128 { - // Rule at src/isa/s390x/inst.isle line 3073. - let expr0_0: u16 = 0i128 as u16; - let expr1_0 = constructor_vec_imm_byte_mask(ctx, pattern1_0, expr0_0); - return expr1_0; - } - } - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::vr128_ty(ctx, pattern0_0) { - let pattern2_0 = arg1; - let (pattern3_0, pattern3_1) = C::u64_pair_split(ctx, pattern2_0); - if pattern3_1 == pattern3_0 { - // Rule at src/isa/s390x/inst.isle line 3075. - let expr0_0: Type = I64X2; - let expr1_0 = constructor_vec_imm_splat(ctx, expr0_0, pattern3_0); - return expr1_0; - } - } - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::vr128_ty(ctx, pattern0_0) { - let pattern2_0 = arg1; - // Rule at src/isa/s390x/inst.isle line 3077. - let expr0_0 = constructor_vec_load_const(ctx, pattern1_0, pattern2_0); - return expr0_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "vec_imm", "src/isa/s390x/inst.isle line 3072" - ); -} - -// Generated as internal constructor for term vec_imm_splat. -pub fn constructor_vec_imm_splat(ctx: &mut C, arg0: Type, arg1: u64) -> Reg { - let pattern0_0 = arg0; - if let Some((pattern1_0, pattern1_1)) = C::multi_lane(ctx, pattern0_0) { - if pattern1_0 == 16i128 as u32 { - let pattern3_0 = arg1; - let (pattern4_0, pattern4_1) = C::u32_pair_split(ctx, pattern3_0); - let (pattern5_0, pattern5_1) = C::u16_pair_split(ctx, pattern4_1); - let (pattern6_0, pattern6_1) = C::u8_pair_split(ctx, pattern5_1); - if pattern6_1 == pattern6_0 { - // Rule at src/isa/s390x/inst.isle line 3092. - let expr0_0: Type = I8X16; - let expr1_0 = C::u8_as_u64(ctx, pattern6_0); - let expr2_0 = constructor_vec_imm_splat(ctx, expr0_0, expr1_0); - return expr2_0; - } - } - if pattern1_0 == 32i128 as u32 { - let pattern3_0 = arg1; - let (pattern4_0, pattern4_1) = C::u32_pair_split(ctx, pattern3_0); - let (pattern5_0, pattern5_1) = C::u16_pair_split(ctx, pattern4_1); - if pattern5_1 == pattern5_0 { - // Rule at src/isa/s390x/inst.isle line 3094. - let expr0_0: Type = I16X8; - let expr1_0 = C::u16_as_u64(ctx, pattern5_0); - let expr2_0 = constructor_vec_imm_splat(ctx, expr0_0, expr1_0); - return expr2_0; - } - } - if pattern1_0 == 64i128 as u32 { - let pattern3_0 = arg1; - let (pattern4_0, pattern4_1) = C::u32_pair_split(ctx, pattern3_0); - if pattern4_1 == pattern4_0 { - // Rule at src/isa/s390x/inst.isle line 3096. - let expr0_0: Type = I32X4; - let expr1_0 = C::u32_as_u64(ctx, pattern4_0); - let expr2_0 = constructor_vec_imm_splat(ctx, expr0_0, expr1_0); - return expr2_0; - } - } - } - let pattern0_0 = arg0; - if let Some((pattern1_0, pattern1_1)) = C::multi_lane(ctx, pattern0_0) { - if pattern1_0 == 8i128 as u32 { - let pattern3_0 = arg1; - // Rule at src/isa/s390x/inst.isle line 3084. - let expr0_0 = C::u64_as_i16(ctx, pattern3_0); - let expr1_0 = constructor_vec_imm_replicate(ctx, pattern0_0, expr0_0); - return expr1_0; - } - if pattern1_0 == 16i128 as u32 { - let pattern3_0 = arg1; - // Rule at src/isa/s390x/inst.isle line 3086. - let expr0_0 = C::u64_as_i16(ctx, pattern3_0); - let expr1_0 = constructor_vec_imm_replicate(ctx, pattern0_0, expr0_0); - return expr1_0; - } - if pattern1_0 == 32i128 as u32 { - let pattern3_0 = arg1; - let (pattern4_0, pattern4_1) = C::u32_pair_split(ctx, pattern3_0); - if let Some(pattern5_0) = C::i16_from_u32(ctx, pattern4_1) { - // Rule at src/isa/s390x/inst.isle line 3088. - let expr0_0 = constructor_vec_imm_replicate(ctx, pattern0_0, pattern5_0); - return expr0_0; - } - } - if pattern1_0 == 64i128 as u32 { - let pattern3_0 = arg1; - if let Some(pattern4_0) = C::i16_from_u64(ctx, pattern3_0) { - // Rule at src/isa/s390x/inst.isle line 3090. - let expr0_0 = constructor_vec_imm_replicate(ctx, pattern0_0, pattern4_0); - return expr0_0; - } - } - } - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::ty_vec128(ctx, pattern0_0) { - let pattern2_0 = arg1; - if pattern2_0 == 0i128 as u64 { - // Rule at src/isa/s390x/inst.isle line 3082. - let expr0_0: u16 = 0i128 as u16; - let expr1_0 = constructor_vec_imm_byte_mask(ctx, pattern1_0, expr0_0); - return expr1_0; - } - } - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::ty_vec128(ctx, pattern0_0) { - let pattern2_0 = arg1; - // Rule at src/isa/s390x/inst.isle line 3098. - let expr0_0 = constructor_vec_load_const_replicate(ctx, pattern1_0, pattern2_0); - return expr0_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "vec_imm_splat", "src/isa/s390x/inst.isle line 3081" - ); -} - -// Generated as internal constructor for term ty_ext32. -pub fn constructor_ty_ext32(ctx: &mut C, arg0: Type) -> Type { - let pattern0_0 = arg0; - if pattern0_0 == I8 { - // Rule at src/isa/s390x/inst.isle line 3106. - let expr0_0: Type = I32; - return expr0_0; - } - if pattern0_0 == I16 { - // Rule at src/isa/s390x/inst.isle line 3107. - let expr0_0: Type = I32; - return expr0_0; - } - if pattern0_0 == I32 { - // Rule at src/isa/s390x/inst.isle line 3108. - let expr0_0: Type = I32; - return expr0_0; - } - if pattern0_0 == I64 { - // Rule at src/isa/s390x/inst.isle line 3109. - let expr0_0: Type = I64; - return expr0_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "ty_ext32", "src/isa/s390x/inst.isle line 3105" - ); -} - -// Generated as internal constructor for term ty_ext64. -pub fn constructor_ty_ext64(ctx: &mut C, arg0: Type) -> Type { - let pattern0_0 = arg0; - if pattern0_0 == I8 { - // Rule at src/isa/s390x/inst.isle line 3113. - let expr0_0: Type = I64; - return expr0_0; - } - if pattern0_0 == I16 { - // Rule at src/isa/s390x/inst.isle line 3114. - let expr0_0: Type = I64; - return expr0_0; - } - if pattern0_0 == I32 { - // Rule at src/isa/s390x/inst.isle line 3115. - let expr0_0: Type = I64; - return expr0_0; - } - if pattern0_0 == I64 { - // Rule at src/isa/s390x/inst.isle line 3116. - let expr0_0: Type = I64; - return expr0_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "ty_ext64", "src/isa/s390x/inst.isle line 3112" - ); -} - -// Generated as internal constructor for term zext32_reg. -pub fn constructor_zext32_reg(ctx: &mut C, arg0: Type, arg1: Reg) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/s390x/inst.isle line 3121. - let expr0_0: Type = I32; - let expr1_0 = C::temp_writable_reg(ctx, expr0_0); - let expr2_0: bool = false; - let expr3_0 = C::ty_bits(ctx, pattern0_0); - let expr4_0: u8 = 32i128 as u8; - let expr5_0 = MInst::Extend { - rd: expr1_0, - rn: pattern1_0, - signed: expr2_0, - from_bits: expr3_0, - to_bits: expr4_0, - }; - let expr6_0 = C::emit(ctx, &expr5_0); - let expr7_0 = C::writable_reg_to_reg(ctx, expr1_0); - return expr7_0; -} - -// Generated as internal constructor for term sext32_reg. -pub fn constructor_sext32_reg(ctx: &mut C, arg0: Type, arg1: Reg) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/s390x/inst.isle line 3128. - let expr0_0: Type = I32; - let expr1_0 = C::temp_writable_reg(ctx, expr0_0); - let expr2_0: bool = true; - let expr3_0 = C::ty_bits(ctx, pattern0_0); - let expr4_0: u8 = 32i128 as u8; - let expr5_0 = MInst::Extend { - rd: expr1_0, - rn: pattern1_0, - signed: expr2_0, - from_bits: expr3_0, - to_bits: expr4_0, - }; - let expr6_0 = C::emit(ctx, &expr5_0); - let expr7_0 = C::writable_reg_to_reg(ctx, expr1_0); - return expr7_0; -} - -// Generated as internal constructor for term zext64_reg. -pub fn constructor_zext64_reg(ctx: &mut C, arg0: Type, arg1: Reg) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/s390x/inst.isle line 3135. - let expr0_0: Type = I64; - let expr1_0 = C::temp_writable_reg(ctx, expr0_0); - let expr2_0: bool = false; - let expr3_0 = C::ty_bits(ctx, pattern0_0); - let expr4_0: u8 = 64i128 as u8; - let expr5_0 = MInst::Extend { - rd: expr1_0, - rn: pattern1_0, - signed: expr2_0, - from_bits: expr3_0, - to_bits: expr4_0, - }; - let expr6_0 = C::emit(ctx, &expr5_0); - let expr7_0 = C::writable_reg_to_reg(ctx, expr1_0); - return expr7_0; -} - -// Generated as internal constructor for term sext64_reg. -pub fn constructor_sext64_reg(ctx: &mut C, arg0: Type, arg1: Reg) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/s390x/inst.isle line 3142. - let expr0_0: Type = I64; - let expr1_0 = C::temp_writable_reg(ctx, expr0_0); - let expr2_0: bool = true; - let expr3_0 = C::ty_bits(ctx, pattern0_0); - let expr4_0: u8 = 64i128 as u8; - let expr5_0 = MInst::Extend { - rd: expr1_0, - rn: pattern1_0, - signed: expr2_0, - from_bits: expr3_0, - to_bits: expr4_0, - }; - let expr6_0 = C::emit(ctx, &expr5_0); - let expr7_0 = C::writable_reg_to_reg(ctx, expr1_0); - return expr7_0; -} - -// Generated as internal constructor for term zext32_mem. -pub fn constructor_zext32_mem(ctx: &mut C, arg0: Type, arg1: &MemArg) -> Reg { - let pattern0_0 = arg0; - if pattern0_0 == I8 { - let pattern2_0 = arg1; - // Rule at src/isa/s390x/inst.isle line 3150. - let expr0_0: Type = I32; - let expr1_0 = C::temp_writable_reg(ctx, expr0_0); - let expr2_0 = MInst::Load32ZExt8 { - rd: expr1_0, - mem: pattern2_0.clone(), - }; - let expr3_0 = C::emit(ctx, &expr2_0); - let expr4_0 = C::writable_reg_to_reg(ctx, expr1_0); - return expr4_0; - } - if pattern0_0 == I16 { - let pattern2_0 = arg1; - // Rule at src/isa/s390x/inst.isle line 3154. - let expr0_0: Type = I32; - let expr1_0 = C::temp_writable_reg(ctx, expr0_0); - let expr2_0 = MInst::Load32ZExt16 { - rd: expr1_0, - mem: pattern2_0.clone(), - }; - let expr3_0 = C::emit(ctx, &expr2_0); - let expr4_0 = C::writable_reg_to_reg(ctx, expr1_0); - return expr4_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "zext32_mem", "src/isa/s390x/inst.isle line 3149" - ); -} - -// Generated as internal constructor for term sext32_mem. -pub fn constructor_sext32_mem(ctx: &mut C, arg0: Type, arg1: &MemArg) -> Reg { - let pattern0_0 = arg0; - if pattern0_0 == I8 { - let pattern2_0 = arg1; - // Rule at src/isa/s390x/inst.isle line 3161. - let expr0_0: Type = I32; - let expr1_0 = C::temp_writable_reg(ctx, expr0_0); - let expr2_0 = MInst::Load32SExt8 { - rd: expr1_0, - mem: pattern2_0.clone(), - }; - let expr3_0 = C::emit(ctx, &expr2_0); - let expr4_0 = C::writable_reg_to_reg(ctx, expr1_0); - return expr4_0; - } - if pattern0_0 == I16 { - let pattern2_0 = arg1; - // Rule at src/isa/s390x/inst.isle line 3165. - let expr0_0: Type = I32; - let expr1_0 = C::temp_writable_reg(ctx, expr0_0); - let expr2_0 = MInst::Load32SExt16 { - rd: expr1_0, - mem: pattern2_0.clone(), - }; - let expr3_0 = C::emit(ctx, &expr2_0); - let expr4_0 = C::writable_reg_to_reg(ctx, expr1_0); - return expr4_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "sext32_mem", "src/isa/s390x/inst.isle line 3160" - ); -} - -// Generated as internal constructor for term zext64_mem. -pub fn constructor_zext64_mem(ctx: &mut C, arg0: Type, arg1: &MemArg) -> Reg { - let pattern0_0 = arg0; - if pattern0_0 == I8 { - let pattern2_0 = arg1; - // Rule at src/isa/s390x/inst.isle line 3172. - let expr0_0: Type = I64; - let expr1_0 = C::temp_writable_reg(ctx, expr0_0); - let expr2_0 = MInst::Load64ZExt8 { - rd: expr1_0, - mem: pattern2_0.clone(), - }; - let expr3_0 = C::emit(ctx, &expr2_0); - let expr4_0 = C::writable_reg_to_reg(ctx, expr1_0); - return expr4_0; - } - if pattern0_0 == I16 { - let pattern2_0 = arg1; - // Rule at src/isa/s390x/inst.isle line 3176. - let expr0_0: Type = I64; - let expr1_0 = C::temp_writable_reg(ctx, expr0_0); - let expr2_0 = MInst::Load64ZExt16 { - rd: expr1_0, - mem: pattern2_0.clone(), - }; - let expr3_0 = C::emit(ctx, &expr2_0); - let expr4_0 = C::writable_reg_to_reg(ctx, expr1_0); - return expr4_0; - } - if pattern0_0 == I32 { - let pattern2_0 = arg1; - // Rule at src/isa/s390x/inst.isle line 3180. - let expr0_0: Type = I64; - let expr1_0 = C::temp_writable_reg(ctx, expr0_0); - let expr2_0 = MInst::Load64ZExt32 { - rd: expr1_0, - mem: pattern2_0.clone(), - }; - let expr3_0 = C::emit(ctx, &expr2_0); - let expr4_0 = C::writable_reg_to_reg(ctx, expr1_0); - return expr4_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "zext64_mem", "src/isa/s390x/inst.isle line 3171" - ); -} - -// Generated as internal constructor for term sext64_mem. -pub fn constructor_sext64_mem(ctx: &mut C, arg0: Type, arg1: &MemArg) -> Reg { - let pattern0_0 = arg0; - if pattern0_0 == I8 { - let pattern2_0 = arg1; - // Rule at src/isa/s390x/inst.isle line 3187. - let expr0_0: Type = I64; - let expr1_0 = C::temp_writable_reg(ctx, expr0_0); - let expr2_0 = MInst::Load64SExt8 { - rd: expr1_0, - mem: pattern2_0.clone(), - }; - let expr3_0 = C::emit(ctx, &expr2_0); - let expr4_0 = C::writable_reg_to_reg(ctx, expr1_0); - return expr4_0; - } - if pattern0_0 == I16 { - let pattern2_0 = arg1; - // Rule at src/isa/s390x/inst.isle line 3191. - let expr0_0: Type = I64; - let expr1_0 = C::temp_writable_reg(ctx, expr0_0); - let expr2_0 = MInst::Load64SExt16 { - rd: expr1_0, - mem: pattern2_0.clone(), - }; - let expr3_0 = C::emit(ctx, &expr2_0); - let expr4_0 = C::writable_reg_to_reg(ctx, expr1_0); - return expr4_0; - } - if pattern0_0 == I32 { - let pattern2_0 = arg1; - // Rule at src/isa/s390x/inst.isle line 3195. - let expr0_0: Type = I64; - let expr1_0 = C::temp_writable_reg(ctx, expr0_0); - let expr2_0 = MInst::Load64SExt32 { - rd: expr1_0, - mem: pattern2_0.clone(), - }; - let expr3_0 = C::emit(ctx, &expr2_0); - let expr4_0 = C::writable_reg_to_reg(ctx, expr1_0); - return expr4_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "sext64_mem", "src/isa/s390x/inst.isle line 3186" - ); -} - -// Generated as internal constructor for term put_in_reg_zext32. -pub fn constructor_put_in_reg_zext32(ctx: &mut C, arg0: Value) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = C::value_type(ctx, pattern0_0); - if let Some(pattern2_0) = C::u64_from_value(ctx, pattern0_0) { - // Rule at src/isa/s390x/inst.isle line 3203. - let expr0_0 = constructor_ty_ext32(ctx, pattern1_0); - let expr1_0 = constructor_imm(ctx, expr0_0, pattern2_0); - return expr1_0; - } - let pattern0_0 = arg0; - let pattern1_0 = C::value_type(ctx, pattern0_0); - if let Some(pattern2_0) = C::ty_32_or_64(ctx, pattern1_0) { - // Rule at src/isa/s390x/inst.isle line 3209. - let expr0_0 = C::put_in_reg(ctx, pattern0_0); - return expr0_0; - } - let pattern0_0 = arg0; - let pattern1_0 = C::value_type(ctx, pattern0_0); - if let Some(pattern2_0) = C::fits_in_16(ctx, pattern1_0) { - if let Some(pattern3_0) = C::sinkable_inst(ctx, pattern0_0) { - let pattern4_0 = C::inst_data(ctx, pattern3_0); - if let &InstructionData::Load { - opcode: ref pattern5_0, - arg: pattern5_1, - flags: pattern5_2, - offset: pattern5_3, - } = &pattern4_0 - { - if let &Opcode::Load = pattern5_0 { - if let Some(()) = C::bigendian(ctx, pattern5_2) { - // Rule at src/isa/s390x/inst.isle line 3205. - let expr0_0 = constructor_sink_load(ctx, pattern3_0); - let expr1_0 = constructor_zext32_mem(ctx, pattern2_0, &expr0_0); - return expr1_0; - } - } - } - } - } - let pattern0_0 = arg0; - let pattern1_0 = C::value_type(ctx, pattern0_0); - if let Some(pattern2_0) = C::fits_in_16(ctx, pattern1_0) { - // Rule at src/isa/s390x/inst.isle line 3207. - let expr0_0 = C::put_in_reg(ctx, pattern0_0); - let expr1_0 = constructor_zext32_reg(ctx, pattern2_0, expr0_0); - return expr1_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "put_in_reg_zext32", "src/isa/s390x/inst.isle line 3202" - ); -} - -// Generated as internal constructor for term put_in_reg_sext32. -pub fn constructor_put_in_reg_sext32(ctx: &mut C, arg0: Value) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = C::value_type(ctx, pattern0_0); - if let Some(pattern2_0) = C::u64_from_signed_value(ctx, pattern0_0) { - // Rule at src/isa/s390x/inst.isle line 3214. - let expr0_0 = constructor_ty_ext32(ctx, pattern1_0); - let expr1_0 = constructor_imm(ctx, expr0_0, pattern2_0); - return expr1_0; - } - let pattern0_0 = arg0; - let pattern1_0 = C::value_type(ctx, pattern0_0); - if let Some(pattern2_0) = C::ty_32_or_64(ctx, pattern1_0) { - // Rule at src/isa/s390x/inst.isle line 3220. - let expr0_0 = C::put_in_reg(ctx, pattern0_0); - return expr0_0; - } - let pattern0_0 = arg0; - let pattern1_0 = C::value_type(ctx, pattern0_0); - if let Some(pattern2_0) = C::fits_in_16(ctx, pattern1_0) { - if let Some(pattern3_0) = C::sinkable_inst(ctx, pattern0_0) { - let pattern4_0 = C::inst_data(ctx, pattern3_0); - if let &InstructionData::Load { - opcode: ref pattern5_0, - arg: pattern5_1, - flags: pattern5_2, - offset: pattern5_3, - } = &pattern4_0 - { - if let &Opcode::Load = pattern5_0 { - if let Some(()) = C::bigendian(ctx, pattern5_2) { - // Rule at src/isa/s390x/inst.isle line 3216. - let expr0_0 = constructor_sink_load(ctx, pattern3_0); - let expr1_0 = constructor_sext32_mem(ctx, pattern2_0, &expr0_0); - return expr1_0; - } - } - } - } - } - let pattern0_0 = arg0; - let pattern1_0 = C::value_type(ctx, pattern0_0); - if let Some(pattern2_0) = C::fits_in_16(ctx, pattern1_0) { - // Rule at src/isa/s390x/inst.isle line 3218. - let expr0_0 = C::put_in_reg(ctx, pattern0_0); - let expr1_0 = constructor_sext32_reg(ctx, pattern2_0, expr0_0); - return expr1_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "put_in_reg_sext32", "src/isa/s390x/inst.isle line 3213" - ); -} - -// Generated as internal constructor for term put_in_reg_zext64. -pub fn constructor_put_in_reg_zext64(ctx: &mut C, arg0: Value) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = C::value_type(ctx, pattern0_0); - if let Some(pattern2_0) = C::u64_from_value(ctx, pattern0_0) { - // Rule at src/isa/s390x/inst.isle line 3225. - let expr0_0 = constructor_ty_ext64(ctx, pattern1_0); - let expr1_0 = constructor_imm(ctx, expr0_0, pattern2_0); - return expr1_0; - } - let pattern0_0 = arg0; - let pattern1_0 = C::value_type(ctx, pattern0_0); - if let Some(pattern2_0) = C::gpr64_ty(ctx, pattern1_0) { - // Rule at src/isa/s390x/inst.isle line 3231. - let expr0_0 = C::put_in_reg(ctx, pattern0_0); - return expr0_0; - } - let pattern0_0 = arg0; - let pattern1_0 = C::value_type(ctx, pattern0_0); - if let Some(pattern2_0) = C::gpr32_ty(ctx, pattern1_0) { - if let Some(pattern3_0) = C::sinkable_inst(ctx, pattern0_0) { - let pattern4_0 = C::inst_data(ctx, pattern3_0); - if let &InstructionData::Load { - opcode: ref pattern5_0, - arg: pattern5_1, - flags: pattern5_2, - offset: pattern5_3, - } = &pattern4_0 - { - if let &Opcode::Load = pattern5_0 { - if let Some(()) = C::bigendian(ctx, pattern5_2) { - // Rule at src/isa/s390x/inst.isle line 3227. - let expr0_0 = constructor_sink_load(ctx, pattern3_0); - let expr1_0 = constructor_zext64_mem(ctx, pattern2_0, &expr0_0); - return expr1_0; - } - } - } - } - } - let pattern0_0 = arg0; - let pattern1_0 = C::value_type(ctx, pattern0_0); - if let Some(pattern2_0) = C::gpr32_ty(ctx, pattern1_0) { - // Rule at src/isa/s390x/inst.isle line 3229. - let expr0_0 = C::put_in_reg(ctx, pattern0_0); - let expr1_0 = constructor_zext64_reg(ctx, pattern2_0, expr0_0); - return expr1_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "put_in_reg_zext64", "src/isa/s390x/inst.isle line 3224" - ); -} - -// Generated as internal constructor for term put_in_reg_sext64. -pub fn constructor_put_in_reg_sext64(ctx: &mut C, arg0: Value) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = C::value_type(ctx, pattern0_0); - if let Some(pattern2_0) = C::u64_from_signed_value(ctx, pattern0_0) { - // Rule at src/isa/s390x/inst.isle line 3236. - let expr0_0 = constructor_ty_ext64(ctx, pattern1_0); - let expr1_0 = constructor_imm(ctx, expr0_0, pattern2_0); - return expr1_0; - } - let pattern0_0 = arg0; - let pattern1_0 = C::value_type(ctx, pattern0_0); - if let Some(pattern2_0) = C::gpr64_ty(ctx, pattern1_0) { - // Rule at src/isa/s390x/inst.isle line 3242. - let expr0_0 = C::put_in_reg(ctx, pattern0_0); - return expr0_0; - } - let pattern0_0 = arg0; - let pattern1_0 = C::value_type(ctx, pattern0_0); - if let Some(pattern2_0) = C::gpr32_ty(ctx, pattern1_0) { - if let Some(pattern3_0) = C::sinkable_inst(ctx, pattern0_0) { - let pattern4_0 = C::inst_data(ctx, pattern3_0); - if let &InstructionData::Load { - opcode: ref pattern5_0, - arg: pattern5_1, - flags: pattern5_2, - offset: pattern5_3, - } = &pattern4_0 - { - if let &Opcode::Load = pattern5_0 { - if let Some(()) = C::bigendian(ctx, pattern5_2) { - // Rule at src/isa/s390x/inst.isle line 3238. - let expr0_0 = constructor_sink_load(ctx, pattern3_0); - let expr1_0 = constructor_sext64_mem(ctx, pattern2_0, &expr0_0); - return expr1_0; - } - } - } - } - } - let pattern0_0 = arg0; - let pattern1_0 = C::value_type(ctx, pattern0_0); - if let Some(pattern2_0) = C::gpr32_ty(ctx, pattern1_0) { - // Rule at src/isa/s390x/inst.isle line 3240. - let expr0_0 = C::put_in_reg(ctx, pattern0_0); - let expr1_0 = constructor_sext64_reg(ctx, pattern2_0, expr0_0); - return expr1_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "put_in_reg_sext64", "src/isa/s390x/inst.isle line 3235" - ); -} - -// Generated as internal constructor for term cmov_imm. -pub fn constructor_cmov_imm( - ctx: &mut C, - arg0: Type, - arg1: &Cond, - arg2: i16, - arg3: Reg, -) -> ConsumesFlags { - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::gpr64_ty(ctx, pattern0_0) { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - let pattern4_0 = arg3; - // Rule at src/isa/s390x/inst.isle line 3254. - let expr0_0 = C::temp_writable_reg(ctx, pattern1_0); - let expr1_0 = MInst::CMov64SImm16 { - rd: expr0_0, - cond: pattern2_0.clone(), - ri: pattern4_0, - imm: pattern3_0, - }; - let expr2_0 = C::writable_reg_to_reg(ctx, expr0_0); - let expr3_0 = ConsumesFlags::ConsumesFlagsReturnsReg { - inst: expr1_0, - result: expr2_0, - }; - return expr3_0; - } - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::gpr32_ty(ctx, pattern0_0) { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - let pattern4_0 = arg3; - // Rule at src/isa/s390x/inst.isle line 3250. - let expr0_0 = C::temp_writable_reg(ctx, pattern1_0); - let expr1_0 = MInst::CMov32SImm16 { - rd: expr0_0, - cond: pattern2_0.clone(), - ri: pattern4_0, - imm: pattern3_0, - }; - let expr2_0 = C::writable_reg_to_reg(ctx, expr0_0); - let expr3_0 = ConsumesFlags::ConsumesFlagsReturnsReg { - inst: expr1_0, - result: expr2_0, - }; - return expr3_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "cmov_imm", "src/isa/s390x/inst.isle line 3249" - ); -} - -// Generated as internal constructor for term cmov_imm_imm. -pub fn constructor_cmov_imm_imm( - ctx: &mut C, - arg0: Type, - arg1: &Cond, - arg2: i16, - arg3: i16, -) -> ConsumesFlags { - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::gpr64_ty(ctx, pattern0_0) { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - let pattern4_0 = arg3; - // Rule at src/isa/s390x/inst.isle line 3268. - let expr0_0 = C::temp_writable_reg(ctx, pattern1_0); - let expr1_0 = C::temp_writable_reg(ctx, pattern1_0); - let expr2_0 = MInst::Mov64SImm16 { - rd: expr0_0, - imm: pattern4_0, - }; - let expr3_0 = C::writable_reg_to_reg(ctx, expr0_0); - let expr4_0 = MInst::CMov64SImm16 { - rd: expr1_0, - cond: pattern2_0.clone(), - ri: expr3_0, - imm: pattern3_0, - }; - let expr5_0 = C::writable_reg_to_reg(ctx, expr1_0); - let expr6_0 = C::value_reg(ctx, expr5_0); - let expr7_0 = ConsumesFlags::ConsumesFlagsTwiceReturnsValueRegs { - inst1: expr2_0, - inst2: expr4_0, - result: expr6_0, - }; - return expr7_0; - } - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::gpr32_ty(ctx, pattern0_0) { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - let pattern4_0 = arg3; - // Rule at src/isa/s390x/inst.isle line 3261. - let expr0_0 = C::temp_writable_reg(ctx, pattern1_0); - let expr1_0 = C::temp_writable_reg(ctx, pattern1_0); - let expr2_0 = MInst::Mov32SImm16 { - rd: expr0_0, - imm: pattern4_0, - }; - let expr3_0 = C::writable_reg_to_reg(ctx, expr0_0); - let expr4_0 = MInst::CMov32SImm16 { - rd: expr1_0, - cond: pattern2_0.clone(), - ri: expr3_0, - imm: pattern3_0, - }; - let expr5_0 = C::writable_reg_to_reg(ctx, expr1_0); - let expr6_0 = C::value_reg(ctx, expr5_0); - let expr7_0 = ConsumesFlags::ConsumesFlagsTwiceReturnsValueRegs { - inst1: expr2_0, - inst2: expr4_0, - result: expr6_0, - }; - return expr7_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "cmov_imm_imm", "src/isa/s390x/inst.isle line 3260" - ); -} - -// Generated as internal constructor for term cmov_reg_reg. -pub fn constructor_cmov_reg_reg( - ctx: &mut C, - arg0: Type, - arg1: &Cond, - arg2: Reg, - arg3: Reg, -) -> ConsumesFlags { - let pattern0_0 = arg0; - if pattern0_0 == F32 { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - let pattern4_0 = arg3; - // Rule at src/isa/s390x/inst.isle line 3286. - let expr0_0: Type = F32; - let expr1_0 = C::temp_writable_reg(ctx, expr0_0); - let expr2_0 = MInst::FpuCMov32 { - rd: expr1_0, - cond: pattern2_0.clone(), - ri: pattern4_0, - rm: pattern3_0, - }; - let expr3_0 = C::writable_reg_to_reg(ctx, expr1_0); - let expr4_0 = ConsumesFlags::ConsumesFlagsReturnsReg { - inst: expr2_0, - result: expr3_0, - }; - return expr4_0; - } - if pattern0_0 == F64 { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - let pattern4_0 = arg3; - // Rule at src/isa/s390x/inst.isle line 3290. - let expr0_0: Type = F64; - let expr1_0 = C::temp_writable_reg(ctx, expr0_0); - let expr2_0 = MInst::FpuCMov64 { - rd: expr1_0, - cond: pattern2_0.clone(), - ri: pattern4_0, - rm: pattern3_0, - }; - let expr3_0 = C::writable_reg_to_reg(ctx, expr1_0); - let expr4_0 = ConsumesFlags::ConsumesFlagsReturnsReg { - inst: expr2_0, - result: expr3_0, - }; - return expr4_0; - } - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::gpr64_ty(ctx, pattern0_0) { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - let pattern4_0 = arg3; - // Rule at src/isa/s390x/inst.isle line 3282. - let expr0_0 = C::temp_writable_reg(ctx, pattern1_0); - let expr1_0 = MInst::CMov64 { - rd: expr0_0, - cond: pattern2_0.clone(), - ri: pattern4_0, - rm: pattern3_0, - }; - let expr2_0 = C::writable_reg_to_reg(ctx, expr0_0); - let expr3_0 = ConsumesFlags::ConsumesFlagsReturnsReg { - inst: expr1_0, - result: expr2_0, - }; - return expr3_0; - } - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::gpr32_ty(ctx, pattern0_0) { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - let pattern4_0 = arg3; - // Rule at src/isa/s390x/inst.isle line 3278. - let expr0_0 = C::temp_writable_reg(ctx, pattern1_0); - let expr1_0 = MInst::CMov32 { - rd: expr0_0, - cond: pattern2_0.clone(), - ri: pattern4_0, - rm: pattern3_0, - }; - let expr2_0 = C::writable_reg_to_reg(ctx, expr0_0); - let expr3_0 = ConsumesFlags::ConsumesFlagsReturnsReg { - inst: expr1_0, - result: expr2_0, - }; - return expr3_0; - } - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::vr128_ty(ctx, pattern0_0) { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - let pattern4_0 = arg3; - // Rule at src/isa/s390x/inst.isle line 3294. - let expr0_0: Type = F64; - let expr1_0 = C::temp_writable_reg(ctx, expr0_0); - let expr2_0 = MInst::VecCMov { - rd: expr1_0, - cond: pattern2_0.clone(), - ri: pattern4_0, - rm: pattern3_0, - }; - let expr3_0 = C::writable_reg_to_reg(ctx, expr1_0); - let expr4_0 = ConsumesFlags::ConsumesFlagsReturnsReg { - inst: expr2_0, - result: expr3_0, - }; - return expr4_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "cmov_reg_reg", "src/isa/s390x/inst.isle line 3277" - ); -} - -// Generated as internal constructor for term trap_if. -pub fn constructor_trap_if( - ctx: &mut C, - arg0: &ProducesFlags, - arg1: &Cond, - arg2: &TrapCode, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 3303. - let expr0_0 = constructor_trap_if_impl(ctx, pattern1_0, pattern2_0); - let expr1_0 = constructor_with_flags_side_effect(ctx, pattern0_0, &expr0_0); - let expr2_0 = constructor_side_effect(ctx, &expr1_0); - let expr3_0 = C::invalid_reg(ctx); - return expr3_0; -} - -// Generated as internal constructor for term icmps_reg_and_trap. -pub fn constructor_icmps_reg_and_trap( - ctx: &mut C, - arg0: Type, - arg1: Reg, - arg2: Reg, - arg3: &Cond, - arg4: &TrapCode, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - let pattern4_0 = arg4; - // Rule at src/isa/s390x/inst.isle line 3309. - let expr0_0 = constructor_cmpop_cmps(ctx, pattern0_0); - let expr1_0 = MInst::CmpTrapRR { - op: expr0_0, - rn: pattern1_0, - rm: pattern2_0, - cond: pattern3_0.clone(), - trap_code: pattern4_0.clone(), - }; - let expr2_0 = C::emit(ctx, &expr1_0); - let expr3_0 = C::invalid_reg(ctx); - return expr3_0; -} - -// Generated as internal constructor for term icmps_simm16_and_trap. -pub fn constructor_icmps_simm16_and_trap( - ctx: &mut C, - arg0: Type, - arg1: Reg, - arg2: i16, - arg3: &Cond, - arg4: &TrapCode, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - let pattern4_0 = arg4; - // Rule at src/isa/s390x/inst.isle line 3315. - let expr0_0 = constructor_cmpop_cmps(ctx, pattern0_0); - let expr1_0 = MInst::CmpTrapRSImm16 { - op: expr0_0, - rn: pattern1_0, - imm: pattern2_0, - cond: pattern3_0.clone(), - trap_code: pattern4_0.clone(), - }; - let expr2_0 = C::emit(ctx, &expr1_0); - let expr3_0 = C::invalid_reg(ctx); - return expr3_0; -} - -// Generated as internal constructor for term icmpu_reg_and_trap. -pub fn constructor_icmpu_reg_and_trap( - ctx: &mut C, - arg0: Type, - arg1: Reg, - arg2: Reg, - arg3: &Cond, - arg4: &TrapCode, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - let pattern4_0 = arg4; - // Rule at src/isa/s390x/inst.isle line 3321. - let expr0_0 = constructor_cmpop_cmpu(ctx, pattern0_0); - let expr1_0 = MInst::CmpTrapRR { - op: expr0_0, - rn: pattern1_0, - rm: pattern2_0, - cond: pattern3_0.clone(), - trap_code: pattern4_0.clone(), - }; - let expr2_0 = C::emit(ctx, &expr1_0); - let expr3_0 = C::invalid_reg(ctx); - return expr3_0; -} - -// Generated as internal constructor for term icmpu_uimm16_and_trap. -pub fn constructor_icmpu_uimm16_and_trap( - ctx: &mut C, - arg0: Type, - arg1: Reg, - arg2: u16, - arg3: &Cond, - arg4: &TrapCode, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - let pattern4_0 = arg4; - // Rule at src/isa/s390x/inst.isle line 3327. - let expr0_0 = constructor_cmpop_cmpu(ctx, pattern0_0); - let expr1_0 = MInst::CmpTrapRUImm16 { - op: expr0_0, - rn: pattern1_0, - imm: pattern2_0, - cond: pattern3_0.clone(), - trap_code: pattern4_0.clone(), - }; - let expr2_0 = C::emit(ctx, &expr1_0); - let expr3_0 = C::invalid_reg(ctx); - return expr3_0; -} - -// Generated as internal constructor for term trap_impl. -pub fn constructor_trap_impl(ctx: &mut C, arg0: &TrapCode) -> SideEffectNoResult { - let pattern0_0 = arg0; - // Rule at src/isa/s390x/inst.isle line 3333. - let expr0_0 = MInst::Trap { - trap_code: pattern0_0.clone(), - }; - let expr1_0 = SideEffectNoResult::Inst { inst: expr0_0 }; - return expr1_0; -} - -// Generated as internal constructor for term trap_if_impl. -pub fn constructor_trap_if_impl( - ctx: &mut C, - arg0: &Cond, - arg1: &TrapCode, -) -> ConsumesFlags { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/s390x/inst.isle line 3337. - let expr0_0 = MInst::TrapIf { - cond: pattern0_0.clone(), - trap_code: pattern1_0.clone(), - }; - let expr1_0 = ConsumesFlags::ConsumesFlagsSideEffect { inst: expr0_0 }; - return expr1_0; -} - -// Generated as internal constructor for term debugtrap_impl. -pub fn constructor_debugtrap_impl(ctx: &mut C) -> SideEffectNoResult { - // Rule at src/isa/s390x/inst.isle line 3341. - let expr0_0 = MInst::Debugtrap; - let expr1_0 = SideEffectNoResult::Inst { inst: expr0_0 }; - return expr1_0; -} - -// Generated as internal constructor for term bool. -pub fn constructor_bool( - ctx: &mut C, - arg0: &ProducesFlags, - arg1: &Cond, -) -> ProducesBool { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/s390x/inst.isle line 3352. - let expr0_0 = ProducesBool::ProducesBool { - producer: pattern0_0.clone(), - cond: pattern1_0.clone(), - }; - return expr0_0; -} - -// Generated as internal constructor for term invert_bool. -pub fn constructor_invert_bool(ctx: &mut C, arg0: &ProducesBool) -> ProducesBool { - let pattern0_0 = arg0; - if let &ProducesBool::ProducesBool { - producer: ref pattern1_0, - cond: ref pattern1_1, - } = pattern0_0 - { - // Rule at src/isa/s390x/inst.isle line 3356. - let expr0_0 = C::invert_cond(ctx, pattern1_1); - let expr1_0 = constructor_bool(ctx, pattern1_0, &expr0_0); - return expr1_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "invert_bool", "src/isa/s390x/inst.isle line 3355" - ); -} - -// Generated as internal constructor for term select_bool_reg. -pub fn constructor_select_bool_reg( - ctx: &mut C, - arg0: Type, - arg1: &ProducesBool, - arg2: Reg, - arg3: Reg, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - if let &ProducesBool::ProducesBool { - producer: ref pattern2_0, - cond: ref pattern2_1, - } = pattern1_0 - { - let pattern3_0 = arg2; - let pattern4_0 = arg3; - // Rule at src/isa/s390x/inst.isle line 3361. - let expr0_0 = constructor_cmov_reg_reg(ctx, pattern0_0, pattern2_1, pattern3_0, pattern4_0); - let expr1_0 = constructor_with_flags_reg(ctx, pattern2_0, &expr0_0); - return expr1_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "select_bool_reg", "src/isa/s390x/inst.isle line 3360" - ); -} - -// Generated as internal constructor for term select_bool_imm. -pub fn constructor_select_bool_imm( - ctx: &mut C, - arg0: Type, - arg1: &ProducesBool, - arg2: i16, - arg3: i16, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - if let &ProducesBool::ProducesBool { - producer: ref pattern2_0, - cond: ref pattern2_1, - } = pattern1_0 - { - let pattern3_0 = arg2; - let pattern4_0 = arg3; - // Rule at src/isa/s390x/inst.isle line 3366. - let expr0_0 = constructor_cmov_imm_imm(ctx, pattern0_0, pattern2_1, pattern3_0, pattern4_0); - let expr1_0 = constructor_with_flags_reg(ctx, pattern2_0, &expr0_0); - return expr1_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "select_bool_imm", "src/isa/s390x/inst.isle line 3365" - ); -} - -// Generated as internal constructor for term lower_bool. -pub fn constructor_lower_bool(ctx: &mut C, arg0: Type, arg1: &ProducesBool) -> Reg { - let pattern0_0 = arg0; - if pattern0_0 == I8 { - let pattern2_0 = arg1; - // Rule at src/isa/s390x/inst.isle line 3372. - let expr0_0: Type = I8; - let expr1_0: i16 = 1i128 as i16; - let expr2_0: i16 = 0i128 as i16; - let expr3_0 = constructor_select_bool_imm(ctx, expr0_0, pattern2_0, expr1_0, expr2_0); - return expr3_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "lower_bool", "src/isa/s390x/inst.isle line 3371" - ); -} - -// Generated as internal constructor for term lower_bool_to_mask. -pub fn constructor_lower_bool_to_mask( - ctx: &mut C, - arg0: Type, - arg1: &ProducesBool, -) -> Reg { - let pattern0_0 = arg0; - if pattern0_0 == I128 { - let pattern2_0 = arg1; - // Rule at src/isa/s390x/inst.isle line 3379. - let expr0_0: Type = I64; - let expr1_0 = constructor_lower_bool_to_mask(ctx, expr0_0, pattern2_0); - let expr2_0: Type = I128; - let expr3_0 = constructor_mov_to_vec128(ctx, expr2_0, expr1_0, expr1_0); - return expr3_0; - } - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::fits_in_64(ctx, pattern0_0) { - let pattern2_0 = arg1; - // Rule at src/isa/s390x/inst.isle line 3376. - let expr0_0: i16 = -1i128 as i16; - let expr1_0: i16 = 0i128 as i16; - let expr2_0 = constructor_select_bool_imm(ctx, pattern1_0, pattern2_0, expr0_0, expr1_0); - return expr2_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "lower_bool_to_mask", "src/isa/s390x/inst.isle line 3375" - ); -} - -// Generated as internal constructor for term cond_br_bool. -pub fn constructor_cond_br_bool( - ctx: &mut C, - arg0: &ProducesBool, - arg1: MachLabel, - arg2: MachLabel, -) -> SideEffectNoResult { - let pattern0_0 = arg0; - if let &ProducesBool::ProducesBool { - producer: ref pattern1_0, - cond: ref pattern1_1, - } = pattern0_0 - { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 3385. - let expr0_0 = constructor_cond_br(ctx, pattern2_0, pattern3_0, pattern1_1); - let expr1_0 = constructor_with_flags_side_effect(ctx, pattern1_0, &expr0_0); - return expr1_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "cond_br_bool", "src/isa/s390x/inst.isle line 3384" - ); -} - -// Generated as internal constructor for term oneway_cond_br_bool. -pub fn constructor_oneway_cond_br_bool( - ctx: &mut C, - arg0: &ProducesBool, - arg1: MachLabel, -) -> SideEffectNoResult { - let pattern0_0 = arg0; - if let &ProducesBool::ProducesBool { - producer: ref pattern1_0, - cond: ref pattern1_1, - } = pattern0_0 - { - let pattern2_0 = arg1; - // Rule at src/isa/s390x/inst.isle line 3390. - let expr0_0 = constructor_oneway_cond_br(ctx, pattern2_0, pattern1_1); - let expr1_0 = constructor_with_flags_side_effect(ctx, pattern1_0, &expr0_0); - return expr1_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "oneway_cond_br_bool", "src/isa/s390x/inst.isle line 3389" - ); -} - -// Generated as internal constructor for term trap_if_bool. -pub fn constructor_trap_if_bool( - ctx: &mut C, - arg0: &ProducesBool, - arg1: &TrapCode, -) -> SideEffectNoResult { - let pattern0_0 = arg0; - if let &ProducesBool::ProducesBool { - producer: ref pattern1_0, - cond: ref pattern1_1, - } = pattern0_0 - { - let pattern2_0 = arg1; - // Rule at src/isa/s390x/inst.isle line 3395. - let expr0_0 = constructor_trap_if_impl(ctx, pattern1_1, pattern2_0); - let expr1_0 = constructor_with_flags_side_effect(ctx, pattern1_0, &expr0_0); - return expr1_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "trap_if_bool", "src/isa/s390x/inst.isle line 3394" - ); -} - -// Generated as internal constructor for term casloop_val_reg. -pub fn constructor_casloop_val_reg(ctx: &mut C) -> WritableReg { - // Rule at src/isa/s390x/inst.isle line 3408. - let expr0_0: u8 = 0i128 as u8; - let expr1_0 = C::writable_gpr(ctx, expr0_0); - return expr1_0; -} - -// Generated as internal constructor for term casloop_tmp_reg. -pub fn constructor_casloop_tmp_reg(ctx: &mut C) -> WritableReg { - // Rule at src/isa/s390x/inst.isle line 3412. - let expr0_0: u8 = 1i128 as u8; - let expr1_0 = C::writable_gpr(ctx, expr0_0); - return expr1_0; -} - -// Generated as internal constructor for term casloop_emit. -pub fn constructor_casloop_emit( - ctx: &mut C, - arg0: &VecMInstBuilder, - arg1: Type, - arg2: MemFlags, - arg3: Reg, - arg4: Reg, -) -> PReg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - let pattern4_0 = arg4; - // Rule at src/isa/s390x/inst.isle line 3421. - let expr0_0: i64 = 0i128 as i64; - let expr1_0: u8 = 0i128 as u8; - let expr2_0 = C::memarg_reg_plus_off(ctx, pattern3_0, expr0_0, expr1_0, pattern2_0); - let expr3_0 = constructor_ty_ext32(ctx, pattern1_0); - let expr4_0 = constructor_casloop_val_reg(ctx); - let expr5_0 = - constructor_push_atomic_cas(ctx, pattern0_0, expr3_0, expr4_0, pattern4_0, &expr2_0); - let expr6_0 = constructor_ty_ext32(ctx, pattern1_0); - let expr7_0 = constructor_casloop_val_reg(ctx); - let expr8_0 = constructor_emit_load(ctx, expr6_0, expr7_0, &expr2_0); - let expr9_0 = IntCC::NotEqual; - let expr10_0 = C::intcc_as_cond(ctx, &expr9_0); - let expr11_0 = constructor_emit_loop(ctx, pattern0_0, &expr10_0); - let expr12_0 = C::preg_gpr_0(ctx); - return expr12_0; -} - -// Generated as internal constructor for term casloop_result. -pub fn constructor_casloop_result( - ctx: &mut C, - arg0: Type, - arg1: MemFlags, - arg2: PReg, -) -> Reg { - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::ty_32_or_64(ctx, pattern0_0) { - let pattern2_0 = arg1; - if let Some(()) = C::bigendian(ctx, pattern2_0) { - let pattern4_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 3443. - let expr0_0 = constructor_mov_preg(ctx, pattern4_0); - return expr0_0; - } - } - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::ty_32_or_64(ctx, pattern0_0) { - let pattern2_0 = arg1; - if let Some(()) = C::littleendian(ctx, pattern2_0) { - let pattern4_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 3445. - let expr0_0 = C::preg_to_reg(ctx, pattern4_0); - let expr1_0 = constructor_bswap_reg(ctx, pattern1_0, expr0_0); - return expr1_0; - } - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "casloop_result", "src/isa/s390x/inst.isle line 3442" - ); -} - -// Generated as internal constructor for term casloop. -pub fn constructor_casloop( - ctx: &mut C, - arg0: &VecMInstBuilder, - arg1: Type, - arg2: MemFlags, - arg3: Reg, - arg4: Reg, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - let pattern4_0 = arg4; - // Rule at src/isa/s390x/inst.isle line 3450. - let expr0_0 = constructor_casloop_emit( - ctx, pattern0_0, pattern1_0, pattern2_0, pattern3_0, pattern4_0, - ); - let expr1_0 = constructor_casloop_result(ctx, pattern1_0, pattern2_0, expr0_0); - return expr1_0; -} - -// Generated as internal constructor for term casloop_bitshift. -pub fn constructor_casloop_bitshift(ctx: &mut C, arg0: Reg) -> Reg { - let pattern0_0 = arg0; - // Rule at src/isa/s390x/inst.isle line 3465. - let expr0_0: Type = I32; - let expr1_0: u8 = 3i128 as u8; - let expr2_0 = constructor_lshl_imm(ctx, expr0_0, pattern0_0, expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term casloop_aligned_addr. -pub fn constructor_casloop_aligned_addr(ctx: &mut C, arg0: Reg) -> Reg { - let pattern0_0 = arg0; - // Rule at src/isa/s390x/inst.isle line 3470. - let expr0_0: Type = I64; - let expr1_0: u16 = 65532i128 as u16; - let expr2_0: u8 = 0i128 as u8; - let expr3_0 = C::uimm16shifted(ctx, expr1_0, expr2_0); - let expr4_0 = constructor_and_uimm16shifted(ctx, expr0_0, pattern0_0, expr3_0); - return expr4_0; -} - -// Generated as internal constructor for term casloop_rotate_in. -pub fn constructor_casloop_rotate_in( - ctx: &mut C, - arg0: &VecMInstBuilder, - arg1: Type, - arg2: MemFlags, - arg3: Reg, - arg4: Reg, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - if pattern1_0 == I16 { - let pattern3_0 = arg2; - if let Some(()) = C::bigendian(ctx, pattern3_0) { - let pattern5_0 = arg3; - let pattern6_0 = arg4; - // Rule at src/isa/s390x/inst.isle line 3482. - let expr0_0: Type = I32; - let expr1_0 = constructor_casloop_tmp_reg(ctx); - let expr2_0: u8 = 0i128 as u8; - let expr3_0 = constructor_push_rot_imm_reg( - ctx, pattern0_0, expr0_0, expr1_0, pattern6_0, expr2_0, pattern5_0, - ); - return expr3_0; - } - } - let pattern0_0 = arg0; - let pattern1_0 = arg1; - if pattern1_0 == I8 { - let pattern3_0 = arg2; - let pattern4_0 = arg3; - let pattern5_0 = arg4; - // Rule at src/isa/s390x/inst.isle line 3480. - let expr0_0: Type = I32; - let expr1_0 = constructor_casloop_tmp_reg(ctx); - let expr2_0: u8 = 0i128 as u8; - let expr3_0 = constructor_push_rot_imm_reg( - ctx, pattern0_0, expr0_0, expr1_0, pattern5_0, expr2_0, pattern4_0, - ); - return expr3_0; - } - if pattern1_0 == I16 { - let pattern3_0 = arg2; - if let Some(()) = C::littleendian(ctx, pattern3_0) { - let pattern5_0 = arg3; - let pattern6_0 = arg4; - // Rule at src/isa/s390x/inst.isle line 3484. - let expr0_0: Type = I32; - let expr1_0 = constructor_casloop_tmp_reg(ctx); - let expr2_0: u8 = 16i128 as u8; - let expr3_0 = constructor_push_rot_imm_reg( - ctx, pattern0_0, expr0_0, expr1_0, pattern6_0, expr2_0, pattern5_0, - ); - return expr3_0; - } - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "casloop_rotate_in", "src/isa/s390x/inst.isle line 3479" - ); -} - -// Generated as internal constructor for term casloop_rotate_out. -pub fn constructor_casloop_rotate_out( - ctx: &mut C, - arg0: &VecMInstBuilder, - arg1: Type, - arg2: MemFlags, - arg3: Reg, - arg4: Reg, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - if pattern1_0 == I16 { - let pattern3_0 = arg2; - if let Some(()) = C::bigendian(ctx, pattern3_0) { - let pattern5_0 = arg3; - let pattern6_0 = arg4; - // Rule at src/isa/s390x/inst.isle line 3495. - let expr0_0: Type = I32; - let expr1_0 = constructor_casloop_tmp_reg(ctx); - let expr2_0: u8 = 0i128 as u8; - let expr3_0 = constructor_push_rot_imm_reg( - ctx, pattern0_0, expr0_0, expr1_0, pattern6_0, expr2_0, pattern5_0, - ); - return expr3_0; - } - } - let pattern0_0 = arg0; - let pattern1_0 = arg1; - if pattern1_0 == I8 { - let pattern3_0 = arg2; - let pattern4_0 = arg3; - let pattern5_0 = arg4; - // Rule at src/isa/s390x/inst.isle line 3493. - let expr0_0: Type = I32; - let expr1_0 = constructor_casloop_tmp_reg(ctx); - let expr2_0: u8 = 0i128 as u8; - let expr3_0: Type = I32; - let expr4_0 = constructor_neg_reg(ctx, expr3_0, pattern4_0); - let expr5_0 = constructor_push_rot_imm_reg( - ctx, pattern0_0, expr0_0, expr1_0, pattern5_0, expr2_0, expr4_0, - ); - return expr5_0; - } - if pattern1_0 == I16 { - let pattern3_0 = arg2; - if let Some(()) = C::littleendian(ctx, pattern3_0) { - let pattern5_0 = arg3; - let pattern6_0 = arg4; - // Rule at src/isa/s390x/inst.isle line 3497. - let expr0_0: Type = I32; - let expr1_0 = constructor_casloop_tmp_reg(ctx); - let expr2_0: u8 = 16i128 as u8; - let expr3_0 = constructor_push_rot_imm_reg( - ctx, pattern0_0, expr0_0, expr1_0, pattern6_0, expr2_0, pattern5_0, - ); - return expr3_0; - } - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "casloop_rotate_out", "src/isa/s390x/inst.isle line 3492" - ); -} - -// Generated as internal constructor for term casloop_rotate_result. -pub fn constructor_casloop_rotate_result( - ctx: &mut C, - arg0: Type, - arg1: MemFlags, - arg2: Reg, - arg3: Reg, -) -> Reg { - let pattern0_0 = arg0; - if pattern0_0 == I16 { - let pattern2_0 = arg1; - if let Some(()) = C::bigendian(ctx, pattern2_0) { - let pattern4_0 = arg2; - let pattern5_0 = arg3; - // Rule at src/isa/s390x/inst.isle line 3510. - let expr0_0: Type = I32; - let expr1_0: u8 = 16i128 as u8; - let expr2_0 = constructor_rot_imm_reg(ctx, expr0_0, pattern5_0, expr1_0, pattern4_0); - return expr2_0; - } - } - let pattern0_0 = arg0; - if pattern0_0 == I8 { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - let pattern4_0 = arg3; - // Rule at src/isa/s390x/inst.isle line 3508. - let expr0_0: Type = I32; - let expr1_0: u8 = 8i128 as u8; - let expr2_0 = constructor_rot_imm_reg(ctx, expr0_0, pattern4_0, expr1_0, pattern3_0); - return expr2_0; - } - if pattern0_0 == I16 { - let pattern2_0 = arg1; - if let Some(()) = C::littleendian(ctx, pattern2_0) { - let pattern4_0 = arg2; - let pattern5_0 = arg3; - // Rule at src/isa/s390x/inst.isle line 3512. - let expr0_0: Type = I32; - let expr1_0: Type = I32; - let expr2_0 = constructor_rot_reg(ctx, expr1_0, pattern5_0, pattern4_0); - let expr3_0 = constructor_bswap_reg(ctx, expr0_0, expr2_0); - return expr3_0; - } - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "casloop_rotate_result", "src/isa/s390x/inst.isle line 3507" - ); -} - -// Generated as internal constructor for term casloop_subword. -pub fn constructor_casloop_subword( - ctx: &mut C, - arg0: &VecMInstBuilder, - arg1: Type, - arg2: MemFlags, - arg3: Reg, - arg4: Reg, - arg5: Reg, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - let pattern4_0 = arg4; - let pattern5_0 = arg5; - // Rule at src/isa/s390x/inst.isle line 3517. - let expr0_0 = constructor_casloop_emit( - ctx, pattern0_0, pattern1_0, pattern2_0, pattern3_0, pattern5_0, - ); - let expr1_0 = C::preg_to_reg(ctx, expr0_0); - let expr2_0 = - constructor_casloop_rotate_result(ctx, pattern1_0, pattern2_0, pattern4_0, expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term writable_link_reg. -pub fn constructor_writable_link_reg(ctx: &mut C) -> WritableReg { - // Rule at src/isa/s390x/inst.isle line 3566. - let expr0_0: u8 = 14i128 as u8; - let expr1_0 = C::writable_gpr(ctx, expr0_0); - return expr1_0; -} - -// Generated as internal constructor for term abi_call. -pub fn constructor_abi_call( - ctx: &mut C, - arg0: Sig, - arg1: ExternalName, - arg2: &CallArgList, - arg3: &CallRetList, - arg4: &Opcode, -) -> SideEffectNoResult { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - let pattern4_0 = arg4; - // Rule at src/isa/s390x/inst.isle line 3569. - let expr0_0 = constructor_writable_link_reg(ctx); - let expr1_0 = C::abi_call_info( - ctx, pattern0_0, pattern1_0, pattern2_0, pattern3_0, pattern4_0, - ); - let expr2_0 = constructor_call_impl(ctx, expr0_0, expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term abi_call_ind. -pub fn constructor_abi_call_ind( - ctx: &mut C, - arg0: Sig, - arg1: Reg, - arg2: &CallArgList, - arg3: &CallRetList, - arg4: &Opcode, -) -> SideEffectNoResult { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - let pattern4_0 = arg4; - // Rule at src/isa/s390x/inst.isle line 3573. - let expr0_0 = constructor_writable_link_reg(ctx); - let expr1_0 = C::abi_call_ind_info( - ctx, pattern0_0, pattern1_0, pattern2_0, pattern3_0, pattern4_0, - ); - let expr2_0 = constructor_call_ind_impl(ctx, expr0_0, expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term lib_call. -pub fn constructor_lib_call(ctx: &mut C, arg0: &LibCallInfo) -> SideEffectNoResult { - let pattern0_0 = arg0; - // Rule at src/isa/s390x/inst.isle line 3597. - let expr0_0 = constructor_writable_link_reg(ctx); - let expr1_0 = C::lib_call_info(ctx, pattern0_0); - let expr2_0 = constructor_call_impl(ctx, expr0_0, expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term vec_widen_type. -pub fn constructor_vec_widen_type(ctx: &mut C, arg0: Type) -> Type { - let pattern0_0 = arg0; - if pattern0_0 == I8X16 { - // Rule at src/isa/s390x/inst.isle line 3607. - let expr0_0: Type = I16X8; - return expr0_0; - } - if pattern0_0 == I16X8 { - // Rule at src/isa/s390x/inst.isle line 3608. - let expr0_0: Type = I32X4; - return expr0_0; - } - if pattern0_0 == I32X4 { - // Rule at src/isa/s390x/inst.isle line 3609. - let expr0_0: Type = I64X2; - return expr0_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "vec_widen_type", "src/isa/s390x/inst.isle line 3606" - ); -} - -// Generated as internal constructor for term vecop_pack. -pub fn constructor_vecop_pack(ctx: &mut C, arg0: Type) -> VecBinaryOp { - let pattern0_0 = arg0; - if pattern0_0 == I16X8 { - // Rule at src/isa/s390x/inst.isle line 3612. - let expr0_0 = VecBinaryOp::Pack16x8; - return expr0_0; - } - if pattern0_0 == I32X4 { - // Rule at src/isa/s390x/inst.isle line 3613. - let expr0_0 = VecBinaryOp::Pack32x4; - return expr0_0; - } - if pattern0_0 == I64X2 { - // Rule at src/isa/s390x/inst.isle line 3614. - let expr0_0 = VecBinaryOp::Pack64x2; - return expr0_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "vecop_pack", "src/isa/s390x/inst.isle line 3611" - ); -} - -// Generated as internal constructor for term vec_pack. -pub fn constructor_vec_pack(ctx: &mut C, arg0: Type, arg1: Reg, arg2: Reg) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 3617. - let expr0_0 = constructor_vecop_pack(ctx, pattern0_0); - let expr1_0 = constructor_vec_rrr(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term vecop_pack_ssat. -pub fn constructor_vecop_pack_ssat(ctx: &mut C, arg0: Type) -> VecBinaryOp { - let pattern0_0 = arg0; - if pattern0_0 == I16X8 { - // Rule at src/isa/s390x/inst.isle line 3620. - let expr0_0 = VecBinaryOp::PackSSat16x8; - return expr0_0; - } - if pattern0_0 == I32X4 { - // Rule at src/isa/s390x/inst.isle line 3621. - let expr0_0 = VecBinaryOp::PackSSat32x4; - return expr0_0; - } - if pattern0_0 == I64X2 { - // Rule at src/isa/s390x/inst.isle line 3622. - let expr0_0 = VecBinaryOp::PackSSat64x2; - return expr0_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "vecop_pack_ssat", "src/isa/s390x/inst.isle line 3619" - ); -} - -// Generated as internal constructor for term vec_pack_ssat. -pub fn constructor_vec_pack_ssat(ctx: &mut C, arg0: Type, arg1: Reg, arg2: Reg) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 3625. - let expr0_0 = constructor_vecop_pack_ssat(ctx, pattern0_0); - let expr1_0 = constructor_vec_rrr(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term vecop_pack_usat. -pub fn constructor_vecop_pack_usat(ctx: &mut C, arg0: Type) -> VecBinaryOp { - let pattern0_0 = arg0; - if pattern0_0 == I16X8 { - // Rule at src/isa/s390x/inst.isle line 3628. - let expr0_0 = VecBinaryOp::PackUSat16x8; - return expr0_0; - } - if pattern0_0 == I32X4 { - // Rule at src/isa/s390x/inst.isle line 3629. - let expr0_0 = VecBinaryOp::PackUSat32x4; - return expr0_0; - } - if pattern0_0 == I64X2 { - // Rule at src/isa/s390x/inst.isle line 3630. - let expr0_0 = VecBinaryOp::PackUSat64x2; - return expr0_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "vecop_pack_usat", "src/isa/s390x/inst.isle line 3627" - ); -} - -// Generated as internal constructor for term vec_pack_usat. -pub fn constructor_vec_pack_usat(ctx: &mut C, arg0: Type, arg1: Reg, arg2: Reg) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 3633. - let expr0_0 = constructor_vecop_pack_usat(ctx, pattern0_0); - let expr1_0 = constructor_vec_rrr(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term vecop_unpacks_low. -pub fn constructor_vecop_unpacks_low(ctx: &mut C, arg0: Type) -> VecUnaryOp { - let pattern0_0 = arg0; - if pattern0_0 == I8X16 { - // Rule at src/isa/s390x/inst.isle line 3636. - let expr0_0 = VecUnaryOp::UnpackSLow8x16; - return expr0_0; - } - if pattern0_0 == I16X8 { - // Rule at src/isa/s390x/inst.isle line 3637. - let expr0_0 = VecUnaryOp::UnpackSLow16x8; - return expr0_0; - } - if pattern0_0 == I32X4 { - // Rule at src/isa/s390x/inst.isle line 3638. - let expr0_0 = VecUnaryOp::UnpackSLow32x4; - return expr0_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "vecop_unpacks_low", "src/isa/s390x/inst.isle line 3635" - ); -} - -// Generated as internal constructor for term vec_unpacks_low. -pub fn constructor_vec_unpacks_low(ctx: &mut C, arg0: Type, arg1: Reg) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/s390x/inst.isle line 3641. - let expr0_0 = constructor_vecop_unpacks_low(ctx, pattern0_0); - let expr1_0 = constructor_vec_rr(ctx, pattern0_0, &expr0_0, pattern1_0); - return expr1_0; -} - -// Generated as internal constructor for term vecop_unpacks_high. -pub fn constructor_vecop_unpacks_high(ctx: &mut C, arg0: Type) -> VecUnaryOp { - let pattern0_0 = arg0; - if pattern0_0 == I8X16 { - // Rule at src/isa/s390x/inst.isle line 3644. - let expr0_0 = VecUnaryOp::UnpackSHigh8x16; - return expr0_0; - } - if pattern0_0 == I16X8 { - // Rule at src/isa/s390x/inst.isle line 3645. - let expr0_0 = VecUnaryOp::UnpackSHigh16x8; - return expr0_0; - } - if pattern0_0 == I32X4 { - // Rule at src/isa/s390x/inst.isle line 3646. - let expr0_0 = VecUnaryOp::UnpackSHigh32x4; - return expr0_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "vecop_unpacks_high", "src/isa/s390x/inst.isle line 3643" - ); -} - -// Generated as internal constructor for term vec_unpacks_high. -pub fn constructor_vec_unpacks_high(ctx: &mut C, arg0: Type, arg1: Reg) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/s390x/inst.isle line 3649. - let expr0_0 = constructor_vecop_unpacks_high(ctx, pattern0_0); - let expr1_0 = constructor_vec_rr(ctx, pattern0_0, &expr0_0, pattern1_0); - return expr1_0; -} - -// Generated as internal constructor for term vecop_unpacku_low. -pub fn constructor_vecop_unpacku_low(ctx: &mut C, arg0: Type) -> VecUnaryOp { - let pattern0_0 = arg0; - if pattern0_0 == I8X16 { - // Rule at src/isa/s390x/inst.isle line 3652. - let expr0_0 = VecUnaryOp::UnpackULow8x16; - return expr0_0; - } - if pattern0_0 == I16X8 { - // Rule at src/isa/s390x/inst.isle line 3653. - let expr0_0 = VecUnaryOp::UnpackULow16x8; - return expr0_0; - } - if pattern0_0 == I32X4 { - // Rule at src/isa/s390x/inst.isle line 3654. - let expr0_0 = VecUnaryOp::UnpackULow32x4; - return expr0_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "vecop_unpacku_low", "src/isa/s390x/inst.isle line 3651" - ); -} - -// Generated as internal constructor for term vec_unpacku_low. -pub fn constructor_vec_unpacku_low(ctx: &mut C, arg0: Type, arg1: Reg) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/s390x/inst.isle line 3657. - let expr0_0 = constructor_vecop_unpacku_low(ctx, pattern0_0); - let expr1_0 = constructor_vec_rr(ctx, pattern0_0, &expr0_0, pattern1_0); - return expr1_0; -} - -// Generated as internal constructor for term vecop_unpacku_high. -pub fn constructor_vecop_unpacku_high(ctx: &mut C, arg0: Type) -> VecUnaryOp { - let pattern0_0 = arg0; - if pattern0_0 == I8X16 { - // Rule at src/isa/s390x/inst.isle line 3660. - let expr0_0 = VecUnaryOp::UnpackUHigh8x16; - return expr0_0; - } - if pattern0_0 == I16X8 { - // Rule at src/isa/s390x/inst.isle line 3661. - let expr0_0 = VecUnaryOp::UnpackUHigh16x8; - return expr0_0; - } - if pattern0_0 == I32X4 { - // Rule at src/isa/s390x/inst.isle line 3662. - let expr0_0 = VecUnaryOp::UnpackUHigh32x4; - return expr0_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "vecop_unpacku_high", "src/isa/s390x/inst.isle line 3659" - ); -} - -// Generated as internal constructor for term vec_unpacku_high. -pub fn constructor_vec_unpacku_high(ctx: &mut C, arg0: Type, arg1: Reg) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/s390x/inst.isle line 3665. - let expr0_0 = constructor_vecop_unpacku_high(ctx, pattern0_0); - let expr1_0 = constructor_vec_rr(ctx, pattern0_0, &expr0_0, pattern1_0); - return expr1_0; -} - -// Generated as internal constructor for term vec_pack_lane_order. -pub fn constructor_vec_pack_lane_order( - ctx: &mut C, - arg0: Type, - arg1: Reg, - arg2: Reg, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let mut closure3 = || { - let expr0_0 = C::lane_order(ctx); - return Some(expr0_0); - }; - if let Some(pattern3_0) = closure3() { - if let &LaneOrder::BigEndian = &pattern3_0 { - // Rule at src/isa/s390x/inst.isle line 3673. - let expr0_0 = constructor_vec_pack(ctx, pattern0_0, pattern1_0, pattern2_0); - return expr0_0; - } - } - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let mut closure3 = || { - let expr0_0 = C::lane_order(ctx); - return Some(expr0_0); - }; - if let Some(pattern3_0) = closure3() { - if let &LaneOrder::LittleEndian = &pattern3_0 { - // Rule at src/isa/s390x/inst.isle line 3676. - let expr0_0 = constructor_vec_pack(ctx, pattern0_0, pattern2_0, pattern1_0); - return expr0_0; - } - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "vec_pack_lane_order", "src/isa/s390x/inst.isle line 3672" - ); -} - -// Generated as internal constructor for term vec_pack_ssat_lane_order. -pub fn constructor_vec_pack_ssat_lane_order( - ctx: &mut C, - arg0: Type, - arg1: Reg, - arg2: Reg, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let mut closure3 = || { - let expr0_0 = C::lane_order(ctx); - return Some(expr0_0); - }; - if let Some(pattern3_0) = closure3() { - if let &LaneOrder::BigEndian = &pattern3_0 { - // Rule at src/isa/s390x/inst.isle line 3681. - let expr0_0 = constructor_vec_pack_ssat(ctx, pattern0_0, pattern1_0, pattern2_0); - return expr0_0; - } - } - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let mut closure3 = || { - let expr0_0 = C::lane_order(ctx); - return Some(expr0_0); - }; - if let Some(pattern3_0) = closure3() { - if let &LaneOrder::LittleEndian = &pattern3_0 { - // Rule at src/isa/s390x/inst.isle line 3684. - let expr0_0 = constructor_vec_pack_ssat(ctx, pattern0_0, pattern2_0, pattern1_0); - return expr0_0; - } - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "vec_pack_ssat_lane_order", "src/isa/s390x/inst.isle line 3680" - ); -} - -// Generated as internal constructor for term vec_pack_usat_lane_order. -pub fn constructor_vec_pack_usat_lane_order( - ctx: &mut C, - arg0: Type, - arg1: Reg, - arg2: Reg, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let mut closure3 = || { - let expr0_0 = C::lane_order(ctx); - return Some(expr0_0); - }; - if let Some(pattern3_0) = closure3() { - if let &LaneOrder::BigEndian = &pattern3_0 { - // Rule at src/isa/s390x/inst.isle line 3689. - let expr0_0 = constructor_vec_pack_usat(ctx, pattern0_0, pattern1_0, pattern2_0); - return expr0_0; - } - } - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let mut closure3 = || { - let expr0_0 = C::lane_order(ctx); - return Some(expr0_0); - }; - if let Some(pattern3_0) = closure3() { - if let &LaneOrder::LittleEndian = &pattern3_0 { - // Rule at src/isa/s390x/inst.isle line 3692. - let expr0_0 = constructor_vec_pack_usat(ctx, pattern0_0, pattern2_0, pattern1_0); - return expr0_0; - } - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "vec_pack_usat_lane_order", "src/isa/s390x/inst.isle line 3688" - ); -} - -// Generated as internal constructor for term vec_unpacks_low_lane_order. -pub fn constructor_vec_unpacks_low_lane_order( - ctx: &mut C, - arg0: Type, - arg1: Reg, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let mut closure2 = || { - let expr0_0 = C::lane_order(ctx); - return Some(expr0_0); - }; - if let Some(pattern2_0) = closure2() { - if let &LaneOrder::BigEndian = &pattern2_0 { - // Rule at src/isa/s390x/inst.isle line 3702. - let expr0_0 = constructor_vec_unpacks_high(ctx, pattern0_0, pattern1_0); - return expr0_0; - } - } - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let mut closure2 = || { - let expr0_0 = C::lane_order(ctx); - return Some(expr0_0); - }; - if let Some(pattern2_0) = closure2() { - if let &LaneOrder::LittleEndian = &pattern2_0 { - // Rule at src/isa/s390x/inst.isle line 3705. - let expr0_0 = constructor_vec_unpacks_low(ctx, pattern0_0, pattern1_0); - return expr0_0; - } - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "vec_unpacks_low_lane_order", "src/isa/s390x/inst.isle line 3701" - ); -} - -// Generated as internal constructor for term vec_unpacks_high_lane_order. -pub fn constructor_vec_unpacks_high_lane_order( - ctx: &mut C, - arg0: Type, - arg1: Reg, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let mut closure2 = || { - let expr0_0 = C::lane_order(ctx); - return Some(expr0_0); - }; - if let Some(pattern2_0) = closure2() { - if let &LaneOrder::BigEndian = &pattern2_0 { - // Rule at src/isa/s390x/inst.isle line 3710. - let expr0_0 = constructor_vec_unpacks_low(ctx, pattern0_0, pattern1_0); - return expr0_0; - } - } - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let mut closure2 = || { - let expr0_0 = C::lane_order(ctx); - return Some(expr0_0); - }; - if let Some(pattern2_0) = closure2() { - if let &LaneOrder::LittleEndian = &pattern2_0 { - // Rule at src/isa/s390x/inst.isle line 3713. - let expr0_0 = constructor_vec_unpacks_high(ctx, pattern0_0, pattern1_0); - return expr0_0; - } - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "vec_unpacks_high_lane_order", "src/isa/s390x/inst.isle line 3709" - ); -} - -// Generated as internal constructor for term vec_unpacku_low_lane_order. -pub fn constructor_vec_unpacku_low_lane_order( - ctx: &mut C, - arg0: Type, - arg1: Reg, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let mut closure2 = || { - let expr0_0 = C::lane_order(ctx); - return Some(expr0_0); - }; - if let Some(pattern2_0) = closure2() { - if let &LaneOrder::BigEndian = &pattern2_0 { - // Rule at src/isa/s390x/inst.isle line 3718. - let expr0_0 = constructor_vec_unpacku_high(ctx, pattern0_0, pattern1_0); - return expr0_0; - } - } - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let mut closure2 = || { - let expr0_0 = C::lane_order(ctx); - return Some(expr0_0); - }; - if let Some(pattern2_0) = closure2() { - if let &LaneOrder::LittleEndian = &pattern2_0 { - // Rule at src/isa/s390x/inst.isle line 3721. - let expr0_0 = constructor_vec_unpacku_low(ctx, pattern0_0, pattern1_0); - return expr0_0; - } - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "vec_unpacku_low_lane_order", "src/isa/s390x/inst.isle line 3717" - ); -} - -// Generated as internal constructor for term vec_unpacku_high_lane_order. -pub fn constructor_vec_unpacku_high_lane_order( - ctx: &mut C, - arg0: Type, - arg1: Reg, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let mut closure2 = || { - let expr0_0 = C::lane_order(ctx); - return Some(expr0_0); - }; - if let Some(pattern2_0) = closure2() { - if let &LaneOrder::BigEndian = &pattern2_0 { - // Rule at src/isa/s390x/inst.isle line 3726. - let expr0_0 = constructor_vec_unpacku_low(ctx, pattern0_0, pattern1_0); - return expr0_0; - } - } - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let mut closure2 = || { - let expr0_0 = C::lane_order(ctx); - return Some(expr0_0); - }; - if let Some(pattern2_0) = closure2() { - if let &LaneOrder::LittleEndian = &pattern2_0 { - // Rule at src/isa/s390x/inst.isle line 3729. - let expr0_0 = constructor_vec_unpacku_high(ctx, pattern0_0, pattern1_0); - return expr0_0; - } - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "vec_unpacku_high_lane_order", "src/isa/s390x/inst.isle line 3725" - ); -} - -// Generated as internal constructor for term vecop_merge_low. -pub fn constructor_vecop_merge_low(ctx: &mut C, arg0: Type) -> VecBinaryOp { - let pattern0_0 = arg0; - if pattern0_0 == I8X16 { - // Rule at src/isa/s390x/inst.isle line 3737. - let expr0_0 = VecBinaryOp::MergeLow8x16; - return expr0_0; - } - if pattern0_0 == I16X8 { - // Rule at src/isa/s390x/inst.isle line 3738. - let expr0_0 = VecBinaryOp::MergeLow16x8; - return expr0_0; - } - if pattern0_0 == I32X4 { - // Rule at src/isa/s390x/inst.isle line 3739. - let expr0_0 = VecBinaryOp::MergeLow32x4; - return expr0_0; - } - if pattern0_0 == I64X2 { - // Rule at src/isa/s390x/inst.isle line 3740. - let expr0_0 = VecBinaryOp::MergeLow64x2; - return expr0_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "vecop_merge_low", "src/isa/s390x/inst.isle line 3736" - ); -} - -// Generated as internal constructor for term vec_merge_low. -pub fn constructor_vec_merge_low(ctx: &mut C, arg0: Type, arg1: Reg, arg2: Reg) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 3743. - let expr0_0 = constructor_vecop_merge_low(ctx, pattern0_0); - let expr1_0 = constructor_vec_rrr(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term vecop_merge_high. -pub fn constructor_vecop_merge_high(ctx: &mut C, arg0: Type) -> VecBinaryOp { - let pattern0_0 = arg0; - if pattern0_0 == I8X16 { - // Rule at src/isa/s390x/inst.isle line 3746. - let expr0_0 = VecBinaryOp::MergeHigh8x16; - return expr0_0; - } - if pattern0_0 == I16X8 { - // Rule at src/isa/s390x/inst.isle line 3747. - let expr0_0 = VecBinaryOp::MergeHigh16x8; - return expr0_0; - } - if pattern0_0 == I32X4 { - // Rule at src/isa/s390x/inst.isle line 3748. - let expr0_0 = VecBinaryOp::MergeHigh32x4; - return expr0_0; - } - if pattern0_0 == I64X2 { - // Rule at src/isa/s390x/inst.isle line 3749. - let expr0_0 = VecBinaryOp::MergeHigh64x2; - return expr0_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "vecop_merge_high", "src/isa/s390x/inst.isle line 3745" - ); -} - -// Generated as internal constructor for term vec_merge_high. -pub fn constructor_vec_merge_high( - ctx: &mut C, - arg0: Type, - arg1: Reg, - arg2: Reg, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 3752. - let expr0_0 = constructor_vecop_merge_high(ctx, pattern0_0); - let expr1_0 = constructor_vec_rrr(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term vec_merge_low_lane_order. -pub fn constructor_vec_merge_low_lane_order( - ctx: &mut C, - arg0: Type, - arg1: Reg, - arg2: Reg, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let mut closure3 = || { - let expr0_0 = C::lane_order(ctx); - return Some(expr0_0); - }; - if let Some(pattern3_0) = closure3() { - if let &LaneOrder::BigEndian = &pattern3_0 { - // Rule at src/isa/s390x/inst.isle line 3763. - let expr0_0 = constructor_vec_merge_high(ctx, pattern0_0, pattern1_0, pattern2_0); - return expr0_0; - } - } - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let mut closure3 = || { - let expr0_0 = C::lane_order(ctx); - return Some(expr0_0); - }; - if let Some(pattern3_0) = closure3() { - if let &LaneOrder::LittleEndian = &pattern3_0 { - // Rule at src/isa/s390x/inst.isle line 3766. - let expr0_0 = constructor_vec_merge_low(ctx, pattern0_0, pattern2_0, pattern1_0); - return expr0_0; - } - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "vec_merge_low_lane_order", "src/isa/s390x/inst.isle line 3762" - ); -} - -// Generated as internal constructor for term vec_merge_high_lane_order. -pub fn constructor_vec_merge_high_lane_order( - ctx: &mut C, - arg0: Type, - arg1: Reg, - arg2: Reg, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let mut closure3 = || { - let expr0_0 = C::lane_order(ctx); - return Some(expr0_0); - }; - if let Some(pattern3_0) = closure3() { - if let &LaneOrder::BigEndian = &pattern3_0 { - // Rule at src/isa/s390x/inst.isle line 3771. - let expr0_0 = constructor_vec_merge_low(ctx, pattern0_0, pattern1_0, pattern2_0); - return expr0_0; - } - } - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let mut closure3 = || { - let expr0_0 = C::lane_order(ctx); - return Some(expr0_0); - }; - if let Some(pattern3_0) = closure3() { - if let &LaneOrder::LittleEndian = &pattern3_0 { - // Rule at src/isa/s390x/inst.isle line 3774. - let expr0_0 = constructor_vec_merge_high(ctx, pattern0_0, pattern2_0, pattern1_0); - return expr0_0; - } - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "vec_merge_high_lane_order", "src/isa/s390x/inst.isle line 3770" - ); -} - -// Generated as internal constructor for term clz_reg. -pub fn constructor_clz_reg(ctx: &mut C, arg0: i16, arg1: Reg) -> Reg { - let pattern0_0 = arg0; - if pattern0_0 == 64i128 as i16 { - let pattern2_0 = arg1; - // Rule at src/isa/s390x/inst.isle line 3785. - let expr0_0 = constructor_temp_writable_regpair(ctx); - let expr1_0 = MInst::Flogr { - rd: expr0_0, - rn: pattern2_0, - }; - let expr2_0 = C::emit(ctx, &expr1_0); - let expr3_0 = constructor_writable_regpair_to_regpair(ctx, expr0_0); - let expr4_0 = C::regpair_hi(ctx, expr3_0); - return expr4_0; - } - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/s390x/inst.isle line 3791. - let expr0_0 = constructor_temp_writable_regpair(ctx); - let expr1_0 = MInst::Flogr { - rd: expr0_0, - rn: pattern1_0, - }; - let expr2_0 = ProducesFlags::ProducesFlagsSideEffect { inst: expr1_0 }; - let expr3_0: Type = I64; - let expr4_0 = IntCC::Equal; - let expr5_0 = C::intcc_as_cond(ctx, &expr4_0); - let expr6_0 = constructor_writable_regpair_to_regpair(ctx, expr0_0); - let expr7_0 = C::regpair_hi(ctx, expr6_0); - let expr8_0 = constructor_cmov_imm(ctx, expr3_0, &expr5_0, pattern0_0, expr7_0); - let expr9_0 = constructor_with_flags_reg(ctx, &expr2_0, &expr8_0); - return expr9_0; -} - -// Generated as internal constructor for term vecop_clz. -pub fn constructor_vecop_clz(ctx: &mut C, arg0: Type) -> VecUnaryOp { - let pattern0_0 = arg0; - if pattern0_0 == I8X16 { - // Rule at src/isa/s390x/inst.isle line 3799. - let expr0_0 = VecUnaryOp::Clz8x16; - return expr0_0; - } - if pattern0_0 == I16X8 { - // Rule at src/isa/s390x/inst.isle line 3800. - let expr0_0 = VecUnaryOp::Clz16x8; - return expr0_0; - } - if pattern0_0 == I32X4 { - // Rule at src/isa/s390x/inst.isle line 3801. - let expr0_0 = VecUnaryOp::Clz32x4; - return expr0_0; - } - if pattern0_0 == I64X2 { - // Rule at src/isa/s390x/inst.isle line 3802. - let expr0_0 = VecUnaryOp::Clz64x2; - return expr0_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "vecop_clz", "src/isa/s390x/inst.isle line 3798" - ); -} - -// Generated as internal constructor for term vec_clz. -pub fn constructor_vec_clz(ctx: &mut C, arg0: Type, arg1: Reg) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/s390x/inst.isle line 3805. - let expr0_0 = constructor_vecop_clz(ctx, pattern0_0); - let expr1_0 = constructor_vec_rr(ctx, pattern0_0, &expr0_0, pattern1_0); - return expr1_0; -} - -// Generated as internal constructor for term vecop_ctz. -pub fn constructor_vecop_ctz(ctx: &mut C, arg0: Type) -> VecUnaryOp { - let pattern0_0 = arg0; - if pattern0_0 == I8X16 { - // Rule at src/isa/s390x/inst.isle line 3809. - let expr0_0 = VecUnaryOp::Ctz8x16; - return expr0_0; - } - if pattern0_0 == I16X8 { - // Rule at src/isa/s390x/inst.isle line 3810. - let expr0_0 = VecUnaryOp::Ctz16x8; - return expr0_0; - } - if pattern0_0 == I32X4 { - // Rule at src/isa/s390x/inst.isle line 3811. - let expr0_0 = VecUnaryOp::Ctz32x4; - return expr0_0; - } - if pattern0_0 == I64X2 { - // Rule at src/isa/s390x/inst.isle line 3812. - let expr0_0 = VecUnaryOp::Ctz64x2; - return expr0_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "vecop_ctz", "src/isa/s390x/inst.isle line 3808" - ); -} - -// Generated as internal constructor for term vec_ctz. -pub fn constructor_vec_ctz(ctx: &mut C, arg0: Type, arg1: Reg) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/s390x/inst.isle line 3815. - let expr0_0 = constructor_vecop_ctz(ctx, pattern0_0); - let expr1_0 = constructor_vec_rr(ctx, pattern0_0, &expr0_0, pattern1_0); - return expr1_0; -} - -// Generated as internal constructor for term uint_sat_reg. -pub fn constructor_uint_sat_reg(ctx: &mut C, arg0: Type, arg1: Type, arg2: Reg) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - if pattern1_0 == pattern0_0 { - let pattern3_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 3821. - return pattern3_0; - } - let pattern0_0 = arg0; - if pattern0_0 == I8 { - let pattern2_0 = arg1; - if let Some(pattern3_0) = C::ty_32_or_64(ctx, pattern2_0) { - let pattern4_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 3822. - let expr0_0: u32 = 256i128 as u32; - let expr1_0 = constructor_icmpu_uimm32(ctx, pattern3_0, pattern4_0, expr0_0); - let expr2_0 = IntCC::UnsignedGreaterThan; - let expr3_0 = C::intcc_as_cond(ctx, &expr2_0); - let expr4_0: i16 = 255i128 as i16; - let expr5_0 = constructor_cmov_imm(ctx, pattern3_0, &expr3_0, expr4_0, pattern4_0); - let expr6_0 = constructor_with_flags_reg(ctx, &expr1_0, &expr5_0); - return expr6_0; - } - } - if pattern0_0 == I16 { - let pattern2_0 = arg1; - if let Some(pattern3_0) = C::ty_32_or_64(ctx, pattern2_0) { - let pattern4_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 3825. - let expr0_0: u32 = 65535i128 as u32; - let expr1_0 = constructor_icmpu_uimm32(ctx, pattern3_0, pattern4_0, expr0_0); - let expr2_0 = IntCC::UnsignedGreaterThan; - let expr3_0 = C::intcc_as_cond(ctx, &expr2_0); - let expr4_0: i16 = -1i128 as i16; - let expr5_0 = constructor_cmov_imm(ctx, pattern3_0, &expr3_0, expr4_0, pattern4_0); - let expr6_0 = constructor_with_flags_reg(ctx, &expr1_0, &expr5_0); - return expr6_0; - } - } - if pattern0_0 == I32 { - let pattern2_0 = arg1; - if pattern2_0 == I64 { - let pattern4_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 3828. - let expr0_0: Type = I64; - let expr1_0: u64 = 4294967295i128 as u64; - let expr2_0 = constructor_imm(ctx, expr0_0, expr1_0); - let expr3_0: Type = I64; - let expr4_0 = constructor_icmpu_reg(ctx, expr3_0, pattern4_0, expr2_0); - let expr5_0 = IntCC::UnsignedGreaterThan; - let expr6_0 = C::intcc_as_cond(ctx, &expr5_0); - let expr7_0 = constructor_bool(ctx, &expr4_0, &expr6_0); - let expr8_0: Type = I64; - let expr9_0 = constructor_select_bool_reg(ctx, expr8_0, &expr7_0, expr2_0, pattern4_0); - return expr9_0; - } - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "uint_sat_reg", "src/isa/s390x/inst.isle line 3820" - ); -} - -// Generated as internal constructor for term sint_sat_reg. -pub fn constructor_sint_sat_reg(ctx: &mut C, arg0: Type, arg1: Type, arg2: Reg) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - if pattern1_0 == pattern0_0 { - let pattern3_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 3836. - return pattern3_0; - } - let pattern0_0 = arg0; - if pattern0_0 == I8 { - let pattern2_0 = arg1; - if let Some(pattern3_0) = C::ty_32_or_64(ctx, pattern2_0) { - let pattern4_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 3837. - let expr0_0: i16 = 127i128 as i16; - let expr1_0 = constructor_icmps_simm16(ctx, pattern3_0, pattern4_0, expr0_0); - let expr2_0 = IntCC::SignedGreaterThan; - let expr3_0 = C::intcc_as_cond(ctx, &expr2_0); - let expr4_0: i16 = 127i128 as i16; - let expr5_0 = constructor_cmov_imm(ctx, pattern3_0, &expr3_0, expr4_0, pattern4_0); - let expr6_0 = constructor_with_flags_reg(ctx, &expr1_0, &expr5_0); - let expr7_0: i16 = -128i128 as i16; - let expr8_0 = constructor_icmps_simm16(ctx, pattern3_0, expr6_0, expr7_0); - let expr9_0 = IntCC::SignedLessThan; - let expr10_0 = C::intcc_as_cond(ctx, &expr9_0); - let expr11_0: i16 = -128i128 as i16; - let expr12_0 = constructor_cmov_imm(ctx, pattern3_0, &expr10_0, expr11_0, expr6_0); - let expr13_0 = constructor_with_flags_reg(ctx, &expr8_0, &expr12_0); - return expr13_0; - } - } - if pattern0_0 == I16 { - let pattern2_0 = arg1; - if let Some(pattern3_0) = C::ty_32_or_64(ctx, pattern2_0) { - let pattern4_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 3843. - let expr0_0: i16 = 32767i128 as i16; - let expr1_0 = constructor_icmps_simm16(ctx, pattern3_0, pattern4_0, expr0_0); - let expr2_0 = IntCC::SignedGreaterThan; - let expr3_0 = C::intcc_as_cond(ctx, &expr2_0); - let expr4_0: i16 = 32767i128 as i16; - let expr5_0 = constructor_cmov_imm(ctx, pattern3_0, &expr3_0, expr4_0, pattern4_0); - let expr6_0 = constructor_with_flags_reg(ctx, &expr1_0, &expr5_0); - let expr7_0: i16 = -32768i128 as i16; - let expr8_0 = constructor_icmps_simm16(ctx, pattern3_0, expr6_0, expr7_0); - let expr9_0 = IntCC::SignedLessThan; - let expr10_0 = C::intcc_as_cond(ctx, &expr9_0); - let expr11_0: i16 = -32768i128 as i16; - let expr12_0 = constructor_cmov_imm(ctx, pattern3_0, &expr10_0, expr11_0, expr6_0); - let expr13_0 = constructor_with_flags_reg(ctx, &expr8_0, &expr12_0); - return expr13_0; - } - } - if pattern0_0 == I32 { - let pattern2_0 = arg1; - if pattern2_0 == I64 { - let pattern4_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 3849. - let expr0_0: Type = I64; - let expr1_0: i32 = 2147483647i128 as i32; - let expr2_0 = constructor_imm32(ctx, expr0_0, expr1_0); - let expr3_0: Type = I64; - let expr4_0 = constructor_icmps_reg(ctx, expr3_0, pattern4_0, expr2_0); - let expr5_0 = IntCC::SignedGreaterThan; - let expr6_0 = C::intcc_as_cond(ctx, &expr5_0); - let expr7_0 = constructor_bool(ctx, &expr4_0, &expr6_0); - let expr8_0: Type = I64; - let expr9_0 = constructor_select_bool_reg(ctx, expr8_0, &expr7_0, expr2_0, pattern4_0); - let expr10_0: Type = I64; - let expr11_0: i32 = -2147483648i128 as i32; - let expr12_0 = constructor_imm32(ctx, expr10_0, expr11_0); - let expr13_0: Type = I64; - let expr14_0 = constructor_icmps_reg(ctx, expr13_0, expr9_0, expr12_0); - let expr15_0 = IntCC::SignedLessThan; - let expr16_0 = C::intcc_as_cond(ctx, &expr15_0); - let expr17_0 = constructor_bool(ctx, &expr14_0, &expr16_0); - let expr18_0: Type = I64; - let expr19_0 = constructor_select_bool_reg(ctx, expr18_0, &expr17_0, expr12_0, expr9_0); - return expr19_0; - } - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "sint_sat_reg", "src/isa/s390x/inst.isle line 3835" - ); -} - -// Generated as internal constructor for term aluop_add. -pub fn constructor_aluop_add(ctx: &mut C, arg0: Type) -> ALUOp { - let pattern0_0 = arg0; - if pattern0_0 == I8 { - // Rule at src/isa/s390x/inst.isle line 3865. - let expr0_0 = ALUOp::Add32; - return expr0_0; - } - if pattern0_0 == I16 { - // Rule at src/isa/s390x/inst.isle line 3866. - let expr0_0 = ALUOp::Add32; - return expr0_0; - } - if pattern0_0 == I32 { - // Rule at src/isa/s390x/inst.isle line 3867. - let expr0_0 = ALUOp::Add32; - return expr0_0; - } - if pattern0_0 == I64 { - // Rule at src/isa/s390x/inst.isle line 3868. - let expr0_0 = ALUOp::Add64; - return expr0_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "aluop_add", "src/isa/s390x/inst.isle line 3864" - ); -} - -// Generated as internal constructor for term aluop_add_sext16. -pub fn constructor_aluop_add_sext16(ctx: &mut C, arg0: Type) -> ALUOp { - let pattern0_0 = arg0; - if pattern0_0 == I16 { - // Rule at src/isa/s390x/inst.isle line 3871. - let expr0_0 = ALUOp::Add32Ext16; - return expr0_0; - } - if pattern0_0 == I32 { - // Rule at src/isa/s390x/inst.isle line 3872. - let expr0_0 = ALUOp::Add32Ext16; - return expr0_0; - } - if pattern0_0 == I64 { - // Rule at src/isa/s390x/inst.isle line 3873. - let expr0_0 = ALUOp::Add64Ext16; - return expr0_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "aluop_add_sext16", "src/isa/s390x/inst.isle line 3870" - ); -} - -// Generated as internal constructor for term aluop_add_sext32. -pub fn constructor_aluop_add_sext32(ctx: &mut C, arg0: Type) -> ALUOp { - let pattern0_0 = arg0; - if pattern0_0 == I64 { - // Rule at src/isa/s390x/inst.isle line 3876. - let expr0_0 = ALUOp::Add64Ext32; - return expr0_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "aluop_add_sext32", "src/isa/s390x/inst.isle line 3875" - ); -} - -// Generated as internal constructor for term add_reg. -pub fn constructor_add_reg(ctx: &mut C, arg0: Type, arg1: Reg, arg2: Reg) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 3879. - let expr0_0 = constructor_aluop_add(ctx, pattern0_0); - let expr1_0 = constructor_alu_rrr(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term add_reg_sext32. -pub fn constructor_add_reg_sext32( - ctx: &mut C, - arg0: Type, - arg1: Reg, - arg2: Reg, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 3882. - let expr0_0 = constructor_aluop_add_sext32(ctx, pattern0_0); - let expr1_0 = constructor_alu_rr(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term add_simm16. -pub fn constructor_add_simm16(ctx: &mut C, arg0: Type, arg1: Reg, arg2: i16) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 3885. - let expr0_0 = constructor_aluop_add(ctx, pattern0_0); - let expr1_0 = constructor_alu_rrsimm16(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term add_simm32. -pub fn constructor_add_simm32(ctx: &mut C, arg0: Type, arg1: Reg, arg2: i32) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 3888. - let expr0_0 = constructor_aluop_add(ctx, pattern0_0); - let expr1_0 = constructor_alu_rsimm32(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term add_mem. -pub fn constructor_add_mem(ctx: &mut C, arg0: Type, arg1: Reg, arg2: &MemArg) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 3891. - let expr0_0 = constructor_aluop_add(ctx, pattern0_0); - let expr1_0 = constructor_alu_rx(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term add_mem_sext16. -pub fn constructor_add_mem_sext16( - ctx: &mut C, - arg0: Type, - arg1: Reg, - arg2: &MemArg, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 3894. - let expr0_0 = constructor_aluop_add_sext16(ctx, pattern0_0); - let expr1_0 = constructor_alu_rx(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term add_mem_sext32. -pub fn constructor_add_mem_sext32( - ctx: &mut C, - arg0: Type, - arg1: Reg, - arg2: &MemArg, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 3897. - let expr0_0 = constructor_aluop_add_sext32(ctx, pattern0_0); - let expr1_0 = constructor_alu_rx(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term vecop_add. -pub fn constructor_vecop_add(ctx: &mut C, arg0: Type) -> VecBinaryOp { - let pattern0_0 = arg0; - if pattern0_0 == I128 { - // Rule at src/isa/s390x/inst.isle line 3904. - let expr0_0 = VecBinaryOp::Add128; - return expr0_0; - } - if pattern0_0 == I8X16 { - // Rule at src/isa/s390x/inst.isle line 3900. - let expr0_0 = VecBinaryOp::Add8x16; - return expr0_0; - } - if pattern0_0 == I16X8 { - // Rule at src/isa/s390x/inst.isle line 3901. - let expr0_0 = VecBinaryOp::Add16x8; - return expr0_0; - } - if pattern0_0 == I32X4 { - // Rule at src/isa/s390x/inst.isle line 3902. - let expr0_0 = VecBinaryOp::Add32x4; - return expr0_0; - } - if pattern0_0 == I64X2 { - // Rule at src/isa/s390x/inst.isle line 3903. - let expr0_0 = VecBinaryOp::Add64x2; - return expr0_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "vecop_add", "src/isa/s390x/inst.isle line 3899" - ); -} - -// Generated as internal constructor for term vec_add. -pub fn constructor_vec_add(ctx: &mut C, arg0: Type, arg1: Reg, arg2: Reg) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 3907. - let expr0_0 = constructor_vecop_add(ctx, pattern0_0); - let expr1_0 = constructor_vec_rrr(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term aluop_add_logical. -pub fn constructor_aluop_add_logical(ctx: &mut C, arg0: Type) -> ALUOp { - let pattern0_0 = arg0; - if pattern0_0 == I32 { - // Rule at src/isa/s390x/inst.isle line 3913. - let expr0_0 = ALUOp::AddLogical32; - return expr0_0; - } - if pattern0_0 == I64 { - // Rule at src/isa/s390x/inst.isle line 3914. - let expr0_0 = ALUOp::AddLogical64; - return expr0_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "aluop_add_logical", "src/isa/s390x/inst.isle line 3912" - ); -} - -// Generated as internal constructor for term aluop_add_logical_zext32. -pub fn constructor_aluop_add_logical_zext32(ctx: &mut C, arg0: Type) -> ALUOp { - let pattern0_0 = arg0; - if pattern0_0 == I64 { - // Rule at src/isa/s390x/inst.isle line 3917. - let expr0_0 = ALUOp::AddLogical64Ext32; - return expr0_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "aluop_add_logical_zext32", "src/isa/s390x/inst.isle line 3916" - ); -} - -// Generated as internal constructor for term add_logical_reg. -pub fn constructor_add_logical_reg( - ctx: &mut C, - arg0: Type, - arg1: Reg, - arg2: Reg, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 3920. - let expr0_0 = constructor_aluop_add_logical(ctx, pattern0_0); - let expr1_0 = constructor_alu_rrr(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term add_logical_reg_with_flags_paired. -pub fn constructor_add_logical_reg_with_flags_paired( - ctx: &mut C, - arg0: Type, - arg1: Reg, - arg2: Reg, -) -> ProducesFlags { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 3923. - let expr0_0 = constructor_aluop_add_logical(ctx, pattern0_0); - let expr1_0 = - constructor_alu_rrr_with_flags_paired(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term add_logical_reg_zext32. -pub fn constructor_add_logical_reg_zext32( - ctx: &mut C, - arg0: Type, - arg1: Reg, - arg2: Reg, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 3927. - let expr0_0 = constructor_aluop_add_logical_zext32(ctx, pattern0_0); - let expr1_0 = constructor_alu_rr(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term add_logical_reg_zext32_with_flags_paired. -pub fn constructor_add_logical_reg_zext32_with_flags_paired( - ctx: &mut C, - arg0: Type, - arg1: Reg, - arg2: Reg, -) -> ProducesFlags { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 3930. - let expr0_0 = constructor_aluop_add_logical_zext32(ctx, pattern0_0); - let expr1_0 = - constructor_alu_rr_with_flags_paired(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term add_logical_zimm32. -pub fn constructor_add_logical_zimm32( - ctx: &mut C, - arg0: Type, - arg1: Reg, - arg2: u32, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 3934. - let expr0_0 = constructor_aluop_add_logical(ctx, pattern0_0); - let expr1_0 = constructor_alu_ruimm32(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term add_logical_zimm32_with_flags_paired. -pub fn constructor_add_logical_zimm32_with_flags_paired( - ctx: &mut C, - arg0: Type, - arg1: Reg, - arg2: u32, -) -> ProducesFlags { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 3937. - let expr0_0 = constructor_aluop_add_logical(ctx, pattern0_0); - let expr1_0 = constructor_alu_ruimm32_with_flags_paired( - ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0, - ); - return expr1_0; -} - -// Generated as internal constructor for term add_logical_mem. -pub fn constructor_add_logical_mem( - ctx: &mut C, - arg0: Type, - arg1: Reg, - arg2: &MemArg, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 3941. - let expr0_0 = constructor_aluop_add_logical(ctx, pattern0_0); - let expr1_0 = constructor_alu_rx(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term add_logical_mem_with_flags_paired. -pub fn constructor_add_logical_mem_with_flags_paired( - ctx: &mut C, - arg0: Type, - arg1: Reg, - arg2: &MemArg, -) -> ProducesFlags { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 3944. - let expr0_0 = constructor_aluop_add_logical(ctx, pattern0_0); - let expr1_0 = - constructor_alu_rx_with_flags_paired(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term add_logical_mem_zext32. -pub fn constructor_add_logical_mem_zext32( - ctx: &mut C, - arg0: Type, - arg1: Reg, - arg2: &MemArg, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 3948. - let expr0_0 = constructor_aluop_add_logical_zext32(ctx, pattern0_0); - let expr1_0 = constructor_alu_rx(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term add_logical_mem_zext32_with_flags_paired. -pub fn constructor_add_logical_mem_zext32_with_flags_paired( - ctx: &mut C, - arg0: Type, - arg1: Reg, - arg2: &MemArg, -) -> ProducesFlags { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 3951. - let expr0_0 = constructor_aluop_add_logical_zext32(ctx, pattern0_0); - let expr1_0 = - constructor_alu_rx_with_flags_paired(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term aluop_sub. -pub fn constructor_aluop_sub(ctx: &mut C, arg0: Type) -> ALUOp { - let pattern0_0 = arg0; - if pattern0_0 == I8 { - // Rule at src/isa/s390x/inst.isle line 3958. - let expr0_0 = ALUOp::Sub32; - return expr0_0; - } - if pattern0_0 == I16 { - // Rule at src/isa/s390x/inst.isle line 3959. - let expr0_0 = ALUOp::Sub32; - return expr0_0; - } - if pattern0_0 == I32 { - // Rule at src/isa/s390x/inst.isle line 3960. - let expr0_0 = ALUOp::Sub32; - return expr0_0; - } - if pattern0_0 == I64 { - // Rule at src/isa/s390x/inst.isle line 3961. - let expr0_0 = ALUOp::Sub64; - return expr0_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "aluop_sub", "src/isa/s390x/inst.isle line 3957" - ); -} - -// Generated as internal constructor for term aluop_sub_sext16. -pub fn constructor_aluop_sub_sext16(ctx: &mut C, arg0: Type) -> ALUOp { - let pattern0_0 = arg0; - if pattern0_0 == I16 { - // Rule at src/isa/s390x/inst.isle line 3964. - let expr0_0 = ALUOp::Sub32Ext16; - return expr0_0; - } - if pattern0_0 == I32 { - // Rule at src/isa/s390x/inst.isle line 3965. - let expr0_0 = ALUOp::Sub32Ext16; - return expr0_0; - } - if pattern0_0 == I64 { - // Rule at src/isa/s390x/inst.isle line 3966. - let expr0_0 = ALUOp::Sub64Ext16; - return expr0_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "aluop_sub_sext16", "src/isa/s390x/inst.isle line 3963" - ); -} - -// Generated as internal constructor for term aluop_sub_sext32. -pub fn constructor_aluop_sub_sext32(ctx: &mut C, arg0: Type) -> ALUOp { - let pattern0_0 = arg0; - if pattern0_0 == I64 { - // Rule at src/isa/s390x/inst.isle line 3969. - let expr0_0 = ALUOp::Sub64Ext32; - return expr0_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "aluop_sub_sext32", "src/isa/s390x/inst.isle line 3968" - ); -} - -// Generated as internal constructor for term sub_reg. -pub fn constructor_sub_reg(ctx: &mut C, arg0: Type, arg1: Reg, arg2: Reg) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 3972. - let expr0_0 = constructor_aluop_sub(ctx, pattern0_0); - let expr1_0 = constructor_alu_rrr(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term sub_reg_sext32. -pub fn constructor_sub_reg_sext32( - ctx: &mut C, - arg0: Type, - arg1: Reg, - arg2: Reg, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 3975. - let expr0_0 = constructor_aluop_sub_sext32(ctx, pattern0_0); - let expr1_0 = constructor_alu_rr(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term sub_mem. -pub fn constructor_sub_mem(ctx: &mut C, arg0: Type, arg1: Reg, arg2: &MemArg) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 3978. - let expr0_0 = constructor_aluop_sub(ctx, pattern0_0); - let expr1_0 = constructor_alu_rx(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term sub_mem_sext16. -pub fn constructor_sub_mem_sext16( - ctx: &mut C, - arg0: Type, - arg1: Reg, - arg2: &MemArg, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 3981. - let expr0_0 = constructor_aluop_sub_sext16(ctx, pattern0_0); - let expr1_0 = constructor_alu_rx(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term sub_mem_sext32. -pub fn constructor_sub_mem_sext32( - ctx: &mut C, - arg0: Type, - arg1: Reg, - arg2: &MemArg, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 3984. - let expr0_0 = constructor_aluop_sub_sext32(ctx, pattern0_0); - let expr1_0 = constructor_alu_rx(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term vecop_sub. -pub fn constructor_vecop_sub(ctx: &mut C, arg0: Type) -> VecBinaryOp { - let pattern0_0 = arg0; - if pattern0_0 == I128 { - // Rule at src/isa/s390x/inst.isle line 3991. - let expr0_0 = VecBinaryOp::Sub128; - return expr0_0; - } - if pattern0_0 == I8X16 { - // Rule at src/isa/s390x/inst.isle line 3987. - let expr0_0 = VecBinaryOp::Sub8x16; - return expr0_0; - } - if pattern0_0 == I16X8 { - // Rule at src/isa/s390x/inst.isle line 3988. - let expr0_0 = VecBinaryOp::Sub16x8; - return expr0_0; - } - if pattern0_0 == I32X4 { - // Rule at src/isa/s390x/inst.isle line 3989. - let expr0_0 = VecBinaryOp::Sub32x4; - return expr0_0; - } - if pattern0_0 == I64X2 { - // Rule at src/isa/s390x/inst.isle line 3990. - let expr0_0 = VecBinaryOp::Sub64x2; - return expr0_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "vecop_sub", "src/isa/s390x/inst.isle line 3986" - ); -} - -// Generated as internal constructor for term vec_sub. -pub fn constructor_vec_sub(ctx: &mut C, arg0: Type, arg1: Reg, arg2: Reg) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 3994. - let expr0_0 = constructor_vecop_sub(ctx, pattern0_0); - let expr1_0 = constructor_vec_rrr(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term aluop_sub_logical. -pub fn constructor_aluop_sub_logical(ctx: &mut C, arg0: Type) -> ALUOp { - let pattern0_0 = arg0; - if pattern0_0 == I32 { - // Rule at src/isa/s390x/inst.isle line 4000. - let expr0_0 = ALUOp::SubLogical32; - return expr0_0; - } - if pattern0_0 == I64 { - // Rule at src/isa/s390x/inst.isle line 4001. - let expr0_0 = ALUOp::SubLogical64; - return expr0_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "aluop_sub_logical", "src/isa/s390x/inst.isle line 3999" - ); -} - -// Generated as internal constructor for term aluop_sub_logical_zext32. -pub fn constructor_aluop_sub_logical_zext32(ctx: &mut C, arg0: Type) -> ALUOp { - let pattern0_0 = arg0; - if pattern0_0 == I64 { - // Rule at src/isa/s390x/inst.isle line 4004. - let expr0_0 = ALUOp::SubLogical64Ext32; - return expr0_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "aluop_sub_logical_zext32", "src/isa/s390x/inst.isle line 4003" - ); -} - -// Generated as internal constructor for term sub_logical_reg. -pub fn constructor_sub_logical_reg( - ctx: &mut C, - arg0: Type, - arg1: Reg, - arg2: Reg, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 4007. - let expr0_0 = constructor_aluop_sub_logical(ctx, pattern0_0); - let expr1_0 = constructor_alu_rrr(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term sub_logical_reg_zext32. -pub fn constructor_sub_logical_reg_zext32( - ctx: &mut C, - arg0: Type, - arg1: Reg, - arg2: Reg, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 4010. - let expr0_0 = constructor_aluop_sub_logical_zext32(ctx, pattern0_0); - let expr1_0 = constructor_alu_rr(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term sub_logical_zimm32. -pub fn constructor_sub_logical_zimm32( - ctx: &mut C, - arg0: Type, - arg1: Reg, - arg2: u32, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 4013. - let expr0_0 = constructor_aluop_sub_logical(ctx, pattern0_0); - let expr1_0 = constructor_alu_ruimm32(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term sub_logical_mem. -pub fn constructor_sub_logical_mem( - ctx: &mut C, - arg0: Type, - arg1: Reg, - arg2: &MemArg, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 4016. - let expr0_0 = constructor_aluop_sub_logical(ctx, pattern0_0); - let expr1_0 = constructor_alu_rx(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term sub_logical_mem_zext32. -pub fn constructor_sub_logical_mem_zext32( - ctx: &mut C, - arg0: Type, - arg1: Reg, - arg2: &MemArg, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 4019. - let expr0_0 = constructor_aluop_sub_logical(ctx, pattern0_0); - let expr1_0 = constructor_alu_rx(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term aluop_mul. -pub fn constructor_aluop_mul(ctx: &mut C, arg0: Type) -> ALUOp { - let pattern0_0 = arg0; - if pattern0_0 == I8 { - // Rule at src/isa/s390x/inst.isle line 4025. - let expr0_0 = ALUOp::Mul32; - return expr0_0; - } - if pattern0_0 == I16 { - // Rule at src/isa/s390x/inst.isle line 4026. - let expr0_0 = ALUOp::Mul32; - return expr0_0; - } - if pattern0_0 == I32 { - // Rule at src/isa/s390x/inst.isle line 4027. - let expr0_0 = ALUOp::Mul32; - return expr0_0; - } - if pattern0_0 == I64 { - // Rule at src/isa/s390x/inst.isle line 4028. - let expr0_0 = ALUOp::Mul64; - return expr0_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "aluop_mul", "src/isa/s390x/inst.isle line 4024" - ); -} - -// Generated as internal constructor for term aluop_mul_sext16. -pub fn constructor_aluop_mul_sext16(ctx: &mut C, arg0: Type) -> ALUOp { - let pattern0_0 = arg0; - if pattern0_0 == I16 { - // Rule at src/isa/s390x/inst.isle line 4031. - let expr0_0 = ALUOp::Mul32Ext16; - return expr0_0; - } - if pattern0_0 == I32 { - // Rule at src/isa/s390x/inst.isle line 4032. - let expr0_0 = ALUOp::Mul32Ext16; - return expr0_0; - } - if pattern0_0 == I64 { - // Rule at src/isa/s390x/inst.isle line 4033. - let expr0_0 = ALUOp::Mul64Ext16; - return expr0_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "aluop_mul_sext16", "src/isa/s390x/inst.isle line 4030" - ); -} - -// Generated as internal constructor for term aluop_mul_sext32. -pub fn constructor_aluop_mul_sext32(ctx: &mut C, arg0: Type) -> ALUOp { - let pattern0_0 = arg0; - if pattern0_0 == I64 { - // Rule at src/isa/s390x/inst.isle line 4036. - let expr0_0 = ALUOp::Mul64Ext32; - return expr0_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "aluop_mul_sext32", "src/isa/s390x/inst.isle line 4035" - ); -} - -// Generated as internal constructor for term mul_reg. -pub fn constructor_mul_reg(ctx: &mut C, arg0: Type, arg1: Reg, arg2: Reg) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 4039. - let expr0_0 = constructor_aluop_mul(ctx, pattern0_0); - let expr1_0 = constructor_alu_rrr(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term mul_reg_sext32. -pub fn constructor_mul_reg_sext32( - ctx: &mut C, - arg0: Type, - arg1: Reg, - arg2: Reg, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 4042. - let expr0_0 = constructor_aluop_mul_sext32(ctx, pattern0_0); - let expr1_0 = constructor_alu_rr(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term mul_simm16. -pub fn constructor_mul_simm16(ctx: &mut C, arg0: Type, arg1: Reg, arg2: i16) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 4045. - let expr0_0 = constructor_aluop_mul(ctx, pattern0_0); - let expr1_0 = constructor_alu_rsimm16(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term mul_simm32. -pub fn constructor_mul_simm32(ctx: &mut C, arg0: Type, arg1: Reg, arg2: i32) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 4048. - let expr0_0 = constructor_aluop_mul(ctx, pattern0_0); - let expr1_0 = constructor_alu_rsimm32(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term mul_mem. -pub fn constructor_mul_mem(ctx: &mut C, arg0: Type, arg1: Reg, arg2: &MemArg) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 4051. - let expr0_0 = constructor_aluop_mul(ctx, pattern0_0); - let expr1_0 = constructor_alu_rx(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term mul_mem_sext16. -pub fn constructor_mul_mem_sext16( - ctx: &mut C, - arg0: Type, - arg1: Reg, - arg2: &MemArg, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 4054. - let expr0_0 = constructor_aluop_mul_sext16(ctx, pattern0_0); - let expr1_0 = constructor_alu_rx(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term mul_mem_sext32. -pub fn constructor_mul_mem_sext32( - ctx: &mut C, - arg0: Type, - arg1: Reg, - arg2: &MemArg, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 4057. - let expr0_0 = constructor_aluop_mul_sext32(ctx, pattern0_0); - let expr1_0 = constructor_alu_rx(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term vecop_mul. -pub fn constructor_vecop_mul(ctx: &mut C, arg0: Type) -> VecBinaryOp { - let pattern0_0 = arg0; - if pattern0_0 == I8X16 { - // Rule at src/isa/s390x/inst.isle line 4060. - let expr0_0 = VecBinaryOp::Mul8x16; - return expr0_0; - } - if pattern0_0 == I16X8 { - // Rule at src/isa/s390x/inst.isle line 4061. - let expr0_0 = VecBinaryOp::Mul16x8; - return expr0_0; - } - if pattern0_0 == I32X4 { - // Rule at src/isa/s390x/inst.isle line 4062. - let expr0_0 = VecBinaryOp::Mul32x4; - return expr0_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "vecop_mul", "src/isa/s390x/inst.isle line 4059" - ); -} - -// Generated as internal constructor for term vec_mul. -pub fn constructor_vec_mul(ctx: &mut C, arg0: Type, arg1: Reg, arg2: Reg) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 4066. - let expr0_0 = constructor_vecop_mul(ctx, pattern0_0); - let expr1_0 = constructor_vec_rrr(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term vecop_umulhi. -pub fn constructor_vecop_umulhi(ctx: &mut C, arg0: Type) -> VecBinaryOp { - let pattern0_0 = arg0; - if pattern0_0 == I8X16 { - // Rule at src/isa/s390x/inst.isle line 4069. - let expr0_0 = VecBinaryOp::UMulHi8x16; - return expr0_0; - } - if pattern0_0 == I16X8 { - // Rule at src/isa/s390x/inst.isle line 4070. - let expr0_0 = VecBinaryOp::UMulHi16x8; - return expr0_0; - } - if pattern0_0 == I32X4 { - // Rule at src/isa/s390x/inst.isle line 4071. - let expr0_0 = VecBinaryOp::UMulHi32x4; - return expr0_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "vecop_umulhi", "src/isa/s390x/inst.isle line 4068" - ); -} - -// Generated as internal constructor for term vec_umulhi. -pub fn constructor_vec_umulhi(ctx: &mut C, arg0: Type, arg1: Reg, arg2: Reg) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 4075. - let expr0_0 = constructor_vecop_umulhi(ctx, pattern0_0); - let expr1_0 = constructor_vec_rrr(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term vecop_smulhi. -pub fn constructor_vecop_smulhi(ctx: &mut C, arg0: Type) -> VecBinaryOp { - let pattern0_0 = arg0; - if pattern0_0 == I8X16 { - // Rule at src/isa/s390x/inst.isle line 4078. - let expr0_0 = VecBinaryOp::SMulHi8x16; - return expr0_0; - } - if pattern0_0 == I16X8 { - // Rule at src/isa/s390x/inst.isle line 4079. - let expr0_0 = VecBinaryOp::SMulHi16x8; - return expr0_0; - } - if pattern0_0 == I32X4 { - // Rule at src/isa/s390x/inst.isle line 4080. - let expr0_0 = VecBinaryOp::SMulHi32x4; - return expr0_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "vecop_smulhi", "src/isa/s390x/inst.isle line 4077" - ); -} - -// Generated as internal constructor for term vec_smulhi. -pub fn constructor_vec_smulhi(ctx: &mut C, arg0: Type, arg1: Reg, arg2: Reg) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 4084. - let expr0_0 = constructor_vecop_smulhi(ctx, pattern0_0); - let expr1_0 = constructor_vec_rrr(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term vecop_umul_even. -pub fn constructor_vecop_umul_even(ctx: &mut C, arg0: Type) -> VecBinaryOp { - let pattern0_0 = arg0; - if pattern0_0 == I8X16 { - // Rule at src/isa/s390x/inst.isle line 4087. - let expr0_0 = VecBinaryOp::UMulEven8x16; - return expr0_0; - } - if pattern0_0 == I16X8 { - // Rule at src/isa/s390x/inst.isle line 4088. - let expr0_0 = VecBinaryOp::UMulEven16x8; - return expr0_0; - } - if pattern0_0 == I32X4 { - // Rule at src/isa/s390x/inst.isle line 4089. - let expr0_0 = VecBinaryOp::UMulEven32x4; - return expr0_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "vecop_umul_even", "src/isa/s390x/inst.isle line 4086" - ); -} - -// Generated as internal constructor for term vec_umul_even. -pub fn constructor_vec_umul_even(ctx: &mut C, arg0: Type, arg1: Reg, arg2: Reg) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 4093. - let expr0_0 = constructor_vecop_umul_even(ctx, pattern0_0); - let expr1_0 = constructor_vec_rrr(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term vecop_smul_even. -pub fn constructor_vecop_smul_even(ctx: &mut C, arg0: Type) -> VecBinaryOp { - let pattern0_0 = arg0; - if pattern0_0 == I8X16 { - // Rule at src/isa/s390x/inst.isle line 4096. - let expr0_0 = VecBinaryOp::SMulEven8x16; - return expr0_0; - } - if pattern0_0 == I16X8 { - // Rule at src/isa/s390x/inst.isle line 4097. - let expr0_0 = VecBinaryOp::SMulEven16x8; - return expr0_0; - } - if pattern0_0 == I32X4 { - // Rule at src/isa/s390x/inst.isle line 4098. - let expr0_0 = VecBinaryOp::SMulEven32x4; - return expr0_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "vecop_smul_even", "src/isa/s390x/inst.isle line 4095" - ); -} - -// Generated as internal constructor for term vec_smul_even. -pub fn constructor_vec_smul_even(ctx: &mut C, arg0: Type, arg1: Reg, arg2: Reg) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 4102. - let expr0_0 = constructor_vecop_smul_even(ctx, pattern0_0); - let expr1_0 = constructor_vec_rrr(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term vecop_umul_odd. -pub fn constructor_vecop_umul_odd(ctx: &mut C, arg0: Type) -> VecBinaryOp { - let pattern0_0 = arg0; - if pattern0_0 == I8X16 { - // Rule at src/isa/s390x/inst.isle line 4105. - let expr0_0 = VecBinaryOp::UMulOdd8x16; - return expr0_0; - } - if pattern0_0 == I16X8 { - // Rule at src/isa/s390x/inst.isle line 4106. - let expr0_0 = VecBinaryOp::UMulOdd16x8; - return expr0_0; - } - if pattern0_0 == I32X4 { - // Rule at src/isa/s390x/inst.isle line 4107. - let expr0_0 = VecBinaryOp::UMulOdd32x4; - return expr0_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "vecop_umul_odd", "src/isa/s390x/inst.isle line 4104" - ); -} - -// Generated as internal constructor for term vec_umul_odd. -pub fn constructor_vec_umul_odd(ctx: &mut C, arg0: Type, arg1: Reg, arg2: Reg) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 4111. - let expr0_0 = constructor_vecop_umul_odd(ctx, pattern0_0); - let expr1_0 = constructor_vec_rrr(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term vecop_smul_odd. -pub fn constructor_vecop_smul_odd(ctx: &mut C, arg0: Type) -> VecBinaryOp { - let pattern0_0 = arg0; - if pattern0_0 == I8X16 { - // Rule at src/isa/s390x/inst.isle line 4114. - let expr0_0 = VecBinaryOp::SMulOdd8x16; - return expr0_0; - } - if pattern0_0 == I16X8 { - // Rule at src/isa/s390x/inst.isle line 4115. - let expr0_0 = VecBinaryOp::SMulOdd16x8; - return expr0_0; - } - if pattern0_0 == I32X4 { - // Rule at src/isa/s390x/inst.isle line 4116. - let expr0_0 = VecBinaryOp::SMulOdd32x4; - return expr0_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "vecop_smul_odd", "src/isa/s390x/inst.isle line 4113" - ); -} - -// Generated as internal constructor for term vec_smul_odd. -pub fn constructor_vec_smul_odd(ctx: &mut C, arg0: Type, arg1: Reg, arg2: Reg) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 4120. - let expr0_0 = constructor_vecop_smul_odd(ctx, pattern0_0); - let expr1_0 = constructor_vec_rrr(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term udivmod. -pub fn constructor_udivmod( - ctx: &mut C, - arg0: Type, - arg1: RegPair, - arg2: Reg, -) -> RegPair { - let pattern0_0 = arg0; - if pattern0_0 == I32 { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 4126. - let expr0_0 = constructor_udivmod32(ctx, pattern2_0, pattern3_0); - return expr0_0; - } - if pattern0_0 == I64 { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 4127. - let expr0_0 = constructor_udivmod64(ctx, pattern2_0, pattern3_0); - return expr0_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "udivmod", "src/isa/s390x/inst.isle line 4125" - ); -} - -// Generated as internal constructor for term sdivmod. -pub fn constructor_sdivmod(ctx: &mut C, arg0: Type, arg1: Reg, arg2: Reg) -> RegPair { - let pattern0_0 = arg0; - if pattern0_0 == I32 { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 4133. - let expr0_0 = constructor_sdivmod32(ctx, pattern2_0, pattern3_0); - return expr0_0; - } - if pattern0_0 == I64 { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 4134. - let expr0_0 = constructor_sdivmod64(ctx, pattern2_0, pattern3_0); - return expr0_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "sdivmod", "src/isa/s390x/inst.isle line 4132" - ); -} - -// Generated as internal constructor for term vecop_umax. -pub fn constructor_vecop_umax(ctx: &mut C, arg0: Type) -> VecBinaryOp { - let pattern0_0 = arg0; - if pattern0_0 == I8X16 { - // Rule at src/isa/s390x/inst.isle line 4140. - let expr0_0 = VecBinaryOp::UMax8x16; - return expr0_0; - } - if pattern0_0 == I16X8 { - // Rule at src/isa/s390x/inst.isle line 4141. - let expr0_0 = VecBinaryOp::UMax16x8; - return expr0_0; - } - if pattern0_0 == I32X4 { - // Rule at src/isa/s390x/inst.isle line 4142. - let expr0_0 = VecBinaryOp::UMax32x4; - return expr0_0; - } - if pattern0_0 == I64X2 { - // Rule at src/isa/s390x/inst.isle line 4143. - let expr0_0 = VecBinaryOp::UMax64x2; - return expr0_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "vecop_umax", "src/isa/s390x/inst.isle line 4139" - ); -} - -// Generated as internal constructor for term vec_umax. -pub fn constructor_vec_umax(ctx: &mut C, arg0: Type, arg1: Reg, arg2: Reg) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 4146. - let expr0_0 = constructor_vecop_umax(ctx, pattern0_0); - let expr1_0 = constructor_vec_rrr(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term vecop_smax. -pub fn constructor_vecop_smax(ctx: &mut C, arg0: Type) -> VecBinaryOp { - let pattern0_0 = arg0; - if pattern0_0 == I8X16 { - // Rule at src/isa/s390x/inst.isle line 4152. - let expr0_0 = VecBinaryOp::SMax8x16; - return expr0_0; - } - if pattern0_0 == I16X8 { - // Rule at src/isa/s390x/inst.isle line 4153. - let expr0_0 = VecBinaryOp::SMax16x8; - return expr0_0; - } - if pattern0_0 == I32X4 { - // Rule at src/isa/s390x/inst.isle line 4154. - let expr0_0 = VecBinaryOp::SMax32x4; - return expr0_0; - } - if pattern0_0 == I64X2 { - // Rule at src/isa/s390x/inst.isle line 4155. - let expr0_0 = VecBinaryOp::SMax64x2; - return expr0_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "vecop_smax", "src/isa/s390x/inst.isle line 4151" - ); -} - -// Generated as internal constructor for term vec_smax. -pub fn constructor_vec_smax(ctx: &mut C, arg0: Type, arg1: Reg, arg2: Reg) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 4158. - let expr0_0 = constructor_vecop_smax(ctx, pattern0_0); - let expr1_0 = constructor_vec_rrr(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term vecop_umin. -pub fn constructor_vecop_umin(ctx: &mut C, arg0: Type) -> VecBinaryOp { - let pattern0_0 = arg0; - if pattern0_0 == I8X16 { - // Rule at src/isa/s390x/inst.isle line 4164. - let expr0_0 = VecBinaryOp::UMin8x16; - return expr0_0; - } - if pattern0_0 == I16X8 { - // Rule at src/isa/s390x/inst.isle line 4165. - let expr0_0 = VecBinaryOp::UMin16x8; - return expr0_0; - } - if pattern0_0 == I32X4 { - // Rule at src/isa/s390x/inst.isle line 4166. - let expr0_0 = VecBinaryOp::UMin32x4; - return expr0_0; - } - if pattern0_0 == I64X2 { - // Rule at src/isa/s390x/inst.isle line 4167. - let expr0_0 = VecBinaryOp::UMin64x2; - return expr0_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "vecop_umin", "src/isa/s390x/inst.isle line 4163" - ); -} - -// Generated as internal constructor for term vec_umin. -pub fn constructor_vec_umin(ctx: &mut C, arg0: Type, arg1: Reg, arg2: Reg) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 4170. - let expr0_0 = constructor_vecop_umin(ctx, pattern0_0); - let expr1_0 = constructor_vec_rrr(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term vecop_smin. -pub fn constructor_vecop_smin(ctx: &mut C, arg0: Type) -> VecBinaryOp { - let pattern0_0 = arg0; - if pattern0_0 == I8X16 { - // Rule at src/isa/s390x/inst.isle line 4176. - let expr0_0 = VecBinaryOp::SMin8x16; - return expr0_0; - } - if pattern0_0 == I16X8 { - // Rule at src/isa/s390x/inst.isle line 4177. - let expr0_0 = VecBinaryOp::SMin16x8; - return expr0_0; - } - if pattern0_0 == I32X4 { - // Rule at src/isa/s390x/inst.isle line 4178. - let expr0_0 = VecBinaryOp::SMin32x4; - return expr0_0; - } - if pattern0_0 == I64X2 { - // Rule at src/isa/s390x/inst.isle line 4179. - let expr0_0 = VecBinaryOp::SMin64x2; - return expr0_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "vecop_smin", "src/isa/s390x/inst.isle line 4175" - ); -} - -// Generated as internal constructor for term vec_smin. -pub fn constructor_vec_smin(ctx: &mut C, arg0: Type, arg1: Reg, arg2: Reg) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 4182. - let expr0_0 = constructor_vecop_smin(ctx, pattern0_0); - let expr1_0 = constructor_vec_rrr(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term vecop_uavg. -pub fn constructor_vecop_uavg(ctx: &mut C, arg0: Type) -> VecBinaryOp { - let pattern0_0 = arg0; - if pattern0_0 == I8X16 { - // Rule at src/isa/s390x/inst.isle line 4188. - let expr0_0 = VecBinaryOp::UAvg8x16; - return expr0_0; - } - if pattern0_0 == I16X8 { - // Rule at src/isa/s390x/inst.isle line 4189. - let expr0_0 = VecBinaryOp::UAvg16x8; - return expr0_0; - } - if pattern0_0 == I32X4 { - // Rule at src/isa/s390x/inst.isle line 4190. - let expr0_0 = VecBinaryOp::UAvg32x4; - return expr0_0; - } - if pattern0_0 == I64X2 { - // Rule at src/isa/s390x/inst.isle line 4191. - let expr0_0 = VecBinaryOp::UAvg64x2; - return expr0_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "vecop_uavg", "src/isa/s390x/inst.isle line 4187" - ); -} - -// Generated as internal constructor for term vec_uavg. -pub fn constructor_vec_uavg(ctx: &mut C, arg0: Type, arg1: Reg, arg2: Reg) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 4194. - let expr0_0 = constructor_vecop_uavg(ctx, pattern0_0); - let expr1_0 = constructor_vec_rrr(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term aluop_and. -pub fn constructor_aluop_and(ctx: &mut C, arg0: Type) -> ALUOp { - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::gpr64_ty(ctx, pattern0_0) { - // Rule at src/isa/s390x/inst.isle line 4201. - let expr0_0 = ALUOp::And64; - return expr0_0; - } - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::gpr32_ty(ctx, pattern0_0) { - // Rule at src/isa/s390x/inst.isle line 4200. - let expr0_0 = ALUOp::And32; - return expr0_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "aluop_and", "src/isa/s390x/inst.isle line 4199" - ); -} - -// Generated as internal constructor for term and_reg. -pub fn constructor_and_reg(ctx: &mut C, arg0: Type, arg1: Reg, arg2: Reg) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 4204. - let expr0_0 = constructor_aluop_and(ctx, pattern0_0); - let expr1_0 = constructor_alu_rrr(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term and_uimm16shifted. -pub fn constructor_and_uimm16shifted( - ctx: &mut C, - arg0: Type, - arg1: Reg, - arg2: UImm16Shifted, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 4207. - let expr0_0 = constructor_aluop_and(ctx, pattern0_0); - let expr1_0 = constructor_alu_ruimm16shifted(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term and_uimm32shifted. -pub fn constructor_and_uimm32shifted( - ctx: &mut C, - arg0: Type, - arg1: Reg, - arg2: UImm32Shifted, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 4210. - let expr0_0 = constructor_aluop_and(ctx, pattern0_0); - let expr1_0 = constructor_alu_ruimm32shifted(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term and_mem. -pub fn constructor_and_mem(ctx: &mut C, arg0: Type, arg1: Reg, arg2: &MemArg) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 4213. - let expr0_0 = constructor_aluop_and(ctx, pattern0_0); - let expr1_0 = constructor_alu_rx(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term vec_and. -pub fn constructor_vec_and(ctx: &mut C, arg0: Type, arg1: Reg, arg2: Reg) -> Reg { - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::vr128_ty(ctx, pattern0_0) { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 4216. - let expr0_0 = VecBinaryOp::And128; - let expr1_0 = constructor_vec_rrr(ctx, pattern1_0, &expr0_0, pattern2_0, pattern3_0); - return expr1_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "vec_and", "src/isa/s390x/inst.isle line 4215" - ); -} - -// Generated as internal constructor for term aluop_or. -pub fn constructor_aluop_or(ctx: &mut C, arg0: Type) -> ALUOp { - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::gpr64_ty(ctx, pattern0_0) { - // Rule at src/isa/s390x/inst.isle line 4223. - let expr0_0 = ALUOp::Orr64; - return expr0_0; - } - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::gpr32_ty(ctx, pattern0_0) { - // Rule at src/isa/s390x/inst.isle line 4222. - let expr0_0 = ALUOp::Orr32; - return expr0_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "aluop_or", "src/isa/s390x/inst.isle line 4221" - ); -} - -// Generated as internal constructor for term or_reg. -pub fn constructor_or_reg(ctx: &mut C, arg0: Type, arg1: Reg, arg2: Reg) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 4226. - let expr0_0 = constructor_aluop_or(ctx, pattern0_0); - let expr1_0 = constructor_alu_rrr(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term or_uimm16shifted. -pub fn constructor_or_uimm16shifted( - ctx: &mut C, - arg0: Type, - arg1: Reg, - arg2: UImm16Shifted, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 4229. - let expr0_0 = constructor_aluop_or(ctx, pattern0_0); - let expr1_0 = constructor_alu_ruimm16shifted(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term or_uimm32shifted. -pub fn constructor_or_uimm32shifted( - ctx: &mut C, - arg0: Type, - arg1: Reg, - arg2: UImm32Shifted, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 4232. - let expr0_0 = constructor_aluop_or(ctx, pattern0_0); - let expr1_0 = constructor_alu_ruimm32shifted(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term or_mem. -pub fn constructor_or_mem(ctx: &mut C, arg0: Type, arg1: Reg, arg2: &MemArg) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 4235. - let expr0_0 = constructor_aluop_or(ctx, pattern0_0); - let expr1_0 = constructor_alu_rx(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term vec_or. -pub fn constructor_vec_or(ctx: &mut C, arg0: Type, arg1: Reg, arg2: Reg) -> Reg { - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::vr128_ty(ctx, pattern0_0) { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 4238. - let expr0_0 = VecBinaryOp::Orr128; - let expr1_0 = constructor_vec_rrr(ctx, pattern1_0, &expr0_0, pattern2_0, pattern3_0); - return expr1_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "vec_or", "src/isa/s390x/inst.isle line 4237" - ); -} - -// Generated as internal constructor for term aluop_xor. -pub fn constructor_aluop_xor(ctx: &mut C, arg0: Type) -> ALUOp { - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::gpr64_ty(ctx, pattern0_0) { - // Rule at src/isa/s390x/inst.isle line 4245. - let expr0_0 = ALUOp::Xor64; - return expr0_0; - } - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::gpr32_ty(ctx, pattern0_0) { - // Rule at src/isa/s390x/inst.isle line 4244. - let expr0_0 = ALUOp::Xor32; - return expr0_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "aluop_xor", "src/isa/s390x/inst.isle line 4243" - ); -} - -// Generated as internal constructor for term xor_reg. -pub fn constructor_xor_reg(ctx: &mut C, arg0: Type, arg1: Reg, arg2: Reg) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 4248. - let expr0_0 = constructor_aluop_xor(ctx, pattern0_0); - let expr1_0 = constructor_alu_rrr(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term xor_uimm32shifted. -pub fn constructor_xor_uimm32shifted( - ctx: &mut C, - arg0: Type, - arg1: Reg, - arg2: UImm32Shifted, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 4251. - let expr0_0 = constructor_aluop_xor(ctx, pattern0_0); - let expr1_0 = constructor_alu_ruimm32shifted(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term xor_mem. -pub fn constructor_xor_mem(ctx: &mut C, arg0: Type, arg1: Reg, arg2: &MemArg) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 4254. - let expr0_0 = constructor_aluop_xor(ctx, pattern0_0); - let expr1_0 = constructor_alu_rx(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term push_xor_uimm32shifted. -pub fn constructor_push_xor_uimm32shifted( - ctx: &mut C, - arg0: &VecMInstBuilder, - arg1: Type, - arg2: WritableReg, - arg3: Reg, - arg4: UImm32Shifted, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - let pattern4_0 = arg4; - // Rule at src/isa/s390x/inst.isle line 4257. - let expr0_0 = constructor_aluop_xor(ctx, pattern1_0); - let expr1_0 = constructor_push_alu_uimm32shifted( - ctx, pattern0_0, &expr0_0, pattern2_0, pattern3_0, pattern4_0, - ); - return expr1_0; -} - -// Generated as internal constructor for term vec_xor. -pub fn constructor_vec_xor(ctx: &mut C, arg0: Type, arg1: Reg, arg2: Reg) -> Reg { - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::vr128_ty(ctx, pattern0_0) { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 4261. - let expr0_0 = VecBinaryOp::Xor128; - let expr1_0 = constructor_vec_rrr(ctx, pattern1_0, &expr0_0, pattern2_0, pattern3_0); - return expr1_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "vec_xor", "src/isa/s390x/inst.isle line 4260" - ); -} - -// Generated as internal constructor for term not_reg. -pub fn constructor_not_reg(ctx: &mut C, arg0: Type, arg1: Reg) -> Reg { - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::gpr64_ty(ctx, pattern0_0) { - let pattern2_0 = arg1; - // Rule at src/isa/s390x/inst.isle line 4269. - let expr0_0: u32 = 4294967295i128 as u32; - let expr1_0: u8 = 0i128 as u8; - let expr2_0 = C::uimm32shifted(ctx, expr0_0, expr1_0); - let expr3_0 = constructor_xor_uimm32shifted(ctx, pattern1_0, pattern2_0, expr2_0); - let expr4_0: u32 = 4294967295i128 as u32; - let expr5_0: u8 = 32i128 as u8; - let expr6_0 = C::uimm32shifted(ctx, expr4_0, expr5_0); - let expr7_0 = constructor_xor_uimm32shifted(ctx, pattern1_0, expr3_0, expr6_0); - return expr7_0; - } - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::gpr32_ty(ctx, pattern0_0) { - let pattern2_0 = arg1; - // Rule at src/isa/s390x/inst.isle line 4267. - let expr0_0: u32 = 4294967295i128 as u32; - let expr1_0: u8 = 0i128 as u8; - let expr2_0 = C::uimm32shifted(ctx, expr0_0, expr1_0); - let expr3_0 = constructor_xor_uimm32shifted(ctx, pattern1_0, pattern2_0, expr2_0); - return expr3_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "not_reg", "src/isa/s390x/inst.isle line 4266" - ); -} - -// Generated as internal constructor for term push_not_reg. -pub fn constructor_push_not_reg( - ctx: &mut C, - arg0: &VecMInstBuilder, - arg1: Type, - arg2: WritableReg, - arg3: Reg, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - if let Some(pattern2_0) = C::gpr64_ty(ctx, pattern1_0) { - let pattern3_0 = arg2; - let pattern4_0 = arg3; - // Rule at src/isa/s390x/inst.isle line 4277. - let expr0_0: u32 = 4294967295i128 as u32; - let expr1_0: u8 = 0i128 as u8; - let expr2_0 = C::uimm32shifted(ctx, expr0_0, expr1_0); - let expr3_0 = constructor_push_xor_uimm32shifted( - ctx, pattern0_0, pattern2_0, pattern3_0, pattern4_0, expr2_0, - ); - let expr4_0: u32 = 4294967295i128 as u32; - let expr5_0: u8 = 32i128 as u8; - let expr6_0 = C::uimm32shifted(ctx, expr4_0, expr5_0); - let expr7_0 = constructor_push_xor_uimm32shifted( - ctx, pattern0_0, pattern2_0, pattern3_0, expr3_0, expr6_0, - ); - return expr7_0; - } - let pattern0_0 = arg0; - let pattern1_0 = arg1; - if let Some(pattern2_0) = C::gpr32_ty(ctx, pattern1_0) { - let pattern3_0 = arg2; - let pattern4_0 = arg3; - // Rule at src/isa/s390x/inst.isle line 4275. - let expr0_0: u32 = 4294967295i128 as u32; - let expr1_0: u8 = 0i128 as u8; - let expr2_0 = C::uimm32shifted(ctx, expr0_0, expr1_0); - let expr3_0 = constructor_push_xor_uimm32shifted( - ctx, pattern0_0, pattern2_0, pattern3_0, pattern4_0, expr2_0, - ); - return expr3_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "push_not_reg", "src/isa/s390x/inst.isle line 4274" - ); -} - -// Generated as internal constructor for term vec_not. -pub fn constructor_vec_not(ctx: &mut C, arg0: Type, arg1: Reg) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/s390x/inst.isle line 4282. - let expr0_0 = constructor_vec_not_or(ctx, pattern0_0, pattern1_0, pattern1_0); - return expr0_0; -} - -// Generated as internal constructor for term aluop_not_and. -pub fn constructor_aluop_not_and(ctx: &mut C, arg0: Type) -> ALUOp { - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::gpr64_ty(ctx, pattern0_0) { - // Rule at src/isa/s390x/inst.isle line 4289. - let expr0_0 = ALUOp::NotAnd64; - return expr0_0; - } - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::gpr32_ty(ctx, pattern0_0) { - // Rule at src/isa/s390x/inst.isle line 4288. - let expr0_0 = ALUOp::NotAnd32; - return expr0_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "aluop_not_and", "src/isa/s390x/inst.isle line 4287" - ); -} - -// Generated as internal constructor for term not_and_reg. -pub fn constructor_not_and_reg(ctx: &mut C, arg0: Type, arg1: Reg, arg2: Reg) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 4292. - let expr0_0 = constructor_aluop_not_and(ctx, pattern0_0); - let expr1_0 = constructor_alu_rrr(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term vec_not_and. -pub fn constructor_vec_not_and(ctx: &mut C, arg0: Type, arg1: Reg, arg2: Reg) -> Reg { - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::vr128_ty(ctx, pattern0_0) { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 4295. - let expr0_0 = VecBinaryOp::NotAnd128; - let expr1_0 = constructor_vec_rrr(ctx, pattern1_0, &expr0_0, pattern2_0, pattern3_0); - return expr1_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "vec_not_and", "src/isa/s390x/inst.isle line 4294" - ); -} - -// Generated as internal constructor for term aluop_not_or. -pub fn constructor_aluop_not_or(ctx: &mut C, arg0: Type) -> ALUOp { - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::gpr64_ty(ctx, pattern0_0) { - // Rule at src/isa/s390x/inst.isle line 4302. - let expr0_0 = ALUOp::NotOrr64; - return expr0_0; - } - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::gpr32_ty(ctx, pattern0_0) { - // Rule at src/isa/s390x/inst.isle line 4301. - let expr0_0 = ALUOp::NotOrr32; - return expr0_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "aluop_not_or", "src/isa/s390x/inst.isle line 4300" - ); -} - -// Generated as internal constructor for term not_or_reg. -pub fn constructor_not_or_reg(ctx: &mut C, arg0: Type, arg1: Reg, arg2: Reg) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 4305. - let expr0_0 = constructor_aluop_not_or(ctx, pattern0_0); - let expr1_0 = constructor_alu_rrr(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term vec_not_or. -pub fn constructor_vec_not_or(ctx: &mut C, arg0: Type, arg1: Reg, arg2: Reg) -> Reg { - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::vr128_ty(ctx, pattern0_0) { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 4308. - let expr0_0 = VecBinaryOp::NotOrr128; - let expr1_0 = constructor_vec_rrr(ctx, pattern1_0, &expr0_0, pattern2_0, pattern3_0); - return expr1_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "vec_not_or", "src/isa/s390x/inst.isle line 4307" - ); -} - -// Generated as internal constructor for term aluop_not_xor. -pub fn constructor_aluop_not_xor(ctx: &mut C, arg0: Type) -> ALUOp { - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::gpr64_ty(ctx, pattern0_0) { - // Rule at src/isa/s390x/inst.isle line 4315. - let expr0_0 = ALUOp::NotXor64; - return expr0_0; - } - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::gpr32_ty(ctx, pattern0_0) { - // Rule at src/isa/s390x/inst.isle line 4314. - let expr0_0 = ALUOp::NotXor32; - return expr0_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "aluop_not_xor", "src/isa/s390x/inst.isle line 4313" - ); -} - -// Generated as internal constructor for term not_xor_reg. -pub fn constructor_not_xor_reg(ctx: &mut C, arg0: Type, arg1: Reg, arg2: Reg) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 4318. - let expr0_0 = constructor_aluop_not_xor(ctx, pattern0_0); - let expr1_0 = constructor_alu_rrr(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term vec_not_xor. -pub fn constructor_vec_not_xor(ctx: &mut C, arg0: Type, arg1: Reg, arg2: Reg) -> Reg { - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::vr128_ty(ctx, pattern0_0) { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 4321. - let expr0_0 = VecBinaryOp::NotXor128; - let expr1_0 = constructor_vec_rrr(ctx, pattern1_0, &expr0_0, pattern2_0, pattern3_0); - return expr1_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "vec_not_xor", "src/isa/s390x/inst.isle line 4320" - ); -} - -// Generated as internal constructor for term aluop_and_not. -pub fn constructor_aluop_and_not(ctx: &mut C, arg0: Type) -> ALUOp { - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::gpr64_ty(ctx, pattern0_0) { - // Rule at src/isa/s390x/inst.isle line 4328. - let expr0_0 = ALUOp::AndNot64; - return expr0_0; - } - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::gpr32_ty(ctx, pattern0_0) { - // Rule at src/isa/s390x/inst.isle line 4327. - let expr0_0 = ALUOp::AndNot32; - return expr0_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "aluop_and_not", "src/isa/s390x/inst.isle line 4326" - ); -} - -// Generated as internal constructor for term and_not_reg. -pub fn constructor_and_not_reg(ctx: &mut C, arg0: Type, arg1: Reg, arg2: Reg) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 4331. - let expr0_0 = constructor_aluop_and_not(ctx, pattern0_0); - let expr1_0 = constructor_alu_rrr(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term vec_and_not. -pub fn constructor_vec_and_not(ctx: &mut C, arg0: Type, arg1: Reg, arg2: Reg) -> Reg { - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::vr128_ty(ctx, pattern0_0) { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 4334. - let expr0_0 = VecBinaryOp::AndNot128; - let expr1_0 = constructor_vec_rrr(ctx, pattern1_0, &expr0_0, pattern2_0, pattern3_0); - return expr1_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "vec_and_not", "src/isa/s390x/inst.isle line 4333" - ); -} - -// Generated as internal constructor for term aluop_or_not. -pub fn constructor_aluop_or_not(ctx: &mut C, arg0: Type) -> ALUOp { - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::gpr64_ty(ctx, pattern0_0) { - // Rule at src/isa/s390x/inst.isle line 4341. - let expr0_0 = ALUOp::OrrNot64; - return expr0_0; - } - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::gpr32_ty(ctx, pattern0_0) { - // Rule at src/isa/s390x/inst.isle line 4340. - let expr0_0 = ALUOp::OrrNot32; - return expr0_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "aluop_or_not", "src/isa/s390x/inst.isle line 4339" - ); -} - -// Generated as internal constructor for term or_not_reg. -pub fn constructor_or_not_reg(ctx: &mut C, arg0: Type, arg1: Reg, arg2: Reg) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 4344. - let expr0_0 = constructor_aluop_or_not(ctx, pattern0_0); - let expr1_0 = constructor_alu_rrr(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term vec_or_not. -pub fn constructor_vec_or_not(ctx: &mut C, arg0: Type, arg1: Reg, arg2: Reg) -> Reg { - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::vr128_ty(ctx, pattern0_0) { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 4347. - let expr0_0 = VecBinaryOp::OrrNot128; - let expr1_0 = constructor_vec_rrr(ctx, pattern1_0, &expr0_0, pattern2_0, pattern3_0); - return expr1_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "vec_or_not", "src/isa/s390x/inst.isle line 4346" - ); -} - -// Generated as internal constructor for term vec_bitpermute. -pub fn constructor_vec_bitpermute(ctx: &mut C, arg0: Reg, arg1: Reg) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/s390x/inst.isle line 4353. - let expr0_0: Type = I64X2; - let expr1_0 = VecBinaryOp::BitPermute128; - let expr2_0 = constructor_vec_rrr(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0); - return expr2_0; -} - -// Generated as internal constructor for term unaryop_abs. -pub fn constructor_unaryop_abs(ctx: &mut C, arg0: Type) -> UnaryOp { - let pattern0_0 = arg0; - if pattern0_0 == I32 { - // Rule at src/isa/s390x/inst.isle line 4359. - let expr0_0 = UnaryOp::Abs32; - return expr0_0; - } - if pattern0_0 == I64 { - // Rule at src/isa/s390x/inst.isle line 4360. - let expr0_0 = UnaryOp::Abs64; - return expr0_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "unaryop_abs", "src/isa/s390x/inst.isle line 4358" - ); -} - -// Generated as internal constructor for term unaryop_abs_sext32. -pub fn constructor_unaryop_abs_sext32(ctx: &mut C, arg0: Type) -> UnaryOp { - let pattern0_0 = arg0; - if pattern0_0 == I64 { - // Rule at src/isa/s390x/inst.isle line 4363. - let expr0_0 = UnaryOp::Abs64Ext32; - return expr0_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "unaryop_abs_sext32", "src/isa/s390x/inst.isle line 4362" - ); -} - -// Generated as internal constructor for term abs_reg. -pub fn constructor_abs_reg(ctx: &mut C, arg0: Type, arg1: Reg) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/s390x/inst.isle line 4366. - let expr0_0 = constructor_unaryop_abs(ctx, pattern0_0); - let expr1_0 = constructor_unary_rr(ctx, pattern0_0, &expr0_0, pattern1_0); - return expr1_0; -} - -// Generated as internal constructor for term abs_reg_sext32. -pub fn constructor_abs_reg_sext32(ctx: &mut C, arg0: Type, arg1: Reg) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/s390x/inst.isle line 4369. - let expr0_0 = constructor_unaryop_abs_sext32(ctx, pattern0_0); - let expr1_0 = constructor_unary_rr(ctx, pattern0_0, &expr0_0, pattern1_0); - return expr1_0; -} - -// Generated as internal constructor for term vecop_abs. -pub fn constructor_vecop_abs(ctx: &mut C, arg0: Type) -> VecUnaryOp { - let pattern0_0 = arg0; - if pattern0_0 == I8X16 { - // Rule at src/isa/s390x/inst.isle line 4372. - let expr0_0 = VecUnaryOp::Abs8x16; - return expr0_0; - } - if pattern0_0 == I16X8 { - // Rule at src/isa/s390x/inst.isle line 4373. - let expr0_0 = VecUnaryOp::Abs16x8; - return expr0_0; - } - if pattern0_0 == I32X4 { - // Rule at src/isa/s390x/inst.isle line 4374. - let expr0_0 = VecUnaryOp::Abs32x4; - return expr0_0; - } - if pattern0_0 == I64X2 { - // Rule at src/isa/s390x/inst.isle line 4375. - let expr0_0 = VecUnaryOp::Abs64x2; - return expr0_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "vecop_abs", "src/isa/s390x/inst.isle line 4371" - ); -} - -// Generated as internal constructor for term vec_abs. -pub fn constructor_vec_abs(ctx: &mut C, arg0: Type, arg1: Reg) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/s390x/inst.isle line 4378. - let expr0_0 = constructor_vecop_abs(ctx, pattern0_0); - let expr1_0 = constructor_vec_rr(ctx, pattern0_0, &expr0_0, pattern1_0); - return expr1_0; -} - -// Generated as internal constructor for term unaryop_neg. -pub fn constructor_unaryop_neg(ctx: &mut C, arg0: Type) -> UnaryOp { - let pattern0_0 = arg0; - if pattern0_0 == I8 { - // Rule at src/isa/s390x/inst.isle line 4384. - let expr0_0 = UnaryOp::Neg32; - return expr0_0; - } - if pattern0_0 == I16 { - // Rule at src/isa/s390x/inst.isle line 4385. - let expr0_0 = UnaryOp::Neg32; - return expr0_0; - } - if pattern0_0 == I32 { - // Rule at src/isa/s390x/inst.isle line 4386. - let expr0_0 = UnaryOp::Neg32; - return expr0_0; - } - if pattern0_0 == I64 { - // Rule at src/isa/s390x/inst.isle line 4387. - let expr0_0 = UnaryOp::Neg64; - return expr0_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "unaryop_neg", "src/isa/s390x/inst.isle line 4383" - ); -} - -// Generated as internal constructor for term unaryop_neg_sext32. -pub fn constructor_unaryop_neg_sext32(ctx: &mut C, arg0: Type) -> UnaryOp { - let pattern0_0 = arg0; - if pattern0_0 == I64 { - // Rule at src/isa/s390x/inst.isle line 4390. - let expr0_0 = UnaryOp::Neg64Ext32; - return expr0_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "unaryop_neg_sext32", "src/isa/s390x/inst.isle line 4389" - ); -} - -// Generated as internal constructor for term neg_reg. -pub fn constructor_neg_reg(ctx: &mut C, arg0: Type, arg1: Reg) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/s390x/inst.isle line 4393. - let expr0_0 = constructor_unaryop_neg(ctx, pattern0_0); - let expr1_0 = constructor_unary_rr(ctx, pattern0_0, &expr0_0, pattern1_0); - return expr1_0; -} - -// Generated as internal constructor for term neg_reg_sext32. -pub fn constructor_neg_reg_sext32(ctx: &mut C, arg0: Type, arg1: Reg) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/s390x/inst.isle line 4396. - let expr0_0 = constructor_unaryop_neg_sext32(ctx, pattern0_0); - let expr1_0 = constructor_unary_rr(ctx, pattern0_0, &expr0_0, pattern1_0); - return expr1_0; -} - -// Generated as internal constructor for term vecop_neg. -pub fn constructor_vecop_neg(ctx: &mut C, arg0: Type) -> VecUnaryOp { - let pattern0_0 = arg0; - if pattern0_0 == I8X16 { - // Rule at src/isa/s390x/inst.isle line 4399. - let expr0_0 = VecUnaryOp::Neg8x16; - return expr0_0; - } - if pattern0_0 == I16X8 { - // Rule at src/isa/s390x/inst.isle line 4400. - let expr0_0 = VecUnaryOp::Neg16x8; - return expr0_0; - } - if pattern0_0 == I32X4 { - // Rule at src/isa/s390x/inst.isle line 4401. - let expr0_0 = VecUnaryOp::Neg32x4; - return expr0_0; - } - if pattern0_0 == I64X2 { - // Rule at src/isa/s390x/inst.isle line 4402. - let expr0_0 = VecUnaryOp::Neg64x2; - return expr0_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "vecop_neg", "src/isa/s390x/inst.isle line 4398" - ); -} - -// Generated as internal constructor for term vec_neg. -pub fn constructor_vec_neg(ctx: &mut C, arg0: Type, arg1: Reg) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/s390x/inst.isle line 4405. - let expr0_0 = constructor_vecop_neg(ctx, pattern0_0); - let expr1_0 = constructor_vec_rr(ctx, pattern0_0, &expr0_0, pattern1_0); - return expr1_0; -} - -// Generated as internal constructor for term unaryop_bswap. -pub fn constructor_unaryop_bswap(ctx: &mut C, arg0: Type) -> UnaryOp { - let pattern0_0 = arg0; - if pattern0_0 == I32 { - // Rule at src/isa/s390x/inst.isle line 4411. - let expr0_0 = UnaryOp::BSwap32; - return expr0_0; - } - if pattern0_0 == I64 { - // Rule at src/isa/s390x/inst.isle line 4412. - let expr0_0 = UnaryOp::BSwap64; - return expr0_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "unaryop_bswap", "src/isa/s390x/inst.isle line 4410" - ); -} - -// Generated as internal constructor for term bswap_reg. -pub fn constructor_bswap_reg(ctx: &mut C, arg0: Type, arg1: Reg) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/s390x/inst.isle line 4415. - let expr0_0 = constructor_unaryop_bswap(ctx, pattern0_0); - let expr1_0 = constructor_unary_rr(ctx, pattern0_0, &expr0_0, pattern1_0); - return expr1_0; -} - -// Generated as internal constructor for term push_bswap_reg. -pub fn constructor_push_bswap_reg( - ctx: &mut C, - arg0: &VecMInstBuilder, - arg1: Type, - arg2: WritableReg, - arg3: Reg, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - // Rule at src/isa/s390x/inst.isle line 4418. - let expr0_0 = constructor_unaryop_bswap(ctx, pattern1_0); - let expr1_0 = constructor_push_unary(ctx, pattern0_0, &expr0_0, pattern2_0, pattern3_0); - return expr1_0; -} - -// Generated as internal constructor for term shiftop_rot. -pub fn constructor_shiftop_rot(ctx: &mut C, arg0: Type) -> ShiftOp { - let pattern0_0 = arg0; - if pattern0_0 == I32 { - // Rule at src/isa/s390x/inst.isle line 4424. - let expr0_0 = ShiftOp::RotL32; - return expr0_0; - } - if pattern0_0 == I64 { - // Rule at src/isa/s390x/inst.isle line 4425. - let expr0_0 = ShiftOp::RotL64; - return expr0_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "shiftop_rot", "src/isa/s390x/inst.isle line 4423" - ); -} - -// Generated as internal constructor for term rot_reg. -pub fn constructor_rot_reg(ctx: &mut C, arg0: Type, arg1: Reg, arg2: Reg) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 4428. - let expr0_0 = constructor_shiftop_rot(ctx, pattern0_0); - let expr1_0: u8 = 0i128 as u8; - let expr2_0 = constructor_shift_rr(ctx, pattern0_0, &expr0_0, pattern1_0, expr1_0, pattern2_0); - return expr2_0; -} - -// Generated as internal constructor for term rot_imm. -pub fn constructor_rot_imm(ctx: &mut C, arg0: Type, arg1: Reg, arg2: u8) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 4432. - let expr0_0 = constructor_shiftop_rot(ctx, pattern0_0); - let expr1_0 = C::zero_reg(ctx); - let expr2_0 = constructor_shift_rr(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0, expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term rot_imm_reg. -pub fn constructor_rot_imm_reg( - ctx: &mut C, - arg0: Type, - arg1: Reg, - arg2: u8, - arg3: Reg, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - // Rule at src/isa/s390x/inst.isle line 4436. - let expr0_0 = constructor_shiftop_rot(ctx, pattern0_0); - let expr1_0 = constructor_shift_rr( - ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0, pattern3_0, - ); - return expr1_0; -} - -// Generated as internal constructor for term push_rot_imm_reg. -pub fn constructor_push_rot_imm_reg( - ctx: &mut C, - arg0: &VecMInstBuilder, - arg1: Type, - arg2: WritableReg, - arg3: Reg, - arg4: u8, - arg5: Reg, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - let pattern4_0 = arg4; - let pattern5_0 = arg5; - // Rule at src/isa/s390x/inst.isle line 4440. - let expr0_0 = constructor_shiftop_rot(ctx, pattern1_0); - let expr1_0 = constructor_push_shift( - ctx, pattern0_0, &expr0_0, pattern2_0, pattern3_0, pattern4_0, pattern5_0, - ); - return expr1_0; -} - -// Generated as internal constructor for term vec_shiftop_rot. -pub fn constructor_vec_shiftop_rot(ctx: &mut C, arg0: Type) -> VecShiftOp { - let pattern0_0 = arg0; - if pattern0_0 == I8X16 { - // Rule at src/isa/s390x/inst.isle line 4444. - let expr0_0 = VecShiftOp::RotL8x16; - return expr0_0; - } - if pattern0_0 == I16X8 { - // Rule at src/isa/s390x/inst.isle line 4445. - let expr0_0 = VecShiftOp::RotL16x8; - return expr0_0; - } - if pattern0_0 == I32X4 { - // Rule at src/isa/s390x/inst.isle line 4446. - let expr0_0 = VecShiftOp::RotL32x4; - return expr0_0; - } - if pattern0_0 == I64X2 { - // Rule at src/isa/s390x/inst.isle line 4447. - let expr0_0 = VecShiftOp::RotL64x2; - return expr0_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "vec_shiftop_rot", "src/isa/s390x/inst.isle line 4443" - ); -} - -// Generated as internal constructor for term vec_rot_reg. -pub fn constructor_vec_rot_reg(ctx: &mut C, arg0: Type, arg1: Reg, arg2: Reg) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 4450. - let expr0_0 = constructor_vec_shiftop_rot(ctx, pattern0_0); - let expr1_0: u8 = 0i128 as u8; - let expr2_0 = - constructor_vec_shift_rr(ctx, pattern0_0, &expr0_0, pattern1_0, expr1_0, pattern2_0); - return expr2_0; -} - -// Generated as internal constructor for term vec_rot_imm. -pub fn constructor_vec_rot_imm(ctx: &mut C, arg0: Type, arg1: Reg, arg2: u8) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 4454. - let expr0_0 = constructor_vec_shiftop_rot(ctx, pattern0_0); - let expr1_0 = C::zero_reg(ctx); - let expr2_0 = - constructor_vec_shift_rr(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0, expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term shiftop_lshl. -pub fn constructor_shiftop_lshl(ctx: &mut C, arg0: Type) -> ShiftOp { - let pattern0_0 = arg0; - if pattern0_0 == I8 { - // Rule at src/isa/s390x/inst.isle line 4461. - let expr0_0 = ShiftOp::LShL32; - return expr0_0; - } - if pattern0_0 == I16 { - // Rule at src/isa/s390x/inst.isle line 4462. - let expr0_0 = ShiftOp::LShL32; - return expr0_0; - } - if pattern0_0 == I32 { - // Rule at src/isa/s390x/inst.isle line 4463. - let expr0_0 = ShiftOp::LShL32; - return expr0_0; - } - if pattern0_0 == I64 { - // Rule at src/isa/s390x/inst.isle line 4464. - let expr0_0 = ShiftOp::LShL64; - return expr0_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "shiftop_lshl", "src/isa/s390x/inst.isle line 4460" - ); -} - -// Generated as internal constructor for term lshl_reg. -pub fn constructor_lshl_reg(ctx: &mut C, arg0: Type, arg1: Reg, arg2: Reg) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 4467. - let expr0_0 = constructor_shiftop_lshl(ctx, pattern0_0); - let expr1_0: u8 = 0i128 as u8; - let expr2_0 = constructor_shift_rr(ctx, pattern0_0, &expr0_0, pattern1_0, expr1_0, pattern2_0); - return expr2_0; -} - -// Generated as internal constructor for term lshl_imm. -pub fn constructor_lshl_imm(ctx: &mut C, arg0: Type, arg1: Reg, arg2: u8) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 4471. - let expr0_0 = constructor_shiftop_lshl(ctx, pattern0_0); - let expr1_0 = C::zero_reg(ctx); - let expr2_0 = constructor_shift_rr(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0, expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term vec_shiftop_lshl. -pub fn constructor_vec_shiftop_lshl(ctx: &mut C, arg0: Type) -> VecShiftOp { - let pattern0_0 = arg0; - if pattern0_0 == I8X16 { - // Rule at src/isa/s390x/inst.isle line 4475. - let expr0_0 = VecShiftOp::LShL8x16; - return expr0_0; - } - if pattern0_0 == I16X8 { - // Rule at src/isa/s390x/inst.isle line 4476. - let expr0_0 = VecShiftOp::LShL16x8; - return expr0_0; - } - if pattern0_0 == I32X4 { - // Rule at src/isa/s390x/inst.isle line 4477. - let expr0_0 = VecShiftOp::LShL32x4; - return expr0_0; - } - if pattern0_0 == I64X2 { - // Rule at src/isa/s390x/inst.isle line 4478. - let expr0_0 = VecShiftOp::LShL64x2; - return expr0_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "vec_shiftop_lshl", "src/isa/s390x/inst.isle line 4474" - ); -} - -// Generated as internal constructor for term vec_lshl_reg. -pub fn constructor_vec_lshl_reg(ctx: &mut C, arg0: Type, arg1: Reg, arg2: Reg) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 4481. - let expr0_0 = constructor_vec_shiftop_lshl(ctx, pattern0_0); - let expr1_0: u8 = 0i128 as u8; - let expr2_0 = - constructor_vec_shift_rr(ctx, pattern0_0, &expr0_0, pattern1_0, expr1_0, pattern2_0); - return expr2_0; -} - -// Generated as internal constructor for term vec_lshl_imm. -pub fn constructor_vec_lshl_imm(ctx: &mut C, arg0: Type, arg1: Reg, arg2: u8) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 4485. - let expr0_0 = constructor_vec_shiftop_lshl(ctx, pattern0_0); - let expr1_0 = C::zero_reg(ctx); - let expr2_0 = - constructor_vec_shift_rr(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0, expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term vec_lshl_by_byte. -pub fn constructor_vec_lshl_by_byte(ctx: &mut C, arg0: Reg, arg1: Reg) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/s390x/inst.isle line 4489. - let expr0_0: Type = I8X16; - let expr1_0 = VecBinaryOp::LShLByByte128; - let expr2_0 = constructor_vec_rrr(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0); - return expr2_0; -} - -// Generated as internal constructor for term vec_lshl_by_bit. -pub fn constructor_vec_lshl_by_bit(ctx: &mut C, arg0: Reg, arg1: Reg) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/s390x/inst.isle line 4492. - let expr0_0: Type = I8X16; - let expr1_0 = VecBinaryOp::LShLByBit128; - let expr2_0 = constructor_vec_rrr(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0); - return expr2_0; -} - -// Generated as internal constructor for term shiftop_lshr. -pub fn constructor_shiftop_lshr(ctx: &mut C, arg0: Type) -> ShiftOp { - let pattern0_0 = arg0; - if pattern0_0 == I32 { - // Rule at src/isa/s390x/inst.isle line 4498. - let expr0_0 = ShiftOp::LShR32; - return expr0_0; - } - if pattern0_0 == I64 { - // Rule at src/isa/s390x/inst.isle line 4499. - let expr0_0 = ShiftOp::LShR64; - return expr0_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "shiftop_lshr", "src/isa/s390x/inst.isle line 4497" - ); -} - -// Generated as internal constructor for term lshr_reg. -pub fn constructor_lshr_reg(ctx: &mut C, arg0: Type, arg1: Reg, arg2: Reg) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 4502. - let expr0_0 = constructor_shiftop_lshr(ctx, pattern0_0); - let expr1_0: u8 = 0i128 as u8; - let expr2_0 = constructor_shift_rr(ctx, pattern0_0, &expr0_0, pattern1_0, expr1_0, pattern2_0); - return expr2_0; -} - -// Generated as internal constructor for term lshr_imm. -pub fn constructor_lshr_imm(ctx: &mut C, arg0: Type, arg1: Reg, arg2: u8) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 4506. - let expr0_0 = constructor_shiftop_lshr(ctx, pattern0_0); - let expr1_0 = C::zero_reg(ctx); - let expr2_0 = constructor_shift_rr(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0, expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term vec_shiftop_lshr. -pub fn constructor_vec_shiftop_lshr(ctx: &mut C, arg0: Type) -> VecShiftOp { - let pattern0_0 = arg0; - if pattern0_0 == I8X16 { - // Rule at src/isa/s390x/inst.isle line 4510. - let expr0_0 = VecShiftOp::LShR8x16; - return expr0_0; - } - if pattern0_0 == I16X8 { - // Rule at src/isa/s390x/inst.isle line 4511. - let expr0_0 = VecShiftOp::LShR16x8; - return expr0_0; - } - if pattern0_0 == I32X4 { - // Rule at src/isa/s390x/inst.isle line 4512. - let expr0_0 = VecShiftOp::LShR32x4; - return expr0_0; - } - if pattern0_0 == I64X2 { - // Rule at src/isa/s390x/inst.isle line 4513. - let expr0_0 = VecShiftOp::LShR64x2; - return expr0_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "vec_shiftop_lshr", "src/isa/s390x/inst.isle line 4509" - ); -} - -// Generated as internal constructor for term vec_lshr_reg. -pub fn constructor_vec_lshr_reg(ctx: &mut C, arg0: Type, arg1: Reg, arg2: Reg) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 4516. - let expr0_0 = constructor_vec_shiftop_lshr(ctx, pattern0_0); - let expr1_0: u8 = 0i128 as u8; - let expr2_0 = - constructor_vec_shift_rr(ctx, pattern0_0, &expr0_0, pattern1_0, expr1_0, pattern2_0); - return expr2_0; -} - -// Generated as internal constructor for term vec_lshr_imm. -pub fn constructor_vec_lshr_imm(ctx: &mut C, arg0: Type, arg1: Reg, arg2: u8) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 4520. - let expr0_0 = constructor_vec_shiftop_lshr(ctx, pattern0_0); - let expr1_0 = C::zero_reg(ctx); - let expr2_0 = - constructor_vec_shift_rr(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0, expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term vec_lshr_by_byte. -pub fn constructor_vec_lshr_by_byte(ctx: &mut C, arg0: Reg, arg1: Reg) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/s390x/inst.isle line 4524. - let expr0_0: Type = I8X16; - let expr1_0 = VecBinaryOp::LShRByByte128; - let expr2_0 = constructor_vec_rrr(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0); - return expr2_0; -} - -// Generated as internal constructor for term vec_lshr_by_bit. -pub fn constructor_vec_lshr_by_bit(ctx: &mut C, arg0: Reg, arg1: Reg) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/s390x/inst.isle line 4527. - let expr0_0: Type = I8X16; - let expr1_0 = VecBinaryOp::LShRByBit128; - let expr2_0 = constructor_vec_rrr(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0); - return expr2_0; -} - -// Generated as internal constructor for term shiftop_ashr. -pub fn constructor_shiftop_ashr(ctx: &mut C, arg0: Type) -> ShiftOp { - let pattern0_0 = arg0; - if pattern0_0 == I32 { - // Rule at src/isa/s390x/inst.isle line 4533. - let expr0_0 = ShiftOp::AShR32; - return expr0_0; - } - if pattern0_0 == I64 { - // Rule at src/isa/s390x/inst.isle line 4534. - let expr0_0 = ShiftOp::AShR64; - return expr0_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "shiftop_ashr", "src/isa/s390x/inst.isle line 4532" - ); -} - -// Generated as internal constructor for term ashr_reg. -pub fn constructor_ashr_reg(ctx: &mut C, arg0: Type, arg1: Reg, arg2: Reg) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 4537. - let expr0_0 = constructor_shiftop_ashr(ctx, pattern0_0); - let expr1_0: u8 = 0i128 as u8; - let expr2_0 = constructor_shift_rr(ctx, pattern0_0, &expr0_0, pattern1_0, expr1_0, pattern2_0); - return expr2_0; -} - -// Generated as internal constructor for term ashr_imm. -pub fn constructor_ashr_imm(ctx: &mut C, arg0: Type, arg1: Reg, arg2: u8) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 4541. - let expr0_0 = constructor_shiftop_ashr(ctx, pattern0_0); - let expr1_0 = C::zero_reg(ctx); - let expr2_0 = constructor_shift_rr(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0, expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term vec_shiftop_ashr. -pub fn constructor_vec_shiftop_ashr(ctx: &mut C, arg0: Type) -> VecShiftOp { - let pattern0_0 = arg0; - if pattern0_0 == I8X16 { - // Rule at src/isa/s390x/inst.isle line 4545. - let expr0_0 = VecShiftOp::AShR8x16; - return expr0_0; - } - if pattern0_0 == I16X8 { - // Rule at src/isa/s390x/inst.isle line 4546. - let expr0_0 = VecShiftOp::AShR16x8; - return expr0_0; - } - if pattern0_0 == I32X4 { - // Rule at src/isa/s390x/inst.isle line 4547. - let expr0_0 = VecShiftOp::AShR32x4; - return expr0_0; - } - if pattern0_0 == I64X2 { - // Rule at src/isa/s390x/inst.isle line 4548. - let expr0_0 = VecShiftOp::AShR64x2; - return expr0_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "vec_shiftop_ashr", "src/isa/s390x/inst.isle line 4544" - ); -} - -// Generated as internal constructor for term vec_ashr_reg. -pub fn constructor_vec_ashr_reg(ctx: &mut C, arg0: Type, arg1: Reg, arg2: Reg) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 4551. - let expr0_0 = constructor_vec_shiftop_ashr(ctx, pattern0_0); - let expr1_0: u8 = 0i128 as u8; - let expr2_0 = - constructor_vec_shift_rr(ctx, pattern0_0, &expr0_0, pattern1_0, expr1_0, pattern2_0); - return expr2_0; -} - -// Generated as internal constructor for term vec_ashr_imm. -pub fn constructor_vec_ashr_imm(ctx: &mut C, arg0: Type, arg1: Reg, arg2: u8) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 4555. - let expr0_0 = constructor_vec_shiftop_ashr(ctx, pattern0_0); - let expr1_0 = C::zero_reg(ctx); - let expr2_0 = - constructor_vec_shift_rr(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0, expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term vec_ashr_by_byte. -pub fn constructor_vec_ashr_by_byte(ctx: &mut C, arg0: Reg, arg1: Reg) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/s390x/inst.isle line 4559. - let expr0_0: Type = I8X16; - let expr1_0 = VecBinaryOp::AShRByByte128; - let expr2_0 = constructor_vec_rrr(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0); - return expr2_0; -} - -// Generated as internal constructor for term vec_ashr_by_bit. -pub fn constructor_vec_ashr_by_bit(ctx: &mut C, arg0: Reg, arg1: Reg) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/s390x/inst.isle line 4562. - let expr0_0: Type = I8X16; - let expr1_0 = VecBinaryOp::AShRByBit128; - let expr2_0 = constructor_vec_rrr(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0); - return expr2_0; -} - -// Generated as internal constructor for term popcnt_byte. -pub fn constructor_popcnt_byte(ctx: &mut C, arg0: Reg) -> Reg { - let pattern0_0 = arg0; - // Rule at src/isa/s390x/inst.isle line 4568. - let expr0_0: Type = I64; - let expr1_0 = UnaryOp::PopcntByte; - let expr2_0 = constructor_unary_rr(ctx, expr0_0, &expr1_0, pattern0_0); - return expr2_0; -} - -// Generated as internal constructor for term popcnt_reg. -pub fn constructor_popcnt_reg(ctx: &mut C, arg0: Reg) -> Reg { - let pattern0_0 = arg0; - // Rule at src/isa/s390x/inst.isle line 4571. - let expr0_0: Type = I64; - let expr1_0 = UnaryOp::PopcntReg; - let expr2_0 = constructor_unary_rr(ctx, expr0_0, &expr1_0, pattern0_0); - return expr2_0; -} - -// Generated as internal constructor for term vecop_popcnt. -pub fn constructor_vecop_popcnt(ctx: &mut C, arg0: Type) -> VecUnaryOp { - let pattern0_0 = arg0; - if pattern0_0 == I8X16 { - // Rule at src/isa/s390x/inst.isle line 4574. - let expr0_0 = VecUnaryOp::Popcnt8x16; - return expr0_0; - } - if pattern0_0 == I16X8 { - // Rule at src/isa/s390x/inst.isle line 4575. - let expr0_0 = VecUnaryOp::Popcnt16x8; - return expr0_0; - } - if pattern0_0 == I32X4 { - // Rule at src/isa/s390x/inst.isle line 4576. - let expr0_0 = VecUnaryOp::Popcnt32x4; - return expr0_0; - } - if pattern0_0 == I64X2 { - // Rule at src/isa/s390x/inst.isle line 4577. - let expr0_0 = VecUnaryOp::Popcnt64x2; - return expr0_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "vecop_popcnt", "src/isa/s390x/inst.isle line 4573" - ); -} - -// Generated as internal constructor for term vec_popcnt. -pub fn constructor_vec_popcnt(ctx: &mut C, arg0: Type, arg1: Reg) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/s390x/inst.isle line 4580. - let expr0_0 = constructor_vecop_popcnt(ctx, pattern0_0); - let expr1_0 = constructor_vec_rr(ctx, pattern0_0, &expr0_0, pattern1_0); - return expr1_0; -} - -// Generated as internal constructor for term atomic_rmw_and. -pub fn constructor_atomic_rmw_and( - ctx: &mut C, - arg0: Type, - arg1: Reg, - arg2: &MemArg, -) -> Reg { - let pattern0_0 = arg0; - if pattern0_0 == I32 { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 4586. - let expr0_0: Type = I32; - let expr1_0 = ALUOp::And32; - let expr2_0 = constructor_atomic_rmw_impl(ctx, expr0_0, &expr1_0, pattern2_0, pattern3_0); - return expr2_0; - } - if pattern0_0 == I64 { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 4587. - let expr0_0: Type = I64; - let expr1_0 = ALUOp::And64; - let expr2_0 = constructor_atomic_rmw_impl(ctx, expr0_0, &expr1_0, pattern2_0, pattern3_0); - return expr2_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "atomic_rmw_and", "src/isa/s390x/inst.isle line 4585" - ); -} - -// Generated as internal constructor for term atomic_rmw_or. -pub fn constructor_atomic_rmw_or( - ctx: &mut C, - arg0: Type, - arg1: Reg, - arg2: &MemArg, -) -> Reg { - let pattern0_0 = arg0; - if pattern0_0 == I32 { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 4590. - let expr0_0: Type = I32; - let expr1_0 = ALUOp::Orr32; - let expr2_0 = constructor_atomic_rmw_impl(ctx, expr0_0, &expr1_0, pattern2_0, pattern3_0); - return expr2_0; - } - if pattern0_0 == I64 { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 4591. - let expr0_0: Type = I64; - let expr1_0 = ALUOp::Orr64; - let expr2_0 = constructor_atomic_rmw_impl(ctx, expr0_0, &expr1_0, pattern2_0, pattern3_0); - return expr2_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "atomic_rmw_or", "src/isa/s390x/inst.isle line 4589" - ); -} - -// Generated as internal constructor for term atomic_rmw_xor. -pub fn constructor_atomic_rmw_xor( - ctx: &mut C, - arg0: Type, - arg1: Reg, - arg2: &MemArg, -) -> Reg { - let pattern0_0 = arg0; - if pattern0_0 == I32 { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 4594. - let expr0_0: Type = I32; - let expr1_0 = ALUOp::Xor32; - let expr2_0 = constructor_atomic_rmw_impl(ctx, expr0_0, &expr1_0, pattern2_0, pattern3_0); - return expr2_0; - } - if pattern0_0 == I64 { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 4595. - let expr0_0: Type = I64; - let expr1_0 = ALUOp::Xor64; - let expr2_0 = constructor_atomic_rmw_impl(ctx, expr0_0, &expr1_0, pattern2_0, pattern3_0); - return expr2_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "atomic_rmw_xor", "src/isa/s390x/inst.isle line 4593" - ); -} - -// Generated as internal constructor for term atomic_rmw_add. -pub fn constructor_atomic_rmw_add( - ctx: &mut C, - arg0: Type, - arg1: Reg, - arg2: &MemArg, -) -> Reg { - let pattern0_0 = arg0; - if pattern0_0 == I32 { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 4598. - let expr0_0: Type = I32; - let expr1_0 = ALUOp::Add32; - let expr2_0 = constructor_atomic_rmw_impl(ctx, expr0_0, &expr1_0, pattern2_0, pattern3_0); - return expr2_0; - } - if pattern0_0 == I64 { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 4599. - let expr0_0: Type = I64; - let expr1_0 = ALUOp::Add64; - let expr2_0 = constructor_atomic_rmw_impl(ctx, expr0_0, &expr1_0, pattern2_0, pattern3_0); - return expr2_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "atomic_rmw_add", "src/isa/s390x/inst.isle line 4597" - ); -} - -// Generated as internal constructor for term atomic_cas_impl. -pub fn constructor_atomic_cas_impl( - ctx: &mut C, - arg0: Type, - arg1: Reg, - arg2: Reg, - arg3: &MemArg, -) -> Reg { - let pattern0_0 = arg0; - if pattern0_0 == I32 { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - let pattern4_0 = arg3; - // Rule at src/isa/s390x/inst.isle line 4605. - let expr0_0 = constructor_atomic_cas32(ctx, pattern2_0, pattern3_0, pattern4_0); - return expr0_0; - } - if pattern0_0 == I64 { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - let pattern4_0 = arg3; - // Rule at src/isa/s390x/inst.isle line 4606. - let expr0_0 = constructor_atomic_cas64(ctx, pattern2_0, pattern3_0, pattern4_0); - return expr0_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "atomic_cas_impl", "src/isa/s390x/inst.isle line 4604" - ); -} - -// Generated as internal constructor for term push_atomic_cas. -pub fn constructor_push_atomic_cas( - ctx: &mut C, - arg0: &VecMInstBuilder, - arg1: Type, - arg2: WritableReg, - arg3: Reg, - arg4: &MemArg, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - if pattern1_0 == I32 { - let pattern3_0 = arg2; - let pattern4_0 = arg3; - let pattern5_0 = arg4; - // Rule at src/isa/s390x/inst.isle line 4609. - let expr0_0 = - constructor_push_atomic_cas32(ctx, pattern0_0, pattern3_0, pattern4_0, pattern5_0); - return expr0_0; - } - if pattern1_0 == I64 { - let pattern3_0 = arg2; - let pattern4_0 = arg3; - let pattern5_0 = arg4; - // Rule at src/isa/s390x/inst.isle line 4610. - let expr0_0 = - constructor_push_atomic_cas64(ctx, pattern0_0, pattern3_0, pattern4_0, pattern5_0); - return expr0_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "push_atomic_cas", "src/isa/s390x/inst.isle line 4608" - ); -} - -// Generated as internal constructor for term fpuop2_add. -pub fn constructor_fpuop2_add(ctx: &mut C, arg0: Type) -> FPUOp2 { - let pattern0_0 = arg0; - if pattern0_0 == F32 { - // Rule at src/isa/s390x/inst.isle line 4616. - let expr0_0 = FPUOp2::Add32; - return expr0_0; - } - if pattern0_0 == F64 { - // Rule at src/isa/s390x/inst.isle line 4617. - let expr0_0 = FPUOp2::Add64; - return expr0_0; - } - if pattern0_0 == F32X4 { - // Rule at src/isa/s390x/inst.isle line 4618. - let expr0_0 = FPUOp2::Add32x4; - return expr0_0; - } - if pattern0_0 == F64X2 { - // Rule at src/isa/s390x/inst.isle line 4619. - let expr0_0 = FPUOp2::Add64x2; - return expr0_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "fpuop2_add", "src/isa/s390x/inst.isle line 4615" - ); -} - -// Generated as internal constructor for term fadd_reg. -pub fn constructor_fadd_reg(ctx: &mut C, arg0: Type, arg1: Reg, arg2: Reg) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 4622. - let expr0_0 = constructor_fpuop2_add(ctx, pattern0_0); - let expr1_0 = constructor_fpu_rrr(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term fpuop2_sub. -pub fn constructor_fpuop2_sub(ctx: &mut C, arg0: Type) -> FPUOp2 { - let pattern0_0 = arg0; - if pattern0_0 == F32 { - // Rule at src/isa/s390x/inst.isle line 4628. - let expr0_0 = FPUOp2::Sub32; - return expr0_0; - } - if pattern0_0 == F64 { - // Rule at src/isa/s390x/inst.isle line 4629. - let expr0_0 = FPUOp2::Sub64; - return expr0_0; - } - if pattern0_0 == F32X4 { - // Rule at src/isa/s390x/inst.isle line 4630. - let expr0_0 = FPUOp2::Sub32x4; - return expr0_0; - } - if pattern0_0 == F64X2 { - // Rule at src/isa/s390x/inst.isle line 4631. - let expr0_0 = FPUOp2::Sub64x2; - return expr0_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "fpuop2_sub", "src/isa/s390x/inst.isle line 4627" - ); -} - -// Generated as internal constructor for term fsub_reg. -pub fn constructor_fsub_reg(ctx: &mut C, arg0: Type, arg1: Reg, arg2: Reg) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 4634. - let expr0_0 = constructor_fpuop2_sub(ctx, pattern0_0); - let expr1_0 = constructor_fpu_rrr(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term fpuop2_mul. -pub fn constructor_fpuop2_mul(ctx: &mut C, arg0: Type) -> FPUOp2 { - let pattern0_0 = arg0; - if pattern0_0 == F32 { - // Rule at src/isa/s390x/inst.isle line 4640. - let expr0_0 = FPUOp2::Mul32; - return expr0_0; - } - if pattern0_0 == F64 { - // Rule at src/isa/s390x/inst.isle line 4641. - let expr0_0 = FPUOp2::Mul64; - return expr0_0; - } - if pattern0_0 == F32X4 { - // Rule at src/isa/s390x/inst.isle line 4642. - let expr0_0 = FPUOp2::Mul32x4; - return expr0_0; - } - if pattern0_0 == F64X2 { - // Rule at src/isa/s390x/inst.isle line 4643. - let expr0_0 = FPUOp2::Mul64x2; - return expr0_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "fpuop2_mul", "src/isa/s390x/inst.isle line 4639" - ); -} - -// Generated as internal constructor for term fmul_reg. -pub fn constructor_fmul_reg(ctx: &mut C, arg0: Type, arg1: Reg, arg2: Reg) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 4646. - let expr0_0 = constructor_fpuop2_mul(ctx, pattern0_0); - let expr1_0 = constructor_fpu_rrr(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term fpuop2_div. -pub fn constructor_fpuop2_div(ctx: &mut C, arg0: Type) -> FPUOp2 { - let pattern0_0 = arg0; - if pattern0_0 == F32 { - // Rule at src/isa/s390x/inst.isle line 4652. - let expr0_0 = FPUOp2::Div32; - return expr0_0; - } - if pattern0_0 == F64 { - // Rule at src/isa/s390x/inst.isle line 4653. - let expr0_0 = FPUOp2::Div64; - return expr0_0; - } - if pattern0_0 == F32X4 { - // Rule at src/isa/s390x/inst.isle line 4654. - let expr0_0 = FPUOp2::Div32x4; - return expr0_0; - } - if pattern0_0 == F64X2 { - // Rule at src/isa/s390x/inst.isle line 4655. - let expr0_0 = FPUOp2::Div64x2; - return expr0_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "fpuop2_div", "src/isa/s390x/inst.isle line 4651" - ); -} - -// Generated as internal constructor for term fdiv_reg. -pub fn constructor_fdiv_reg(ctx: &mut C, arg0: Type, arg1: Reg, arg2: Reg) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 4658. - let expr0_0 = constructor_fpuop2_div(ctx, pattern0_0); - let expr1_0 = constructor_fpu_rrr(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term fpuop2_min. -pub fn constructor_fpuop2_min(ctx: &mut C, arg0: Type) -> FPUOp2 { - let pattern0_0 = arg0; - if pattern0_0 == F32 { - // Rule at src/isa/s390x/inst.isle line 4664. - let expr0_0 = FPUOp2::Min32; - return expr0_0; - } - if pattern0_0 == F64 { - // Rule at src/isa/s390x/inst.isle line 4665. - let expr0_0 = FPUOp2::Min64; - return expr0_0; - } - if pattern0_0 == F32X4 { - // Rule at src/isa/s390x/inst.isle line 4666. - let expr0_0 = FPUOp2::Min32x4; - return expr0_0; - } - if pattern0_0 == F64X2 { - // Rule at src/isa/s390x/inst.isle line 4667. - let expr0_0 = FPUOp2::Min64x2; - return expr0_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "fpuop2_min", "src/isa/s390x/inst.isle line 4663" - ); -} - -// Generated as internal constructor for term fmin_reg. -pub fn constructor_fmin_reg(ctx: &mut C, arg0: Type, arg1: Reg, arg2: Reg) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 4670. - let expr0_0 = constructor_fpuop2_min(ctx, pattern0_0); - let expr1_0 = constructor_fpu_rrr(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term fpuop2_max. -pub fn constructor_fpuop2_max(ctx: &mut C, arg0: Type) -> FPUOp2 { - let pattern0_0 = arg0; - if pattern0_0 == F32 { - // Rule at src/isa/s390x/inst.isle line 4676. - let expr0_0 = FPUOp2::Max32; - return expr0_0; - } - if pattern0_0 == F64 { - // Rule at src/isa/s390x/inst.isle line 4677. - let expr0_0 = FPUOp2::Max64; - return expr0_0; - } - if pattern0_0 == F32X4 { - // Rule at src/isa/s390x/inst.isle line 4678. - let expr0_0 = FPUOp2::Max32x4; - return expr0_0; - } - if pattern0_0 == F64X2 { - // Rule at src/isa/s390x/inst.isle line 4679. - let expr0_0 = FPUOp2::Max64x2; - return expr0_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "fpuop2_max", "src/isa/s390x/inst.isle line 4675" - ); -} - -// Generated as internal constructor for term fmax_reg. -pub fn constructor_fmax_reg(ctx: &mut C, arg0: Type, arg1: Reg, arg2: Reg) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 4682. - let expr0_0 = constructor_fpuop2_max(ctx, pattern0_0); - let expr1_0 = constructor_fpu_rrr(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term fpuop2_min_pseudo. -pub fn constructor_fpuop2_min_pseudo(ctx: &mut C, arg0: Type) -> FPUOp2 { - let pattern0_0 = arg0; - if pattern0_0 == F32 { - // Rule at src/isa/s390x/inst.isle line 4688. - let expr0_0 = FPUOp2::MinPseudo32; - return expr0_0; - } - if pattern0_0 == F64 { - // Rule at src/isa/s390x/inst.isle line 4689. - let expr0_0 = FPUOp2::MinPseudo64; - return expr0_0; - } - if pattern0_0 == F32X4 { - // Rule at src/isa/s390x/inst.isle line 4690. - let expr0_0 = FPUOp2::MinPseudo32x4; - return expr0_0; - } - if pattern0_0 == F64X2 { - // Rule at src/isa/s390x/inst.isle line 4691. - let expr0_0 = FPUOp2::MinPseudo64x2; - return expr0_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "fpuop2_min_pseudo", "src/isa/s390x/inst.isle line 4687" - ); -} - -// Generated as internal constructor for term fmin_pseudo_reg. -pub fn constructor_fmin_pseudo_reg( - ctx: &mut C, - arg0: Type, - arg1: Reg, - arg2: Reg, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 4694. - let expr0_0 = constructor_fpuop2_min_pseudo(ctx, pattern0_0); - let expr1_0 = constructor_fpu_rrr(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term fpuop2_max_pseudo. -pub fn constructor_fpuop2_max_pseudo(ctx: &mut C, arg0: Type) -> FPUOp2 { - let pattern0_0 = arg0; - if pattern0_0 == F32 { - // Rule at src/isa/s390x/inst.isle line 4700. - let expr0_0 = FPUOp2::MaxPseudo32; - return expr0_0; - } - if pattern0_0 == F64 { - // Rule at src/isa/s390x/inst.isle line 4701. - let expr0_0 = FPUOp2::MaxPseudo64; - return expr0_0; - } - if pattern0_0 == F32X4 { - // Rule at src/isa/s390x/inst.isle line 4702. - let expr0_0 = FPUOp2::MaxPseudo32x4; - return expr0_0; - } - if pattern0_0 == F64X2 { - // Rule at src/isa/s390x/inst.isle line 4703. - let expr0_0 = FPUOp2::MaxPseudo64x2; - return expr0_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "fpuop2_max_pseudo", "src/isa/s390x/inst.isle line 4699" - ); -} - -// Generated as internal constructor for term fmax_pseudo_reg. -pub fn constructor_fmax_pseudo_reg( - ctx: &mut C, - arg0: Type, - arg1: Reg, - arg2: Reg, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 4706. - let expr0_0 = constructor_fpuop2_max_pseudo(ctx, pattern0_0); - let expr1_0 = constructor_fpu_rrr(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term fpuop3_fma. -pub fn constructor_fpuop3_fma(ctx: &mut C, arg0: Type) -> FPUOp3 { - let pattern0_0 = arg0; - if pattern0_0 == F32 { - // Rule at src/isa/s390x/inst.isle line 4712. - let expr0_0 = FPUOp3::MAdd32; - return expr0_0; - } - if pattern0_0 == F64 { - // Rule at src/isa/s390x/inst.isle line 4713. - let expr0_0 = FPUOp3::MAdd64; - return expr0_0; - } - if pattern0_0 == F32X4 { - // Rule at src/isa/s390x/inst.isle line 4714. - let expr0_0 = FPUOp3::MAdd32x4; - return expr0_0; - } - if pattern0_0 == F64X2 { - // Rule at src/isa/s390x/inst.isle line 4715. - let expr0_0 = FPUOp3::MAdd64x2; - return expr0_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "fpuop3_fma", "src/isa/s390x/inst.isle line 4711" - ); -} - -// Generated as internal constructor for term fma_reg. -pub fn constructor_fma_reg( - ctx: &mut C, - arg0: Type, - arg1: Reg, - arg2: Reg, - arg3: Reg, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - // Rule at src/isa/s390x/inst.isle line 4718. - let expr0_0 = constructor_fpuop3_fma(ctx, pattern0_0); - let expr1_0 = constructor_fpu_rrrr( - ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0, pattern3_0, - ); - return expr1_0; -} - -// Generated as internal constructor for term fpuop1_sqrt. -pub fn constructor_fpuop1_sqrt(ctx: &mut C, arg0: Type) -> FPUOp1 { - let pattern0_0 = arg0; - if pattern0_0 == F32 { - // Rule at src/isa/s390x/inst.isle line 4724. - let expr0_0 = FPUOp1::Sqrt32; - return expr0_0; - } - if pattern0_0 == F64 { - // Rule at src/isa/s390x/inst.isle line 4725. - let expr0_0 = FPUOp1::Sqrt64; - return expr0_0; - } - if pattern0_0 == F32X4 { - // Rule at src/isa/s390x/inst.isle line 4726. - let expr0_0 = FPUOp1::Sqrt32x4; - return expr0_0; - } - if pattern0_0 == F64X2 { - // Rule at src/isa/s390x/inst.isle line 4727. - let expr0_0 = FPUOp1::Sqrt64x2; - return expr0_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "fpuop1_sqrt", "src/isa/s390x/inst.isle line 4723" - ); -} - -// Generated as internal constructor for term sqrt_reg. -pub fn constructor_sqrt_reg(ctx: &mut C, arg0: Type, arg1: Reg) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/s390x/inst.isle line 4730. - let expr0_0 = constructor_fpuop1_sqrt(ctx, pattern0_0); - let expr1_0 = constructor_fpu_rr(ctx, pattern0_0, &expr0_0, pattern1_0); - return expr1_0; -} - -// Generated as internal constructor for term fpuop1_neg. -pub fn constructor_fpuop1_neg(ctx: &mut C, arg0: Type) -> FPUOp1 { - let pattern0_0 = arg0; - if pattern0_0 == F32 { - // Rule at src/isa/s390x/inst.isle line 4736. - let expr0_0 = FPUOp1::Neg32; - return expr0_0; - } - if pattern0_0 == F64 { - // Rule at src/isa/s390x/inst.isle line 4737. - let expr0_0 = FPUOp1::Neg64; - return expr0_0; - } - if pattern0_0 == F32X4 { - // Rule at src/isa/s390x/inst.isle line 4738. - let expr0_0 = FPUOp1::Neg32x4; - return expr0_0; - } - if pattern0_0 == F64X2 { - // Rule at src/isa/s390x/inst.isle line 4739. - let expr0_0 = FPUOp1::Neg64x2; - return expr0_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "fpuop1_neg", "src/isa/s390x/inst.isle line 4735" - ); -} - -// Generated as internal constructor for term fneg_reg. -pub fn constructor_fneg_reg(ctx: &mut C, arg0: Type, arg1: Reg) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/s390x/inst.isle line 4742. - let expr0_0 = constructor_fpuop1_neg(ctx, pattern0_0); - let expr1_0 = constructor_fpu_rr(ctx, pattern0_0, &expr0_0, pattern1_0); - return expr1_0; -} - -// Generated as internal constructor for term fpuop1_abs. -pub fn constructor_fpuop1_abs(ctx: &mut C, arg0: Type) -> FPUOp1 { - let pattern0_0 = arg0; - if pattern0_0 == F32 { - // Rule at src/isa/s390x/inst.isle line 4748. - let expr0_0 = FPUOp1::Abs32; - return expr0_0; - } - if pattern0_0 == F64 { - // Rule at src/isa/s390x/inst.isle line 4749. - let expr0_0 = FPUOp1::Abs64; - return expr0_0; - } - if pattern0_0 == F32X4 { - // Rule at src/isa/s390x/inst.isle line 4750. - let expr0_0 = FPUOp1::Abs32x4; - return expr0_0; - } - if pattern0_0 == F64X2 { - // Rule at src/isa/s390x/inst.isle line 4751. - let expr0_0 = FPUOp1::Abs64x2; - return expr0_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "fpuop1_abs", "src/isa/s390x/inst.isle line 4747" - ); -} - -// Generated as internal constructor for term fabs_reg. -pub fn constructor_fabs_reg(ctx: &mut C, arg0: Type, arg1: Reg) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/s390x/inst.isle line 4754. - let expr0_0 = constructor_fpuop1_abs(ctx, pattern0_0); - let expr1_0 = constructor_fpu_rr(ctx, pattern0_0, &expr0_0, pattern1_0); - return expr1_0; -} - -// Generated as internal constructor for term fpuroundop_round. -pub fn constructor_fpuroundop_round(ctx: &mut C, arg0: Type) -> FpuRoundOp { - let pattern0_0 = arg0; - if pattern0_0 == F32 { - // Rule at src/isa/s390x/inst.isle line 4760. - let expr0_0 = FpuRoundOp::Round32; - return expr0_0; - } - if pattern0_0 == F64 { - // Rule at src/isa/s390x/inst.isle line 4761. - let expr0_0 = FpuRoundOp::Round64; - return expr0_0; - } - if pattern0_0 == F32X4 { - // Rule at src/isa/s390x/inst.isle line 4762. - let expr0_0 = FpuRoundOp::Round32x4; - return expr0_0; - } - if pattern0_0 == F64X2 { - // Rule at src/isa/s390x/inst.isle line 4763. - let expr0_0 = FpuRoundOp::Round64x2; - return expr0_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "fpuroundop_round", "src/isa/s390x/inst.isle line 4759" - ); -} - -// Generated as internal constructor for term ceil_reg. -pub fn constructor_ceil_reg(ctx: &mut C, arg0: Type, arg1: Reg) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/s390x/inst.isle line 4766. - let expr0_0 = constructor_fpuroundop_round(ctx, pattern0_0); - let expr1_0 = FpuRoundMode::ToPosInfinity; - let expr2_0 = constructor_fpu_round(ctx, pattern0_0, &expr0_0, &expr1_0, pattern1_0); - return expr2_0; -} - -// Generated as internal constructor for term floor_reg. -pub fn constructor_floor_reg(ctx: &mut C, arg0: Type, arg1: Reg) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/s390x/inst.isle line 4770. - let expr0_0 = constructor_fpuroundop_round(ctx, pattern0_0); - let expr1_0 = FpuRoundMode::ToNegInfinity; - let expr2_0 = constructor_fpu_round(ctx, pattern0_0, &expr0_0, &expr1_0, pattern1_0); - return expr2_0; -} - -// Generated as internal constructor for term trunc_reg. -pub fn constructor_trunc_reg(ctx: &mut C, arg0: Type, arg1: Reg) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/s390x/inst.isle line 4774. - let expr0_0 = constructor_fpuroundop_round(ctx, pattern0_0); - let expr1_0 = FpuRoundMode::ToZero; - let expr2_0 = constructor_fpu_round(ctx, pattern0_0, &expr0_0, &expr1_0, pattern1_0); - return expr2_0; -} - -// Generated as internal constructor for term nearest_reg. -pub fn constructor_nearest_reg(ctx: &mut C, arg0: Type, arg1: Reg) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/s390x/inst.isle line 4778. - let expr0_0 = constructor_fpuroundop_round(ctx, pattern0_0); - let expr1_0 = FpuRoundMode::ToNearestTiesToEven; - let expr2_0 = constructor_fpu_round(ctx, pattern0_0, &expr0_0, &expr1_0, pattern1_0); - return expr2_0; -} - -// Generated as internal constructor for term fpromote_reg. -pub fn constructor_fpromote_reg(ctx: &mut C, arg0: Type, arg1: Type, arg2: Reg) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - if pattern1_0 == pattern0_0 { - let pattern3_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 4785. - return pattern3_0; - } - let pattern0_0 = arg0; - if pattern0_0 == F64 { - let pattern2_0 = arg1; - if pattern2_0 == F32 { - let pattern4_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 4786. - let expr0_0: Type = F64; - let expr1_0 = FPUOp1::Cvt32To64; - let expr2_0 = constructor_fpu_rr(ctx, expr0_0, &expr1_0, pattern4_0); - return expr2_0; - } - } - if pattern0_0 == F64X2 { - let pattern2_0 = arg1; - if pattern2_0 == F32X4 { - let pattern4_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 4788. - let expr0_0: Type = F64; - let expr1_0 = FPUOp1::Cvt32x4To64x2; - let expr2_0 = constructor_fpu_rr(ctx, expr0_0, &expr1_0, pattern4_0); - return expr2_0; - } - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "fpromote_reg", "src/isa/s390x/inst.isle line 4784" - ); -} - -// Generated as internal constructor for term fdemote_reg. -pub fn constructor_fdemote_reg( - ctx: &mut C, - arg0: Type, - arg1: Type, - arg2: &FpuRoundMode, - arg3: Reg, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - if pattern1_0 == pattern0_0 { - let pattern3_0 = arg2; - let pattern4_0 = arg3; - // Rule at src/isa/s390x/inst.isle line 4795. - return pattern4_0; - } - let pattern0_0 = arg0; - if pattern0_0 == F32 { - let pattern2_0 = arg1; - if pattern2_0 == F64 { - let pattern4_0 = arg2; - let pattern5_0 = arg3; - // Rule at src/isa/s390x/inst.isle line 4796. - let expr0_0: Type = F32; - let expr1_0 = FpuRoundOp::Cvt64To32; - let expr2_0 = constructor_fpu_round(ctx, expr0_0, &expr1_0, pattern4_0, pattern5_0); - return expr2_0; - } - } - if pattern0_0 == F32X4 { - let pattern2_0 = arg1; - if pattern2_0 == F64X2 { - let pattern4_0 = arg2; - let pattern5_0 = arg3; - // Rule at src/isa/s390x/inst.isle line 4798. - let expr0_0: Type = F32X4; - let expr1_0 = FpuRoundOp::Cvt64x2To32x4; - let expr2_0 = constructor_fpu_round(ctx, expr0_0, &expr1_0, pattern4_0, pattern5_0); - return expr2_0; - } - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "fdemote_reg", "src/isa/s390x/inst.isle line 4794" - ); -} - -// Generated as internal constructor for term fcvt_from_uint_reg. -pub fn constructor_fcvt_from_uint_reg( - ctx: &mut C, - arg0: Type, - arg1: &FpuRoundMode, - arg2: Reg, -) -> Reg { - let pattern0_0 = arg0; - if pattern0_0 == F32 { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 4805. - let expr0_0: Type = F32; - let expr1_0 = FpuRoundOp::FromUInt32; - let expr2_0: Type = I32X4; - let expr3_0: u8 = 0i128 as u8; - let expr4_0 = C::zero_reg(ctx); - let expr5_0 = constructor_vec_insert_lane_undef(ctx, expr2_0, pattern3_0, expr3_0, expr4_0); - let expr6_0 = constructor_fpu_round(ctx, expr0_0, &expr1_0, pattern2_0, expr5_0); - return expr6_0; - } - if pattern0_0 == F64 { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 4807. - let expr0_0: Type = F64; - let expr1_0 = FpuRoundOp::FromUInt64; - let expr2_0: Type = I64X2; - let expr3_0: u8 = 0i128 as u8; - let expr4_0 = C::zero_reg(ctx); - let expr5_0 = constructor_vec_insert_lane_undef(ctx, expr2_0, pattern3_0, expr3_0, expr4_0); - let expr6_0 = constructor_fpu_round(ctx, expr0_0, &expr1_0, pattern2_0, expr5_0); - return expr6_0; - } - if pattern0_0 == F32X4 { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 4809. - let expr0_0: Type = F32X4; - let expr1_0 = FpuRoundOp::FromUInt32x4; - let expr2_0 = constructor_fpu_round(ctx, expr0_0, &expr1_0, pattern2_0, pattern3_0); - return expr2_0; - } - if pattern0_0 == F64X2 { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 4811. - let expr0_0: Type = F64X2; - let expr1_0 = FpuRoundOp::FromUInt64x2; - let expr2_0 = constructor_fpu_round(ctx, expr0_0, &expr1_0, pattern2_0, pattern3_0); - return expr2_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "fcvt_from_uint_reg", "src/isa/s390x/inst.isle line 4804" - ); -} - -// Generated as internal constructor for term fcvt_from_sint_reg. -pub fn constructor_fcvt_from_sint_reg( - ctx: &mut C, - arg0: Type, - arg1: &FpuRoundMode, - arg2: Reg, -) -> Reg { - let pattern0_0 = arg0; - if pattern0_0 == F32 { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 4818. - let expr0_0: Type = F32; - let expr1_0 = FpuRoundOp::FromSInt32; - let expr2_0: Type = I32X4; - let expr3_0: u8 = 0i128 as u8; - let expr4_0 = C::zero_reg(ctx); - let expr5_0 = constructor_vec_insert_lane_undef(ctx, expr2_0, pattern3_0, expr3_0, expr4_0); - let expr6_0 = constructor_fpu_round(ctx, expr0_0, &expr1_0, pattern2_0, expr5_0); - return expr6_0; - } - if pattern0_0 == F64 { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 4820. - let expr0_0: Type = F64; - let expr1_0 = FpuRoundOp::FromSInt64; - let expr2_0: Type = I64X2; - let expr3_0: u8 = 0i128 as u8; - let expr4_0 = C::zero_reg(ctx); - let expr5_0 = constructor_vec_insert_lane_undef(ctx, expr2_0, pattern3_0, expr3_0, expr4_0); - let expr6_0 = constructor_fpu_round(ctx, expr0_0, &expr1_0, pattern2_0, expr5_0); - return expr6_0; - } - if pattern0_0 == F32X4 { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 4822. - let expr0_0: Type = F32X4; - let expr1_0 = FpuRoundOp::FromSInt32x4; - let expr2_0 = constructor_fpu_round(ctx, expr0_0, &expr1_0, pattern2_0, pattern3_0); - return expr2_0; - } - if pattern0_0 == F64X2 { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 4824. - let expr0_0: Type = F64X2; - let expr1_0 = FpuRoundOp::FromSInt64x2; - let expr2_0 = constructor_fpu_round(ctx, expr0_0, &expr1_0, pattern2_0, pattern3_0); - return expr2_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "fcvt_from_sint_reg", "src/isa/s390x/inst.isle line 4817" - ); -} - -// Generated as internal constructor for term fcvt_flt_ty. -pub fn constructor_fcvt_flt_ty(ctx: &mut C, arg0: Type, arg1: Type) -> Type { - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::fits_in_32(ctx, pattern0_0) { - let pattern2_0 = arg1; - if let Some(()) = C::vxrs_ext2_enabled(ctx, pattern2_0) { - if pattern2_0 == F32 { - // Rule at src/isa/s390x/inst.isle line 4831. - let expr0_0: Type = F32; - return expr0_0; - } - } - } - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::fits_in_64(ctx, pattern0_0) { - let pattern2_0 = arg1; - if pattern2_0 == F32 { - // Rule at src/isa/s390x/inst.isle line 4832. - let expr0_0: Type = F64; - return expr0_0; - } - if pattern2_0 == F64 { - // Rule at src/isa/s390x/inst.isle line 4833. - let expr0_0: Type = F64; - return expr0_0; - } - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "fcvt_flt_ty", "src/isa/s390x/inst.isle line 4830" - ); -} - -// Generated as internal constructor for term fcvt_int_ty. -pub fn constructor_fcvt_int_ty(ctx: &mut C, arg0: Type, arg1: Type) -> Type { - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::fits_in_32(ctx, pattern0_0) { - let pattern2_0 = arg1; - if let Some(()) = C::vxrs_ext2_enabled(ctx, pattern2_0) { - if pattern2_0 == F32 { - // Rule at src/isa/s390x/inst.isle line 4836. - let expr0_0: Type = I32; - return expr0_0; - } - } - } - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::fits_in_64(ctx, pattern0_0) { - let pattern2_0 = arg1; - if pattern2_0 == F32 { - // Rule at src/isa/s390x/inst.isle line 4837. - let expr0_0: Type = I64; - return expr0_0; - } - if pattern2_0 == F64 { - // Rule at src/isa/s390x/inst.isle line 4838. - let expr0_0: Type = I64; - return expr0_0; - } - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "fcvt_int_ty", "src/isa/s390x/inst.isle line 4835" - ); -} - -// Generated as internal constructor for term fcvt_to_uint_reg. -pub fn constructor_fcvt_to_uint_reg( - ctx: &mut C, - arg0: Type, - arg1: &FpuRoundMode, - arg2: Reg, -) -> Reg { - let pattern0_0 = arg0; - if pattern0_0 == F32 { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 4844. - let expr0_0: Type = I32X4; - let expr1_0: Type = F32; - let expr2_0 = FpuRoundOp::ToUInt32; - let expr3_0 = constructor_fpu_round(ctx, expr1_0, &expr2_0, pattern2_0, pattern3_0); - let expr4_0: u8 = 0i128 as u8; - let expr5_0 = C::zero_reg(ctx); - let expr6_0 = constructor_vec_extract_lane(ctx, expr0_0, expr3_0, expr4_0, expr5_0); - return expr6_0; - } - if pattern0_0 == F64 { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 4846. - let expr0_0: Type = I64X2; - let expr1_0: Type = F64; - let expr2_0 = FpuRoundOp::ToUInt64; - let expr3_0 = constructor_fpu_round(ctx, expr1_0, &expr2_0, pattern2_0, pattern3_0); - let expr4_0: u8 = 0i128 as u8; - let expr5_0 = C::zero_reg(ctx); - let expr6_0 = constructor_vec_extract_lane(ctx, expr0_0, expr3_0, expr4_0, expr5_0); - return expr6_0; - } - if pattern0_0 == F32X4 { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 4848. - let expr0_0: Type = F32X4; - let expr1_0 = FpuRoundOp::ToUInt32x4; - let expr2_0 = constructor_fpu_round(ctx, expr0_0, &expr1_0, pattern2_0, pattern3_0); - return expr2_0; - } - if pattern0_0 == F64X2 { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 4850. - let expr0_0: Type = F64X2; - let expr1_0 = FpuRoundOp::ToUInt64x2; - let expr2_0 = constructor_fpu_round(ctx, expr0_0, &expr1_0, pattern2_0, pattern3_0); - return expr2_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "fcvt_to_uint_reg", "src/isa/s390x/inst.isle line 4843" - ); -} - -// Generated as internal constructor for term fcvt_to_uint_ub. -pub fn constructor_fcvt_to_uint_ub(ctx: &mut C, arg0: Type, arg1: Type) -> Reg { - let pattern0_0 = arg0; - if pattern0_0 == F32 { - let pattern2_0 = arg1; - // Rule at src/isa/s390x/inst.isle line 4854. - let expr0_0: Type = F32; - let expr1_0 = C::ty_bits(ctx, pattern2_0); - let expr2_0 = C::fcvt_to_uint_ub32(ctx, expr1_0); - let expr3_0 = constructor_imm(ctx, expr0_0, expr2_0); - return expr3_0; - } - if pattern0_0 == F64 { - let pattern2_0 = arg1; - // Rule at src/isa/s390x/inst.isle line 4856. - let expr0_0: Type = F64; - let expr1_0 = C::ty_bits(ctx, pattern2_0); - let expr2_0 = C::fcvt_to_uint_ub64(ctx, expr1_0); - let expr3_0 = constructor_imm(ctx, expr0_0, expr2_0); - return expr3_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "fcvt_to_uint_ub", "src/isa/s390x/inst.isle line 4853" - ); -} - -// Generated as internal constructor for term fcvt_to_uint_lb. -pub fn constructor_fcvt_to_uint_lb(ctx: &mut C, arg0: Type) -> Reg { - let pattern0_0 = arg0; - if pattern0_0 == F32 { - // Rule at src/isa/s390x/inst.isle line 4860. - let expr0_0: Type = F32; - let expr1_0 = C::fcvt_to_uint_lb32(ctx); - let expr2_0 = constructor_imm(ctx, expr0_0, expr1_0); - return expr2_0; - } - if pattern0_0 == F64 { - // Rule at src/isa/s390x/inst.isle line 4861. - let expr0_0: Type = F64; - let expr1_0 = C::fcvt_to_uint_lb64(ctx); - let expr2_0 = constructor_imm(ctx, expr0_0, expr1_0); - return expr2_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "fcvt_to_uint_lb", "src/isa/s390x/inst.isle line 4859" - ); -} - -// Generated as internal constructor for term fcvt_to_sint_reg. -pub fn constructor_fcvt_to_sint_reg( - ctx: &mut C, - arg0: Type, - arg1: &FpuRoundMode, - arg2: Reg, -) -> Reg { - let pattern0_0 = arg0; - if pattern0_0 == F32 { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 4876. - let expr0_0: Type = F32X4; - let expr1_0: Type = F32; - let expr2_0 = FpuRoundOp::ToSInt32; - let expr3_0 = constructor_fpu_round(ctx, expr1_0, &expr2_0, pattern2_0, pattern3_0); - let expr4_0: u8 = 0i128 as u8; - let expr5_0 = C::zero_reg(ctx); - let expr6_0 = constructor_vec_extract_lane(ctx, expr0_0, expr3_0, expr4_0, expr5_0); - return expr6_0; - } - if pattern0_0 == F64 { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 4878. - let expr0_0: Type = F64X2; - let expr1_0: Type = F64; - let expr2_0 = FpuRoundOp::ToSInt64; - let expr3_0 = constructor_fpu_round(ctx, expr1_0, &expr2_0, pattern2_0, pattern3_0); - let expr4_0: u8 = 0i128 as u8; - let expr5_0 = C::zero_reg(ctx); - let expr6_0 = constructor_vec_extract_lane(ctx, expr0_0, expr3_0, expr4_0, expr5_0); - return expr6_0; - } - if pattern0_0 == F32X4 { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 4880. - let expr0_0: Type = F32X4; - let expr1_0 = FpuRoundOp::ToSInt32x4; - let expr2_0 = constructor_fpu_round(ctx, expr0_0, &expr1_0, pattern2_0, pattern3_0); - return expr2_0; - } - if pattern0_0 == F64X2 { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 4882. - let expr0_0: Type = F64X2; - let expr1_0 = FpuRoundOp::ToSInt64x2; - let expr2_0 = constructor_fpu_round(ctx, expr0_0, &expr1_0, pattern2_0, pattern3_0); - return expr2_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "fcvt_to_sint_reg", "src/isa/s390x/inst.isle line 4875" - ); -} - -// Generated as internal constructor for term fcvt_to_sint_ub. -pub fn constructor_fcvt_to_sint_ub(ctx: &mut C, arg0: Type, arg1: Type) -> Reg { - let pattern0_0 = arg0; - if pattern0_0 == F32 { - let pattern2_0 = arg1; - // Rule at src/isa/s390x/inst.isle line 4886. - let expr0_0: Type = F32; - let expr1_0 = C::ty_bits(ctx, pattern2_0); - let expr2_0 = C::fcvt_to_sint_ub32(ctx, expr1_0); - let expr3_0 = constructor_imm(ctx, expr0_0, expr2_0); - return expr3_0; - } - if pattern0_0 == F64 { - let pattern2_0 = arg1; - // Rule at src/isa/s390x/inst.isle line 4888. - let expr0_0: Type = F64; - let expr1_0 = C::ty_bits(ctx, pattern2_0); - let expr2_0 = C::fcvt_to_sint_ub64(ctx, expr1_0); - let expr3_0 = constructor_imm(ctx, expr0_0, expr2_0); - return expr3_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "fcvt_to_sint_ub", "src/isa/s390x/inst.isle line 4885" - ); -} - -// Generated as internal constructor for term fcvt_to_sint_lb. -pub fn constructor_fcvt_to_sint_lb(ctx: &mut C, arg0: Type, arg1: Type) -> Reg { - let pattern0_0 = arg0; - if pattern0_0 == F32 { - let pattern2_0 = arg1; - // Rule at src/isa/s390x/inst.isle line 4892. - let expr0_0: Type = F32; - let expr1_0 = C::ty_bits(ctx, pattern2_0); - let expr2_0 = C::fcvt_to_sint_lb32(ctx, expr1_0); - let expr3_0 = constructor_imm(ctx, expr0_0, expr2_0); - return expr3_0; - } - if pattern0_0 == F64 { - let pattern2_0 = arg1; - // Rule at src/isa/s390x/inst.isle line 4894. - let expr0_0: Type = F64; - let expr1_0 = C::ty_bits(ctx, pattern2_0); - let expr2_0 = C::fcvt_to_sint_lb64(ctx, expr1_0); - let expr3_0 = constructor_imm(ctx, expr0_0, expr2_0); - return expr3_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "fcvt_to_sint_lb", "src/isa/s390x/inst.isle line 4891" - ); -} - -// Generated as internal constructor for term cmpop_cmps. -pub fn constructor_cmpop_cmps(ctx: &mut C, arg0: Type) -> CmpOp { - let pattern0_0 = arg0; - if pattern0_0 == I32 { - // Rule at src/isa/s390x/inst.isle line 4910. - let expr0_0 = CmpOp::CmpS32; - return expr0_0; - } - if pattern0_0 == I64 { - // Rule at src/isa/s390x/inst.isle line 4911. - let expr0_0 = CmpOp::CmpS64; - return expr0_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "cmpop_cmps", "src/isa/s390x/inst.isle line 4909" - ); -} - -// Generated as internal constructor for term cmpop_cmps_sext16. -pub fn constructor_cmpop_cmps_sext16(ctx: &mut C, arg0: Type) -> CmpOp { - let pattern0_0 = arg0; - if pattern0_0 == I32 { - // Rule at src/isa/s390x/inst.isle line 4914. - let expr0_0 = CmpOp::CmpS32Ext16; - return expr0_0; - } - if pattern0_0 == I64 { - // Rule at src/isa/s390x/inst.isle line 4915. - let expr0_0 = CmpOp::CmpS64Ext16; - return expr0_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "cmpop_cmps_sext16", "src/isa/s390x/inst.isle line 4913" - ); -} - -// Generated as internal constructor for term cmpop_cmps_sext32. -pub fn constructor_cmpop_cmps_sext32(ctx: &mut C, arg0: Type) -> CmpOp { - let pattern0_0 = arg0; - if pattern0_0 == I64 { - // Rule at src/isa/s390x/inst.isle line 4918. - let expr0_0 = CmpOp::CmpS64Ext32; - return expr0_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "cmpop_cmps_sext32", "src/isa/s390x/inst.isle line 4917" - ); -} - -// Generated as internal constructor for term icmps_reg. -pub fn constructor_icmps_reg( - ctx: &mut C, - arg0: Type, - arg1: Reg, - arg2: Reg, -) -> ProducesFlags { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 4921. - let expr0_0 = constructor_cmpop_cmps(ctx, pattern0_0); - let expr1_0 = constructor_cmp_rr(ctx, &expr0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term icmps_reg_sext32. -pub fn constructor_icmps_reg_sext32( - ctx: &mut C, - arg0: Type, - arg1: Reg, - arg2: Reg, -) -> ProducesFlags { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 4924. - let expr0_0 = constructor_cmpop_cmps_sext32(ctx, pattern0_0); - let expr1_0 = constructor_cmp_rr(ctx, &expr0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term icmps_simm16. -pub fn constructor_icmps_simm16( - ctx: &mut C, - arg0: Type, - arg1: Reg, - arg2: i16, -) -> ProducesFlags { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 4927. - let expr0_0 = constructor_cmpop_cmps(ctx, pattern0_0); - let expr1_0 = constructor_cmp_rsimm16(ctx, &expr0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term icmps_simm32. -pub fn constructor_icmps_simm32( - ctx: &mut C, - arg0: Type, - arg1: Reg, - arg2: i32, -) -> ProducesFlags { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 4930. - let expr0_0 = constructor_cmpop_cmps(ctx, pattern0_0); - let expr1_0 = constructor_cmp_rsimm32(ctx, &expr0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term icmps_mem. -pub fn constructor_icmps_mem( - ctx: &mut C, - arg0: Type, - arg1: Reg, - arg2: &MemArg, -) -> ProducesFlags { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 4933. - let expr0_0 = constructor_cmpop_cmps(ctx, pattern0_0); - let expr1_0 = constructor_cmp_rx(ctx, &expr0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term icmps_mem_sext16. -pub fn constructor_icmps_mem_sext16( - ctx: &mut C, - arg0: Type, - arg1: Reg, - arg2: &MemArg, -) -> ProducesFlags { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 4936. - let expr0_0 = constructor_cmpop_cmps_sext16(ctx, pattern0_0); - let expr1_0 = constructor_cmp_rx(ctx, &expr0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term icmps_mem_sext32. -pub fn constructor_icmps_mem_sext32( - ctx: &mut C, - arg0: Type, - arg1: Reg, - arg2: &MemArg, -) -> ProducesFlags { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 4939. - let expr0_0 = constructor_cmpop_cmps_sext32(ctx, pattern0_0); - let expr1_0 = constructor_cmp_rx(ctx, &expr0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term cmpop_cmpu. -pub fn constructor_cmpop_cmpu(ctx: &mut C, arg0: Type) -> CmpOp { - let pattern0_0 = arg0; - if pattern0_0 == I32 { - // Rule at src/isa/s390x/inst.isle line 4945. - let expr0_0 = CmpOp::CmpL32; - return expr0_0; - } - if pattern0_0 == I64 { - // Rule at src/isa/s390x/inst.isle line 4946. - let expr0_0 = CmpOp::CmpL64; - return expr0_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "cmpop_cmpu", "src/isa/s390x/inst.isle line 4944" - ); -} - -// Generated as internal constructor for term cmpop_cmpu_zext16. -pub fn constructor_cmpop_cmpu_zext16(ctx: &mut C, arg0: Type) -> CmpOp { - let pattern0_0 = arg0; - if pattern0_0 == I32 { - // Rule at src/isa/s390x/inst.isle line 4949. - let expr0_0 = CmpOp::CmpL32Ext16; - return expr0_0; - } - if pattern0_0 == I64 { - // Rule at src/isa/s390x/inst.isle line 4950. - let expr0_0 = CmpOp::CmpL64Ext16; - return expr0_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "cmpop_cmpu_zext16", "src/isa/s390x/inst.isle line 4948" - ); -} - -// Generated as internal constructor for term cmpop_cmpu_zext32. -pub fn constructor_cmpop_cmpu_zext32(ctx: &mut C, arg0: Type) -> CmpOp { - let pattern0_0 = arg0; - if pattern0_0 == I64 { - // Rule at src/isa/s390x/inst.isle line 4953. - let expr0_0 = CmpOp::CmpL64Ext32; - return expr0_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "cmpop_cmpu_zext32", "src/isa/s390x/inst.isle line 4952" - ); -} - -// Generated as internal constructor for term icmpu_reg. -pub fn constructor_icmpu_reg( - ctx: &mut C, - arg0: Type, - arg1: Reg, - arg2: Reg, -) -> ProducesFlags { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 4956. - let expr0_0 = constructor_cmpop_cmpu(ctx, pattern0_0); - let expr1_0 = constructor_cmp_rr(ctx, &expr0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term icmpu_reg_zext32. -pub fn constructor_icmpu_reg_zext32( - ctx: &mut C, - arg0: Type, - arg1: Reg, - arg2: Reg, -) -> ProducesFlags { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 4959. - let expr0_0 = constructor_cmpop_cmpu_zext32(ctx, pattern0_0); - let expr1_0 = constructor_cmp_rr(ctx, &expr0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term icmpu_uimm32. -pub fn constructor_icmpu_uimm32( - ctx: &mut C, - arg0: Type, - arg1: Reg, - arg2: u32, -) -> ProducesFlags { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 4962. - let expr0_0 = constructor_cmpop_cmpu(ctx, pattern0_0); - let expr1_0 = constructor_cmp_ruimm32(ctx, &expr0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term icmpu_mem. -pub fn constructor_icmpu_mem( - ctx: &mut C, - arg0: Type, - arg1: Reg, - arg2: &MemArg, -) -> ProducesFlags { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 4965. - let expr0_0 = constructor_cmpop_cmpu(ctx, pattern0_0); - let expr1_0 = constructor_cmp_rx(ctx, &expr0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term icmpu_mem_zext16. -pub fn constructor_icmpu_mem_zext16( - ctx: &mut C, - arg0: Type, - arg1: Reg, - arg2: &MemArg, -) -> ProducesFlags { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 4968. - let expr0_0 = constructor_cmpop_cmpu_zext16(ctx, pattern0_0); - let expr1_0 = constructor_cmp_rx(ctx, &expr0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term icmpu_mem_zext32. -pub fn constructor_icmpu_mem_zext32( - ctx: &mut C, - arg0: Type, - arg1: Reg, - arg2: &MemArg, -) -> ProducesFlags { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 4971. - let expr0_0 = constructor_cmpop_cmpu_zext32(ctx, pattern0_0); - let expr1_0 = constructor_cmp_rx(ctx, &expr0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term vecop_int_cmpeq. -pub fn constructor_vecop_int_cmpeq(ctx: &mut C, arg0: Type) -> VecIntCmpOp { - let pattern0_0 = arg0; - if let Some((pattern1_0, pattern1_1)) = C::multi_lane(ctx, pattern0_0) { - if pattern1_0 == 8i128 as u32 { - if pattern1_1 == 16i128 as u32 { - // Rule at src/isa/s390x/inst.isle line 4977. - let expr0_0 = VecIntCmpOp::CmpEq8x16; - return expr0_0; - } - } - if pattern1_0 == 16i128 as u32 { - if pattern1_1 == 8i128 as u32 { - // Rule at src/isa/s390x/inst.isle line 4978. - let expr0_0 = VecIntCmpOp::CmpEq16x8; - return expr0_0; - } - } - if pattern1_0 == 32i128 as u32 { - if pattern1_1 == 4i128 as u32 { - // Rule at src/isa/s390x/inst.isle line 4979. - let expr0_0 = VecIntCmpOp::CmpEq32x4; - return expr0_0; - } - } - if pattern1_0 == 64i128 as u32 { - if pattern1_1 == 2i128 as u32 { - // Rule at src/isa/s390x/inst.isle line 4980. - let expr0_0 = VecIntCmpOp::CmpEq64x2; - return expr0_0; - } - } - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "vecop_int_cmpeq", "src/isa/s390x/inst.isle line 4976" - ); -} - -// Generated as internal constructor for term vec_cmpeq. -pub fn constructor_vec_cmpeq(ctx: &mut C, arg0: Type, arg1: Reg, arg2: Reg) -> Reg { - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::ty_vec128(ctx, pattern0_0) { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 4983. - let expr0_0 = constructor_vecop_int_cmpeq(ctx, pattern1_0); - let expr1_0 = constructor_vec_int_cmp(ctx, pattern1_0, &expr0_0, pattern2_0, pattern3_0); - return expr1_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "vec_cmpeq", "src/isa/s390x/inst.isle line 4982" - ); -} - -// Generated as internal constructor for term vec_cmpeqs. -pub fn constructor_vec_cmpeqs( - ctx: &mut C, - arg0: Type, - arg1: Reg, - arg2: Reg, -) -> ProducesFlags { - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::ty_vec128(ctx, pattern0_0) { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 4985. - let expr0_0 = constructor_vecop_int_cmpeq(ctx, pattern1_0); - let expr1_0 = constructor_vec_int_cmps(ctx, pattern1_0, &expr0_0, pattern2_0, pattern3_0); - return expr1_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "vec_cmpeqs", "src/isa/s390x/inst.isle line 4984" - ); -} - -// Generated as internal constructor for term vecop_int_cmph. -pub fn constructor_vecop_int_cmph(ctx: &mut C, arg0: Type) -> VecIntCmpOp { - let pattern0_0 = arg0; - if let Some((pattern1_0, pattern1_1)) = C::multi_lane(ctx, pattern0_0) { - if pattern1_0 == 8i128 as u32 { - if pattern1_1 == 16i128 as u32 { - // Rule at src/isa/s390x/inst.isle line 4988. - let expr0_0 = VecIntCmpOp::SCmpHi8x16; - return expr0_0; - } - } - if pattern1_0 == 16i128 as u32 { - if pattern1_1 == 8i128 as u32 { - // Rule at src/isa/s390x/inst.isle line 4989. - let expr0_0 = VecIntCmpOp::SCmpHi16x8; - return expr0_0; - } - } - if pattern1_0 == 32i128 as u32 { - if pattern1_1 == 4i128 as u32 { - // Rule at src/isa/s390x/inst.isle line 4990. - let expr0_0 = VecIntCmpOp::SCmpHi32x4; - return expr0_0; - } - } - if pattern1_0 == 64i128 as u32 { - if pattern1_1 == 2i128 as u32 { - // Rule at src/isa/s390x/inst.isle line 4991. - let expr0_0 = VecIntCmpOp::SCmpHi64x2; - return expr0_0; - } - } - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "vecop_int_cmph", "src/isa/s390x/inst.isle line 4987" - ); -} - -// Generated as internal constructor for term vec_cmph. -pub fn constructor_vec_cmph(ctx: &mut C, arg0: Type, arg1: Reg, arg2: Reg) -> Reg { - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::ty_vec128(ctx, pattern0_0) { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 4994. - let expr0_0 = constructor_vecop_int_cmph(ctx, pattern1_0); - let expr1_0 = constructor_vec_int_cmp(ctx, pattern1_0, &expr0_0, pattern2_0, pattern3_0); - return expr1_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "vec_cmph", "src/isa/s390x/inst.isle line 4993" - ); -} - -// Generated as internal constructor for term vec_cmphs. -pub fn constructor_vec_cmphs( - ctx: &mut C, - arg0: Type, - arg1: Reg, - arg2: Reg, -) -> ProducesFlags { - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::ty_vec128(ctx, pattern0_0) { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 4996. - let expr0_0 = constructor_vecop_int_cmph(ctx, pattern1_0); - let expr1_0 = constructor_vec_int_cmps(ctx, pattern1_0, &expr0_0, pattern2_0, pattern3_0); - return expr1_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "vec_cmphs", "src/isa/s390x/inst.isle line 4995" - ); -} - -// Generated as internal constructor for term vecop_int_cmphl. -pub fn constructor_vecop_int_cmphl(ctx: &mut C, arg0: Type) -> VecIntCmpOp { - let pattern0_0 = arg0; - if let Some((pattern1_0, pattern1_1)) = C::multi_lane(ctx, pattern0_0) { - if pattern1_0 == 8i128 as u32 { - if pattern1_1 == 16i128 as u32 { - // Rule at src/isa/s390x/inst.isle line 4999. - let expr0_0 = VecIntCmpOp::UCmpHi8x16; - return expr0_0; - } - } - if pattern1_0 == 16i128 as u32 { - if pattern1_1 == 8i128 as u32 { - // Rule at src/isa/s390x/inst.isle line 5000. - let expr0_0 = VecIntCmpOp::UCmpHi16x8; - return expr0_0; - } - } - if pattern1_0 == 32i128 as u32 { - if pattern1_1 == 4i128 as u32 { - // Rule at src/isa/s390x/inst.isle line 5001. - let expr0_0 = VecIntCmpOp::UCmpHi32x4; - return expr0_0; - } - } - if pattern1_0 == 64i128 as u32 { - if pattern1_1 == 2i128 as u32 { - // Rule at src/isa/s390x/inst.isle line 5002. - let expr0_0 = VecIntCmpOp::UCmpHi64x2; - return expr0_0; - } - } - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "vecop_int_cmphl", "src/isa/s390x/inst.isle line 4998" - ); -} - -// Generated as internal constructor for term vec_cmphl. -pub fn constructor_vec_cmphl(ctx: &mut C, arg0: Type, arg1: Reg, arg2: Reg) -> Reg { - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::ty_vec128(ctx, pattern0_0) { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 5005. - let expr0_0 = constructor_vecop_int_cmphl(ctx, pattern1_0); - let expr1_0 = constructor_vec_int_cmp(ctx, pattern1_0, &expr0_0, pattern2_0, pattern3_0); - return expr1_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "vec_cmphl", "src/isa/s390x/inst.isle line 5004" - ); -} - -// Generated as internal constructor for term vec_cmphls. -pub fn constructor_vec_cmphls( - ctx: &mut C, - arg0: Type, - arg1: Reg, - arg2: Reg, -) -> ProducesFlags { - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::ty_vec128(ctx, pattern0_0) { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 5007. - let expr0_0 = constructor_vecop_int_cmphl(ctx, pattern1_0); - let expr1_0 = constructor_vec_int_cmps(ctx, pattern1_0, &expr0_0, pattern2_0, pattern3_0); - return expr1_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "vec_cmphls", "src/isa/s390x/inst.isle line 5006" - ); -} - -// Generated as internal constructor for term fcmp_reg. -pub fn constructor_fcmp_reg( - ctx: &mut C, - arg0: Type, - arg1: Reg, - arg2: Reg, -) -> ProducesFlags { - let pattern0_0 = arg0; - if pattern0_0 == F32 { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 5013. - let expr0_0 = constructor_fpu_cmp32(ctx, pattern2_0, pattern3_0); - return expr0_0; - } - if pattern0_0 == F64 { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 5014. - let expr0_0 = constructor_fpu_cmp64(ctx, pattern2_0, pattern3_0); - return expr0_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "fcmp_reg", "src/isa/s390x/inst.isle line 5012" - ); -} - -// Generated as internal constructor for term vecop_float_cmpeq. -pub fn constructor_vecop_float_cmpeq(ctx: &mut C, arg0: Type) -> VecFloatCmpOp { - let pattern0_0 = arg0; - if let Some((pattern1_0, pattern1_1)) = C::multi_lane(ctx, pattern0_0) { - if pattern1_0 == 32i128 as u32 { - if pattern1_1 == 4i128 as u32 { - // Rule at src/isa/s390x/inst.isle line 5020. - let expr0_0 = VecFloatCmpOp::CmpEq32x4; - return expr0_0; - } - } - if pattern1_0 == 64i128 as u32 { - if pattern1_1 == 2i128 as u32 { - // Rule at src/isa/s390x/inst.isle line 5021. - let expr0_0 = VecFloatCmpOp::CmpEq64x2; - return expr0_0; - } - } - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "vecop_float_cmpeq", "src/isa/s390x/inst.isle line 5019" - ); -} - -// Generated as internal constructor for term vec_fcmpeq. -pub fn constructor_vec_fcmpeq(ctx: &mut C, arg0: Type, arg1: Reg, arg2: Reg) -> Reg { - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::ty_vec128(ctx, pattern0_0) { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 5024. - let expr0_0 = constructor_vecop_float_cmpeq(ctx, pattern1_0); - let expr1_0 = constructor_vec_float_cmp(ctx, pattern1_0, &expr0_0, pattern2_0, pattern3_0); - return expr1_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "vec_fcmpeq", "src/isa/s390x/inst.isle line 5023" - ); -} - -// Generated as internal constructor for term vec_fcmpeqs. -pub fn constructor_vec_fcmpeqs( - ctx: &mut C, - arg0: Type, - arg1: Reg, - arg2: Reg, -) -> ProducesFlags { - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::ty_vec128(ctx, pattern0_0) { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 5026. - let expr0_0 = constructor_vecop_float_cmpeq(ctx, pattern1_0); - let expr1_0 = constructor_vec_float_cmps(ctx, pattern1_0, &expr0_0, pattern2_0, pattern3_0); - return expr1_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "vec_fcmpeqs", "src/isa/s390x/inst.isle line 5025" - ); -} - -// Generated as internal constructor for term vecop_float_cmph. -pub fn constructor_vecop_float_cmph(ctx: &mut C, arg0: Type) -> VecFloatCmpOp { - let pattern0_0 = arg0; - if let Some((pattern1_0, pattern1_1)) = C::multi_lane(ctx, pattern0_0) { - if pattern1_0 == 32i128 as u32 { - if pattern1_1 == 4i128 as u32 { - // Rule at src/isa/s390x/inst.isle line 5029. - let expr0_0 = VecFloatCmpOp::CmpHi32x4; - return expr0_0; - } - } - if pattern1_0 == 64i128 as u32 { - if pattern1_1 == 2i128 as u32 { - // Rule at src/isa/s390x/inst.isle line 5030. - let expr0_0 = VecFloatCmpOp::CmpHi64x2; - return expr0_0; - } - } - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "vecop_float_cmph", "src/isa/s390x/inst.isle line 5028" - ); -} - -// Generated as internal constructor for term vec_fcmph. -pub fn constructor_vec_fcmph(ctx: &mut C, arg0: Type, arg1: Reg, arg2: Reg) -> Reg { - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::ty_vec128(ctx, pattern0_0) { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 5033. - let expr0_0 = constructor_vecop_float_cmph(ctx, pattern1_0); - let expr1_0 = constructor_vec_float_cmp(ctx, pattern1_0, &expr0_0, pattern2_0, pattern3_0); - return expr1_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "vec_fcmph", "src/isa/s390x/inst.isle line 5032" - ); -} - -// Generated as internal constructor for term vec_fcmphs. -pub fn constructor_vec_fcmphs( - ctx: &mut C, - arg0: Type, - arg1: Reg, - arg2: Reg, -) -> ProducesFlags { - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::ty_vec128(ctx, pattern0_0) { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 5035. - let expr0_0 = constructor_vecop_float_cmph(ctx, pattern1_0); - let expr1_0 = constructor_vec_float_cmps(ctx, pattern1_0, &expr0_0, pattern2_0, pattern3_0); - return expr1_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "vec_fcmphs", "src/isa/s390x/inst.isle line 5034" - ); -} - -// Generated as internal constructor for term vecop_float_cmphe. -pub fn constructor_vecop_float_cmphe(ctx: &mut C, arg0: Type) -> VecFloatCmpOp { - let pattern0_0 = arg0; - if let Some((pattern1_0, pattern1_1)) = C::multi_lane(ctx, pattern0_0) { - if pattern1_0 == 32i128 as u32 { - if pattern1_1 == 4i128 as u32 { - // Rule at src/isa/s390x/inst.isle line 5038. - let expr0_0 = VecFloatCmpOp::CmpHiEq32x4; - return expr0_0; - } - } - if pattern1_0 == 64i128 as u32 { - if pattern1_1 == 2i128 as u32 { - // Rule at src/isa/s390x/inst.isle line 5039. - let expr0_0 = VecFloatCmpOp::CmpHiEq64x2; - return expr0_0; - } - } - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "vecop_float_cmphe", "src/isa/s390x/inst.isle line 5037" - ); -} - -// Generated as internal constructor for term vec_fcmphe. -pub fn constructor_vec_fcmphe(ctx: &mut C, arg0: Type, arg1: Reg, arg2: Reg) -> Reg { - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::ty_vec128(ctx, pattern0_0) { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 5042. - let expr0_0 = constructor_vecop_float_cmphe(ctx, pattern1_0); - let expr1_0 = constructor_vec_float_cmp(ctx, pattern1_0, &expr0_0, pattern2_0, pattern3_0); - return expr1_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "vec_fcmphe", "src/isa/s390x/inst.isle line 5041" - ); -} - -// Generated as internal constructor for term vec_fcmphes. -pub fn constructor_vec_fcmphes( - ctx: &mut C, - arg0: Type, - arg1: Reg, - arg2: Reg, -) -> ProducesFlags { - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::ty_vec128(ctx, pattern0_0) { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - // Rule at src/isa/s390x/inst.isle line 5044. - let expr0_0 = constructor_vecop_float_cmphe(ctx, pattern1_0); - let expr1_0 = constructor_vec_float_cmps(ctx, pattern1_0, &expr0_0, pattern2_0, pattern3_0); - return expr1_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "vec_fcmphes", "src/isa/s390x/inst.isle line 5043" - ); -} - -// Generated as internal constructor for term lower. -pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::first_result(ctx, pattern0_0) { - let pattern2_0 = C::value_type(ctx, pattern1_0); - if let Some(pattern3_0) = C::fits_in_64(ctx, pattern2_0) { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Binary { - opcode: ref pattern5_0, - args: ref pattern5_1, - } = &pattern4_0 - { - match pattern5_0 { - &Opcode::Iadd => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - if let Some(pattern8_0) = C::def_inst(ctx, pattern7_0) { - let pattern9_0 = C::inst_data(ctx, pattern8_0); - if let &InstructionData::Unary { - opcode: ref pattern10_0, - arg: pattern10_1, - } = &pattern9_0 - { - if let &Opcode::Sextend = pattern10_0 { - let pattern12_0 = C::value_type(ctx, pattern10_1); - if pattern12_0 == I32 { - // Rule at src/isa/s390x/lower.isle line 73. - let expr0_0 = C::put_in_reg(ctx, pattern7_1); - let expr1_0 = C::put_in_reg(ctx, pattern10_1); - let expr2_0 = constructor_add_reg_sext32( - ctx, pattern3_0, expr0_0, expr1_0, - ); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - } - } - } - } - &Opcode::Imul => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - if let Some(pattern8_0) = C::def_inst(ctx, pattern7_0) { - let pattern9_0 = C::inst_data(ctx, pattern8_0); - if let &InstructionData::Unary { - opcode: ref pattern10_0, - arg: pattern10_1, - } = &pattern9_0 - { - if let &Opcode::Sextend = pattern10_0 { - let pattern12_0 = C::value_type(ctx, pattern10_1); - if pattern12_0 == I32 { - // Rule at src/isa/s390x/lower.isle line 283. - let expr0_0 = C::put_in_reg(ctx, pattern7_1); - let expr1_0 = C::put_in_reg(ctx, pattern10_1); - let expr2_0 = constructor_mul_reg_sext32( - ctx, pattern3_0, expr0_0, expr1_0, - ); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - } - } - } - } - _ => {} - } - } - } - } - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::first_result(ctx, pattern0_0) { - let pattern2_0 = C::value_type(ctx, pattern1_0); - if let Some(pattern3_0) = C::fits_in_64(ctx, pattern2_0) { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Binary { - opcode: ref pattern5_0, - args: ref pattern5_1, - } = &pattern4_0 - { - match pattern5_0 { - &Opcode::Iadd => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - if let Some(pattern8_0) = C::i16_from_value(ctx, pattern7_0) { - // Rule at src/isa/s390x/lower.isle line 79. - let expr0_0 = C::put_in_reg(ctx, pattern7_1); - let expr1_0 = - constructor_add_simm16(ctx, pattern3_0, expr0_0, pattern8_0); - let expr2_0 = constructor_output_reg(ctx, expr1_0); - return Some(expr2_0); - } - } - &Opcode::Imul => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - if let Some(pattern8_0) = C::i16_from_value(ctx, pattern7_0) { - // Rule at src/isa/s390x/lower.isle line 289. - let expr0_0 = C::put_in_reg(ctx, pattern7_1); - let expr1_0 = - constructor_mul_simm16(ctx, pattern3_0, expr0_0, pattern8_0); - let expr2_0 = constructor_output_reg(ctx, expr1_0); - return Some(expr2_0); - } - } - _ => {} - } - } - } - } - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::first_result(ctx, pattern0_0) { - let pattern2_0 = C::value_type(ctx, pattern1_0); - if let Some(pattern3_0) = C::fits_in_64(ctx, pattern2_0) { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Binary { - opcode: ref pattern5_0, - args: ref pattern5_1, - } = &pattern4_0 - { - match pattern5_0 { - &Opcode::Iadd => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - if let Some(pattern8_0) = C::i32_from_value(ctx, pattern7_0) { - // Rule at src/isa/s390x/lower.isle line 83. - let expr0_0 = C::put_in_reg(ctx, pattern7_1); - let expr1_0 = - constructor_add_simm32(ctx, pattern3_0, expr0_0, pattern8_0); - let expr2_0 = constructor_output_reg(ctx, expr1_0); - return Some(expr2_0); - } - } - &Opcode::Imul => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - if let Some(pattern8_0) = C::i32_from_value(ctx, pattern7_0) { - // Rule at src/isa/s390x/lower.isle line 293. - let expr0_0 = C::put_in_reg(ctx, pattern7_1); - let expr1_0 = - constructor_mul_simm32(ctx, pattern3_0, expr0_0, pattern8_0); - let expr2_0 = constructor_output_reg(ctx, expr1_0); - return Some(expr2_0); - } - } - _ => {} - } - } - } - } - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::first_result(ctx, pattern0_0) { - let pattern2_0 = C::value_type(ctx, pattern1_0); - if let Some(pattern3_0) = C::fits_in_64(ctx, pattern2_0) { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Binary { - opcode: ref pattern5_0, - args: ref pattern5_1, - } = &pattern4_0 - { - match pattern5_0 { - &Opcode::Iadd => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - let pattern8_0 = C::value_type(ctx, pattern7_0); - if let Some(pattern9_0) = C::ty_32_or_64(ctx, pattern8_0) { - if let Some(pattern10_0) = C::sinkable_inst(ctx, pattern7_0) { - let pattern11_0 = C::inst_data(ctx, pattern10_0); - if let &InstructionData::Load { - opcode: ref pattern12_0, - arg: pattern12_1, - flags: pattern12_2, - offset: pattern12_3, - } = &pattern11_0 - { - if let &Opcode::Load = pattern12_0 { - if let Some(()) = C::bigendian(ctx, pattern12_2) { - // Rule at src/isa/s390x/lower.isle line 89. - let expr0_0 = C::put_in_reg(ctx, pattern7_1); - let expr1_0 = constructor_sink_load(ctx, pattern10_0); - let expr2_0 = constructor_add_mem( - ctx, pattern3_0, expr0_0, &expr1_0, - ); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - } - } - } - } - } - &Opcode::Imul => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - let pattern8_0 = C::value_type(ctx, pattern7_0); - if let Some(pattern9_0) = C::ty_32_or_64(ctx, pattern8_0) { - if let Some(pattern10_0) = C::sinkable_inst(ctx, pattern7_0) { - let pattern11_0 = C::inst_data(ctx, pattern10_0); - if let &InstructionData::Load { - opcode: ref pattern12_0, - arg: pattern12_1, - flags: pattern12_2, - offset: pattern12_3, - } = &pattern11_0 - { - if let &Opcode::Load = pattern12_0 { - if let Some(()) = C::bigendian(ctx, pattern12_2) { - // Rule at src/isa/s390x/lower.isle line 299. - let expr0_0 = C::put_in_reg(ctx, pattern7_1); - let expr1_0 = constructor_sink_load(ctx, pattern10_0); - let expr2_0 = constructor_mul_mem( - ctx, pattern3_0, expr0_0, &expr1_0, - ); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - } - } - } - } - } - _ => {} - } - } - } - } - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::first_result(ctx, pattern0_0) { - let pattern2_0 = C::value_type(ctx, pattern1_0); - if let Some(pattern3_0) = C::fits_in_64(ctx, pattern2_0) { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Binary { - opcode: ref pattern5_0, - args: ref pattern5_1, - } = &pattern4_0 - { - match pattern5_0 { - &Opcode::Iadd => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - let pattern8_0 = C::value_type(ctx, pattern7_0); - if pattern8_0 == I16 { - if let Some(pattern10_0) = C::sinkable_inst(ctx, pattern7_0) { - let pattern11_0 = C::inst_data(ctx, pattern10_0); - if let &InstructionData::Load { - opcode: ref pattern12_0, - arg: pattern12_1, - flags: pattern12_2, - offset: pattern12_3, - } = &pattern11_0 - { - if let &Opcode::Load = pattern12_0 { - if let Some(()) = C::bigendian(ctx, pattern12_2) { - // Rule at src/isa/s390x/lower.isle line 95. - let expr0_0 = C::put_in_reg(ctx, pattern7_1); - let expr1_0 = constructor_sink_load(ctx, pattern10_0); - let expr2_0 = constructor_add_mem_sext16( - ctx, pattern3_0, expr0_0, &expr1_0, - ); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - } - } - } - } - } - &Opcode::Imul => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - let pattern8_0 = C::value_type(ctx, pattern7_0); - if pattern8_0 == I16 { - if let Some(pattern10_0) = C::sinkable_inst(ctx, pattern7_0) { - let pattern11_0 = C::inst_data(ctx, pattern10_0); - if let &InstructionData::Load { - opcode: ref pattern12_0, - arg: pattern12_1, - flags: pattern12_2, - offset: pattern12_3, - } = &pattern11_0 - { - if let &Opcode::Load = pattern12_0 { - if let Some(()) = C::bigendian(ctx, pattern12_2) { - // Rule at src/isa/s390x/lower.isle line 305. - let expr0_0 = C::put_in_reg(ctx, pattern7_1); - let expr1_0 = constructor_sink_load(ctx, pattern10_0); - let expr2_0 = constructor_mul_mem_sext16( - ctx, pattern3_0, expr0_0, &expr1_0, - ); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - } - } - } - } - } - _ => {} - } - } - } - } - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::first_result(ctx, pattern0_0) { - let pattern2_0 = C::value_type(ctx, pattern1_0); - if let Some(pattern3_0) = C::fits_in_64(ctx, pattern2_0) { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Binary { - opcode: ref pattern5_0, - args: ref pattern5_1, - } = &pattern4_0 - { - match pattern5_0 { - &Opcode::Iadd => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - if let Some(pattern8_0) = C::sinkable_inst(ctx, pattern7_0) { - let pattern9_0 = C::inst_data(ctx, pattern8_0); - if let &InstructionData::Load { - opcode: ref pattern10_0, - arg: pattern10_1, - flags: pattern10_2, - offset: pattern10_3, - } = &pattern9_0 - { - if let &Opcode::Sload16 = pattern10_0 { - if let Some(()) = C::bigendian(ctx, pattern10_2) { - // Rule at src/isa/s390x/lower.isle line 101. - let expr0_0 = C::put_in_reg(ctx, pattern7_1); - let expr1_0 = constructor_sink_sload16(ctx, pattern8_0); - let expr2_0 = constructor_add_mem_sext16( - ctx, pattern3_0, expr0_0, &expr1_0, - ); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - } - } - } - } - &Opcode::Imul => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - if let Some(pattern8_0) = C::sinkable_inst(ctx, pattern7_0) { - let pattern9_0 = C::inst_data(ctx, pattern8_0); - if let &InstructionData::Load { - opcode: ref pattern10_0, - arg: pattern10_1, - flags: pattern10_2, - offset: pattern10_3, - } = &pattern9_0 - { - if let &Opcode::Sload16 = pattern10_0 { - if let Some(()) = C::bigendian(ctx, pattern10_2) { - // Rule at src/isa/s390x/lower.isle line 311. - let expr0_0 = C::put_in_reg(ctx, pattern7_1); - let expr1_0 = constructor_sink_sload16(ctx, pattern8_0); - let expr2_0 = constructor_mul_mem_sext16( - ctx, pattern3_0, expr0_0, &expr1_0, - ); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - } - } - } - } - _ => {} - } - } - } - } - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::first_result(ctx, pattern0_0) { - let pattern2_0 = C::value_type(ctx, pattern1_0); - if let Some(pattern3_0) = C::fits_in_64(ctx, pattern2_0) { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Binary { - opcode: ref pattern5_0, - args: ref pattern5_1, - } = &pattern4_0 - { - match pattern5_0 { - &Opcode::Iadd => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - if let Some(pattern8_0) = C::sinkable_inst(ctx, pattern7_0) { - let pattern9_0 = C::inst_data(ctx, pattern8_0); - if let &InstructionData::Load { - opcode: ref pattern10_0, - arg: pattern10_1, - flags: pattern10_2, - offset: pattern10_3, - } = &pattern9_0 - { - if let &Opcode::Sload32 = pattern10_0 { - if let Some(()) = C::bigendian(ctx, pattern10_2) { - // Rule at src/isa/s390x/lower.isle line 105. - let expr0_0 = C::put_in_reg(ctx, pattern7_1); - let expr1_0 = constructor_sink_sload32(ctx, pattern8_0); - let expr2_0 = constructor_add_mem_sext32( - ctx, pattern3_0, expr0_0, &expr1_0, - ); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - } - } - } - } - &Opcode::Imul => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - if let Some(pattern8_0) = C::sinkable_inst(ctx, pattern7_0) { - let pattern9_0 = C::inst_data(ctx, pattern8_0); - if let &InstructionData::Load { - opcode: ref pattern10_0, - arg: pattern10_1, - flags: pattern10_2, - offset: pattern10_3, - } = &pattern9_0 - { - if let &Opcode::Sload32 = pattern10_0 { - if let Some(()) = C::bigendian(ctx, pattern10_2) { - // Rule at src/isa/s390x/lower.isle line 315. - let expr0_0 = C::put_in_reg(ctx, pattern7_1); - let expr1_0 = constructor_sink_sload32(ctx, pattern8_0); - let expr2_0 = constructor_mul_mem_sext32( - ctx, pattern3_0, expr0_0, &expr1_0, - ); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - } - } - } - } - _ => {} - } - } - } - } - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::first_result(ctx, pattern0_0) { - let pattern2_0 = C::value_type(ctx, pattern1_0); - if let Some(pattern3_0) = C::fits_in_64(ctx, pattern2_0) { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - match &pattern4_0 { - &InstructionData::Binary { - opcode: ref pattern5_0, - args: ref pattern5_1, - } => { - match pattern5_0 { - &Opcode::Iadd => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - if let Some(pattern8_0) = C::def_inst(ctx, pattern7_1) { - let pattern9_0 = C::inst_data(ctx, pattern8_0); - if let &InstructionData::Unary { - opcode: ref pattern10_0, - arg: pattern10_1, - } = &pattern9_0 - { - if let &Opcode::Sextend = pattern10_0 { - let pattern12_0 = C::value_type(ctx, pattern10_1); - if pattern12_0 == I32 { - // Rule at src/isa/s390x/lower.isle line 71. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = C::put_in_reg(ctx, pattern10_1); - let expr2_0 = constructor_add_reg_sext32( - ctx, pattern3_0, expr0_0, expr1_0, - ); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - } - } - } - } - &Opcode::Isub => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - if let Some(pattern8_0) = C::def_inst(ctx, pattern7_1) { - let pattern9_0 = C::inst_data(ctx, pattern8_0); - if let &InstructionData::Unary { - opcode: ref pattern10_0, - arg: pattern10_1, - } = &pattern9_0 - { - if let &Opcode::Sextend = pattern10_0 { - let pattern12_0 = C::value_type(ctx, pattern10_1); - if pattern12_0 == I32 { - // Rule at src/isa/s390x/lower.isle line 149. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = C::put_in_reg(ctx, pattern10_1); - let expr2_0 = constructor_sub_reg_sext32( - ctx, pattern3_0, expr0_0, expr1_0, - ); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - } - } - } - } - &Opcode::Imul => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - if let Some(pattern8_0) = C::def_inst(ctx, pattern7_1) { - let pattern9_0 = C::inst_data(ctx, pattern8_0); - if let &InstructionData::Unary { - opcode: ref pattern10_0, - arg: pattern10_1, - } = &pattern9_0 - { - if let &Opcode::Sextend = pattern10_0 { - let pattern12_0 = C::value_type(ctx, pattern10_1); - if pattern12_0 == I32 { - // Rule at src/isa/s390x/lower.isle line 281. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = C::put_in_reg(ctx, pattern10_1); - let expr2_0 = constructor_mul_reg_sext32( - ctx, pattern3_0, expr0_0, expr1_0, - ); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - } - } - } - } - _ => {} - } - } - &InstructionData::IntAddTrap { - opcode: ref pattern5_0, - args: ref pattern5_1, - code: ref pattern5_2, - } => { - if let &Opcode::UaddOverflowTrap = pattern5_0 { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - if let Some(pattern8_0) = C::def_inst(ctx, pattern7_0) { - let pattern9_0 = C::inst_data(ctx, pattern8_0); - if let &InstructionData::Unary { - opcode: ref pattern10_0, - arg: pattern10_1, - } = &pattern9_0 - { - if let &Opcode::Uextend = pattern10_0 { - let pattern12_0 = C::value_type(ctx, pattern10_1); - if pattern12_0 == I32 { - // Rule at src/isa/s390x/lower.isle line 3837. - let expr0_0 = C::put_in_reg(ctx, pattern7_1); - let expr1_0 = C::put_in_reg(ctx, pattern10_1); - let expr2_0 = - constructor_add_logical_reg_zext32_with_flags_paired( - ctx, pattern3_0, expr0_0, expr1_0, - ); - let expr3_0: u8 = 3i128 as u8; - let expr4_0 = C::mask_as_cond(ctx, expr3_0); - let expr5_0 = - constructor_trap_if_impl(ctx, &expr4_0, pattern5_2); - let expr6_0 = - constructor_with_flags(ctx, &expr2_0, &expr5_0); - let expr7_0 = C::output(ctx, expr6_0); - return Some(expr7_0); - } - } - } - } - } - } - _ => {} - } - } - } - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::first_result(ctx, pattern0_0) { - let pattern2_0 = C::value_type(ctx, pattern1_0); - if let Some(pattern3_0) = C::fits_in_64(ctx, pattern2_0) { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - match &pattern4_0 { - &InstructionData::Binary { - opcode: ref pattern5_0, - args: ref pattern5_1, - } => { - match pattern5_0 { - &Opcode::Iadd => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - if let Some(pattern8_0) = C::i16_from_value(ctx, pattern7_1) { - // Rule at src/isa/s390x/lower.isle line 77. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = - constructor_add_simm16(ctx, pattern3_0, expr0_0, pattern8_0); - let expr2_0 = constructor_output_reg(ctx, expr1_0); - return Some(expr2_0); - } - } - &Opcode::Isub => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - if let Some(pattern8_0) = C::i16_from_negated_value(ctx, pattern7_1) { - // Rule at src/isa/s390x/lower.isle line 153. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = - constructor_add_simm16(ctx, pattern3_0, expr0_0, pattern8_0); - let expr2_0 = constructor_output_reg(ctx, expr1_0); - return Some(expr2_0); - } - } - &Opcode::Imul => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - if let Some(pattern8_0) = C::i16_from_value(ctx, pattern7_1) { - // Rule at src/isa/s390x/lower.isle line 287. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = - constructor_mul_simm16(ctx, pattern3_0, expr0_0, pattern8_0); - let expr2_0 = constructor_output_reg(ctx, expr1_0); - return Some(expr2_0); - } - } - _ => {} - } - } - &InstructionData::IntAddTrap { - opcode: ref pattern5_0, - args: ref pattern5_1, - code: ref pattern5_2, - } => { - if let &Opcode::UaddOverflowTrap = pattern5_0 { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - if let Some(pattern8_0) = C::u32_from_value(ctx, pattern7_0) { - // Rule at src/isa/s390x/lower.isle line 3849. - let expr0_0 = C::put_in_reg(ctx, pattern7_1); - let expr1_0 = constructor_add_logical_zimm32_with_flags_paired( - ctx, pattern3_0, expr0_0, pattern8_0, - ); - let expr2_0: u8 = 3i128 as u8; - let expr3_0 = C::mask_as_cond(ctx, expr2_0); - let expr4_0 = constructor_trap_if_impl(ctx, &expr3_0, pattern5_2); - let expr5_0 = constructor_with_flags(ctx, &expr1_0, &expr4_0); - let expr6_0 = C::output(ctx, expr5_0); - return Some(expr6_0); - } - } - } - _ => {} - } - } - } - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::first_result(ctx, pattern0_0) { - let pattern2_0 = C::value_type(ctx, pattern1_0); - if pattern2_0 == I128 { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Binary { - opcode: ref pattern5_0, - args: ref pattern5_1, - } = &pattern4_0 - { - match pattern5_0 { - &Opcode::Rotl => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/s390x/lower.isle line 784. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = constructor_amt_vr(ctx, pattern7_1); - let expr2_0: Type = I8X16; - let expr3_0 = constructor_vec_neg(ctx, expr2_0, expr1_0); - let expr4_0: Type = I128; - let expr5_0 = constructor_vec_lshl_by_byte(ctx, expr0_0, expr1_0); - let expr6_0 = constructor_vec_lshl_by_bit(ctx, expr5_0, expr1_0); - let expr7_0 = constructor_vec_lshr_by_byte(ctx, expr0_0, expr3_0); - let expr8_0 = constructor_vec_lshr_by_bit(ctx, expr7_0, expr3_0); - let expr9_0 = constructor_vec_or(ctx, expr4_0, expr6_0, expr8_0); - let expr10_0 = constructor_output_reg(ctx, expr9_0); - return Some(expr10_0); - } - &Opcode::Rotr => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/s390x/lower.isle line 844. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = constructor_amt_vr(ctx, pattern7_1); - let expr2_0: Type = I8X16; - let expr3_0 = constructor_vec_neg(ctx, expr2_0, expr1_0); - let expr4_0: Type = I128; - let expr5_0 = constructor_vec_lshl_by_byte(ctx, expr0_0, expr3_0); - let expr6_0 = constructor_vec_lshl_by_bit(ctx, expr5_0, expr3_0); - let expr7_0 = constructor_vec_lshr_by_byte(ctx, expr0_0, expr1_0); - let expr8_0 = constructor_vec_lshr_by_bit(ctx, expr7_0, expr1_0); - let expr9_0 = constructor_vec_or(ctx, expr4_0, expr6_0, expr8_0); - let expr10_0 = constructor_output_reg(ctx, expr9_0); - return Some(expr10_0); - } - _ => {} - } - } - } - if let Some(pattern3_0) = C::fits_in_64(ctx, pattern2_0) { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - match &pattern4_0 { - &InstructionData::Binary { - opcode: ref pattern5_0, - args: ref pattern5_1, - } => { - match pattern5_0 { - &Opcode::Iadd => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - if let Some(pattern8_0) = C::i32_from_value(ctx, pattern7_1) { - // Rule at src/isa/s390x/lower.isle line 81. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = - constructor_add_simm32(ctx, pattern3_0, expr0_0, pattern8_0); - let expr2_0 = constructor_output_reg(ctx, expr1_0); - return Some(expr2_0); - } - } - &Opcode::Isub => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - if let Some(pattern8_0) = C::i32_from_negated_value(ctx, pattern7_1) { - // Rule at src/isa/s390x/lower.isle line 155. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = - constructor_add_simm32(ctx, pattern3_0, expr0_0, pattern8_0); - let expr2_0 = constructor_output_reg(ctx, expr1_0); - return Some(expr2_0); - } - } - &Opcode::Imul => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - if let Some(pattern8_0) = C::i32_from_value(ctx, pattern7_1) { - // Rule at src/isa/s390x/lower.isle line 291. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = - constructor_mul_simm32(ctx, pattern3_0, expr0_0, pattern8_0); - let expr2_0 = constructor_output_reg(ctx, expr1_0); - return Some(expr2_0); - } - } - &Opcode::Band => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - if let Some(pattern8_0) = - C::uimm16shifted_from_inverted_value(ctx, pattern7_0) - { - // Rule at src/isa/s390x/lower.isle line 969. - let expr0_0 = C::put_in_reg(ctx, pattern7_1); - let expr1_0 = constructor_and_uimm16shifted( - ctx, pattern3_0, expr0_0, pattern8_0, - ); - let expr2_0 = constructor_output_reg(ctx, expr1_0); - return Some(expr2_0); - } - } - &Opcode::Bor => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - if let Some(pattern8_0) = C::uimm16shifted_from_value(ctx, pattern7_0) { - // Rule at src/isa/s390x/lower.isle line 995. - let expr0_0 = C::put_in_reg(ctx, pattern7_1); - let expr1_0 = constructor_or_uimm16shifted( - ctx, pattern3_0, expr0_0, pattern8_0, - ); - let expr2_0 = constructor_output_reg(ctx, expr1_0); - return Some(expr2_0); - } - } - _ => {} - } - } - &InstructionData::IntAddTrap { - opcode: ref pattern5_0, - args: ref pattern5_1, - code: ref pattern5_2, - } => { - if let &Opcode::UaddOverflowTrap = pattern5_0 { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - let pattern8_0 = C::value_type(ctx, pattern7_0); - if let Some(pattern9_0) = C::ty_32_or_64(ctx, pattern8_0) { - if let Some(pattern10_0) = C::sinkable_inst(ctx, pattern7_0) { - let pattern11_0 = C::inst_data(ctx, pattern10_0); - if let &InstructionData::Load { - opcode: ref pattern12_0, - arg: pattern12_1, - flags: pattern12_2, - offset: pattern12_3, - } = &pattern11_0 - { - if let &Opcode::Load = pattern12_0 { - if let Some(()) = C::bigendian(ctx, pattern12_2) { - // Rule at src/isa/s390x/lower.isle line 3861. - let expr0_0 = C::put_in_reg(ctx, pattern7_1); - let expr1_0 = constructor_sink_load(ctx, pattern10_0); - let expr2_0 = - constructor_add_logical_mem_with_flags_paired( - ctx, pattern3_0, expr0_0, &expr1_0, - ); - let expr3_0: u8 = 3i128 as u8; - let expr4_0 = C::mask_as_cond(ctx, expr3_0); - let expr5_0 = - constructor_trap_if_impl(ctx, &expr4_0, pattern5_2); - let expr6_0 = - constructor_with_flags(ctx, &expr2_0, &expr5_0); - let expr7_0 = C::output(ctx, expr6_0); - return Some(expr7_0); - } - } - } - } - } - } - } - _ => {} - } - } - } - let pattern1_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Store { - opcode: ref pattern2_0, - args: ref pattern2_1, - flags: pattern2_2, - offset: pattern2_3, - } = &pattern1_0 - { - if let &Opcode::Store = pattern2_0 { - let (pattern4_0, pattern4_1) = C::unpack_value_array_2(ctx, pattern2_1); - if let Some(pattern5_0) = C::def_inst(ctx, pattern4_0) { - let pattern6_0 = C::inst_data(ctx, pattern5_0); - if let &InstructionData::BinaryImm8 { - opcode: ref pattern7_0, - arg: pattern7_1, - imm: pattern7_2, - } = &pattern6_0 - { - if let &Opcode::Extractlane = pattern7_0 { - let pattern9_0 = C::value_type(ctx, pattern7_1); - let pattern10_0 = C::u8_from_uimm8(ctx, pattern7_2); - if let Some(()) = C::bigendian(ctx, pattern2_2) { - // Rule at src/isa/s390x/lower.isle line 1873. - let expr0_0 = C::put_in_reg(ctx, pattern7_1); - let expr1_0 = - constructor_lower_address(ctx, pattern2_2, pattern4_1, pattern2_3); - let expr2_0 = C::be_lane_idx(ctx, pattern9_0, pattern10_0); - let expr3_0 = constructor_vec_store_lane( - ctx, pattern9_0, expr0_0, &expr1_0, expr2_0, - ); - let expr4_0 = constructor_side_effect(ctx, &expr3_0); - return Some(expr4_0); - } - } - } - } - } - } - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::first_result(ctx, pattern0_0) { - let pattern2_0 = C::value_type(ctx, pattern1_0); - if let Some((pattern3_0, pattern3_1)) = C::multi_lane(ctx, pattern2_0) { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::LoadNoOffset { - opcode: ref pattern5_0, - arg: pattern5_1, - flags: pattern5_2, - } = &pattern4_0 - { - if let &Opcode::Bitcast = pattern5_0 { - let pattern7_0 = C::value_type(ctx, pattern5_1); - if let Some((pattern8_0, pattern8_1)) = C::multi_lane(ctx, pattern7_0) { - if pattern8_0 == pattern3_0 { - if pattern8_1 == pattern3_1 { - // Rule at src/isa/s390x/lower.isle line 1726. - let expr0_0 = constructor_output_value(ctx, pattern5_1); - return Some(expr0_0); - } - } - } - } - } - } - if let Some(pattern3_0) = C::fits_in_64(ctx, pattern2_0) { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - match &pattern4_0 { - &InstructionData::Binary { - opcode: ref pattern5_0, - args: ref pattern5_1, - } => { - match pattern5_0 { - &Opcode::Iadd => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - let pattern8_0 = C::value_type(ctx, pattern7_1); - if let Some(pattern9_0) = C::ty_32_or_64(ctx, pattern8_0) { - if let Some(pattern10_0) = C::sinkable_inst(ctx, pattern7_1) { - let pattern11_0 = C::inst_data(ctx, pattern10_0); - if let &InstructionData::Load { - opcode: ref pattern12_0, - arg: pattern12_1, - flags: pattern12_2, - offset: pattern12_3, - } = &pattern11_0 - { - if let &Opcode::Load = pattern12_0 { - if let Some(()) = C::bigendian(ctx, pattern12_2) { - // Rule at src/isa/s390x/lower.isle line 87. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = - constructor_sink_load(ctx, pattern10_0); - let expr2_0 = constructor_add_mem( - ctx, pattern3_0, expr0_0, &expr1_0, - ); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - } - } - } - } - } - &Opcode::Isub => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - let pattern8_0 = C::value_type(ctx, pattern7_1); - if let Some(pattern9_0) = C::ty_32_or_64(ctx, pattern8_0) { - if let Some(pattern10_0) = C::sinkable_inst(ctx, pattern7_1) { - let pattern11_0 = C::inst_data(ctx, pattern10_0); - if let &InstructionData::Load { - opcode: ref pattern12_0, - arg: pattern12_1, - flags: pattern12_2, - offset: pattern12_3, - } = &pattern11_0 - { - if let &Opcode::Load = pattern12_0 { - if let Some(()) = C::bigendian(ctx, pattern12_2) { - // Rule at src/isa/s390x/lower.isle line 159. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = - constructor_sink_load(ctx, pattern10_0); - let expr2_0 = constructor_sub_mem( - ctx, pattern3_0, expr0_0, &expr1_0, - ); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - } - } - } - } - } - &Opcode::Imul => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - let pattern8_0 = C::value_type(ctx, pattern7_1); - if let Some(pattern9_0) = C::ty_32_or_64(ctx, pattern8_0) { - if let Some(pattern10_0) = C::sinkable_inst(ctx, pattern7_1) { - let pattern11_0 = C::inst_data(ctx, pattern10_0); - if let &InstructionData::Load { - opcode: ref pattern12_0, - arg: pattern12_1, - flags: pattern12_2, - offset: pattern12_3, - } = &pattern11_0 - { - if let &Opcode::Load = pattern12_0 { - if let Some(()) = C::bigendian(ctx, pattern12_2) { - // Rule at src/isa/s390x/lower.isle line 297. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = - constructor_sink_load(ctx, pattern10_0); - let expr2_0 = constructor_mul_mem( - ctx, pattern3_0, expr0_0, &expr1_0, - ); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - } - } - } - } - } - &Opcode::Band => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - if let Some(pattern8_0) = - C::uimm16shifted_from_inverted_value(ctx, pattern7_1) - { - // Rule at src/isa/s390x/lower.isle line 967. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = constructor_and_uimm16shifted( - ctx, pattern3_0, expr0_0, pattern8_0, - ); - let expr2_0 = constructor_output_reg(ctx, expr1_0); - return Some(expr2_0); - } - } - &Opcode::Bor => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - if let Some(pattern8_0) = C::uimm16shifted_from_value(ctx, pattern7_1) { - // Rule at src/isa/s390x/lower.isle line 993. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = constructor_or_uimm16shifted( - ctx, pattern3_0, expr0_0, pattern8_0, - ); - let expr2_0 = constructor_output_reg(ctx, expr1_0); - return Some(expr2_0); - } - } - _ => {} - } - } - &InstructionData::IntAddTrap { - opcode: ref pattern5_0, - args: ref pattern5_1, - code: ref pattern5_2, - } => { - if let &Opcode::UaddOverflowTrap = pattern5_0 { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - if let Some(pattern8_0) = C::sinkable_inst(ctx, pattern7_0) { - let pattern9_0 = C::inst_data(ctx, pattern8_0); - if let &InstructionData::Load { - opcode: ref pattern10_0, - arg: pattern10_1, - flags: pattern10_2, - offset: pattern10_3, - } = &pattern9_0 - { - if let &Opcode::Uload32 = pattern10_0 { - if let Some(()) = C::bigendian(ctx, pattern10_2) { - // Rule at src/isa/s390x/lower.isle line 3873. - let expr0_0 = C::put_in_reg(ctx, pattern7_1); - let expr1_0 = constructor_sink_uload32(ctx, pattern8_0); - let expr2_0 = - constructor_add_logical_mem_zext32_with_flags_paired( - ctx, pattern3_0, expr0_0, &expr1_0, - ); - let expr3_0: u8 = 3i128 as u8; - let expr4_0 = C::mask_as_cond(ctx, expr3_0); - let expr5_0 = - constructor_trap_if_impl(ctx, &expr4_0, pattern5_2); - let expr6_0 = - constructor_with_flags(ctx, &expr2_0, &expr5_0); - let expr7_0 = C::output(ctx, expr6_0); - return Some(expr7_0); - } - } - } - } - } - } - _ => {} - } - } - if let Some(pattern3_0) = C::ty_vec128(ctx, pattern2_0) { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Binary { - opcode: ref pattern5_0, - args: ref pattern5_1, - } = &pattern4_0 - { - match pattern5_0 { - &Opcode::Rotl => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - if let Some(pattern8_0) = C::i64_from_value(ctx, pattern7_1) { - // Rule at src/isa/s390x/lower.isle line 778. - let expr0_0 = C::mask_amt_imm(ctx, pattern3_0, pattern8_0); - let expr1_0 = C::put_in_reg(ctx, pattern7_0); - let expr2_0 = - constructor_vec_rot_imm(ctx, pattern3_0, expr1_0, expr0_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - } - &Opcode::Rotr => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - if let Some(pattern8_0) = C::i64_from_negated_value(ctx, pattern7_1) { - // Rule at src/isa/s390x/lower.isle line 838. - let expr0_0 = C::mask_amt_imm(ctx, pattern3_0, pattern8_0); - let expr1_0 = C::put_in_reg(ctx, pattern7_0); - let expr2_0 = - constructor_vec_rot_imm(ctx, pattern3_0, expr1_0, expr0_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - } - _ => {} - } - } - } - let pattern3_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Unary { - opcode: ref pattern4_0, - arg: pattern4_1, - } = &pattern3_0 - { - match pattern4_0 { - &Opcode::Splat => { - if let Some(pattern6_0) = C::sinkable_inst(ctx, pattern4_1) { - let pattern7_0 = C::inst_data(ctx, pattern6_0); - if let &InstructionData::Load { - opcode: ref pattern8_0, - arg: pattern8_1, - flags: pattern8_2, - offset: pattern8_3, - } = &pattern7_0 - { - if let &Opcode::Load = pattern8_0 { - if let Some(()) = C::littleendian(ctx, pattern8_2) { - // Rule at src/isa/s390x/lower.isle line 1942. - let expr0_0 = constructor_sink_load(ctx, pattern6_0); - let expr1_0 = constructor_vec_load_replicate_little( - ctx, pattern2_0, &expr0_0, - ); - let expr2_0 = constructor_output_reg(ctx, expr1_0); - return Some(expr2_0); - } - } - } - } - } - &Opcode::ScalarToVector => { - if let Some(pattern6_0) = C::sinkable_inst(ctx, pattern4_1) { - let pattern7_0 = C::inst_data(ctx, pattern6_0); - if let &InstructionData::Load { - opcode: ref pattern8_0, - arg: pattern8_1, - flags: pattern8_2, - offset: pattern8_3, - } = &pattern7_0 - { - if let &Opcode::Load = pattern8_0 { - if let Some(()) = C::littleendian(ctx, pattern8_2) { - // Rule at src/isa/s390x/lower.isle line 2003. - let expr0_0: u128 = 0i128 as u128; - let expr1_0 = constructor_vec_imm(ctx, pattern2_0, expr0_0); - let expr2_0 = constructor_sink_load(ctx, pattern6_0); - let expr3_0: u8 = 0i128 as u8; - let expr4_0 = C::be_lane_idx(ctx, pattern2_0, expr3_0); - let expr5_0 = constructor_vec_load_lane_little( - ctx, pattern2_0, expr1_0, &expr2_0, expr4_0, - ); - let expr6_0 = constructor_output_reg(ctx, expr5_0); - return Some(expr6_0); - } - } - } - } - } - _ => {} - } - } - } - let pattern1_0 = C::inst_data(ctx, pattern0_0); - match &pattern1_0 { - &InstructionData::Store { - opcode: ref pattern2_0, - args: ref pattern2_1, - flags: pattern2_2, - offset: pattern2_3, - } => { - if let &Opcode::Store = pattern2_0 { - let (pattern4_0, pattern4_1) = C::unpack_value_array_2(ctx, pattern2_1); - if let Some(pattern5_0) = C::def_inst(ctx, pattern4_0) { - let pattern6_0 = C::inst_data(ctx, pattern5_0); - if let &InstructionData::BinaryImm8 { - opcode: ref pattern7_0, - arg: pattern7_1, - imm: pattern7_2, - } = &pattern6_0 - { - if let &Opcode::Extractlane = pattern7_0 { - let pattern9_0 = C::value_type(ctx, pattern7_1); - let pattern10_0 = C::u8_from_uimm8(ctx, pattern7_2); - if let Some(()) = C::littleendian(ctx, pattern2_2) { - // Rule at src/isa/s390x/lower.isle line 1880. - let expr0_0 = C::put_in_reg(ctx, pattern7_1); - let expr1_0 = constructor_lower_address( - ctx, pattern2_2, pattern4_1, pattern2_3, - ); - let expr2_0 = C::be_lane_idx(ctx, pattern9_0, pattern10_0); - let expr3_0 = constructor_vec_store_lane_little( - ctx, pattern9_0, expr0_0, &expr1_0, expr2_0, - ); - let expr4_0 = constructor_side_effect(ctx, &expr3_0); - return Some(expr4_0); - } - } - } - } - } - } - &InstructionData::TernaryImm8 { - opcode: ref pattern2_0, - args: ref pattern2_1, - imm: pattern2_2, - } => { - if let &Opcode::Insertlane = pattern2_0 { - let (pattern4_0, pattern4_1) = C::unpack_value_array_2(ctx, pattern2_1); - let pattern5_0 = C::value_type(ctx, pattern4_0); - if let Some(pattern6_0) = C::sinkable_inst(ctx, pattern4_1) { - let pattern7_0 = C::inst_data(ctx, pattern6_0); - if let &InstructionData::Load { - opcode: ref pattern8_0, - arg: pattern8_1, - flags: pattern8_2, - offset: pattern8_3, - } = &pattern7_0 - { - if let &Opcode::Load = pattern8_0 { - if let Some(()) = C::littleendian(ctx, pattern8_2) { - let pattern11_0 = C::u8_from_uimm8(ctx, pattern2_2); - // Rule at src/isa/s390x/lower.isle line 1775. - let expr0_0 = C::put_in_reg(ctx, pattern4_0); - let expr1_0 = constructor_sink_load(ctx, pattern6_0); - let expr2_0 = C::be_lane_idx(ctx, pattern5_0, pattern11_0); - let expr3_0 = constructor_vec_load_lane_little( - ctx, pattern5_0, expr0_0, &expr1_0, expr2_0, - ); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - } - } - } - } - } - _ => {} - } - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::first_result(ctx, pattern0_0) { - let pattern2_0 = C::value_type(ctx, pattern1_0); - if pattern2_0 == I128 { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Binary { - opcode: ref pattern5_0, - args: ref pattern5_1, - } = &pattern4_0 - { - match pattern5_0 { - &Opcode::Ishl => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/s390x/lower.isle line 672. - let expr0_0 = constructor_amt_vr(ctx, pattern7_1); - let expr1_0 = C::put_in_reg(ctx, pattern7_0); - let expr2_0 = constructor_vec_lshl_by_byte(ctx, expr1_0, expr0_0); - let expr3_0 = constructor_vec_lshl_by_bit(ctx, expr2_0, expr0_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - &Opcode::Ushr => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/s390x/lower.isle line 703. - let expr0_0 = constructor_amt_vr(ctx, pattern7_1); - let expr1_0 = C::put_in_reg(ctx, pattern7_0); - let expr2_0 = constructor_vec_lshr_by_byte(ctx, expr1_0, expr0_0); - let expr3_0 = constructor_vec_lshr_by_bit(ctx, expr2_0, expr0_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - &Opcode::Sshr => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/s390x/lower.isle line 734. - let expr0_0 = constructor_amt_vr(ctx, pattern7_1); - let expr1_0 = C::put_in_reg(ctx, pattern7_0); - let expr2_0 = constructor_vec_ashr_by_byte(ctx, expr1_0, expr0_0); - let expr3_0 = constructor_vec_ashr_by_bit(ctx, expr2_0, expr0_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - _ => {} - } - } - } - if let Some(pattern3_0) = C::fits_in_64(ctx, pattern2_0) { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - match &pattern4_0 { - &InstructionData::Binary { - opcode: ref pattern5_0, - args: ref pattern5_1, - } => { - match pattern5_0 { - &Opcode::Iadd => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - let pattern8_0 = C::value_type(ctx, pattern7_1); - if pattern8_0 == I16 { - if let Some(pattern10_0) = C::sinkable_inst(ctx, pattern7_1) { - let pattern11_0 = C::inst_data(ctx, pattern10_0); - if let &InstructionData::Load { - opcode: ref pattern12_0, - arg: pattern12_1, - flags: pattern12_2, - offset: pattern12_3, - } = &pattern11_0 - { - if let &Opcode::Load = pattern12_0 { - if let Some(()) = C::bigendian(ctx, pattern12_2) { - // Rule at src/isa/s390x/lower.isle line 93. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = - constructor_sink_load(ctx, pattern10_0); - let expr2_0 = constructor_add_mem_sext16( - ctx, pattern3_0, expr0_0, &expr1_0, - ); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - } - } - } - } - } - &Opcode::Isub => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - let pattern8_0 = C::value_type(ctx, pattern7_1); - if pattern8_0 == I16 { - if let Some(pattern10_0) = C::sinkable_inst(ctx, pattern7_1) { - let pattern11_0 = C::inst_data(ctx, pattern10_0); - if let &InstructionData::Load { - opcode: ref pattern12_0, - arg: pattern12_1, - flags: pattern12_2, - offset: pattern12_3, - } = &pattern11_0 - { - if let &Opcode::Load = pattern12_0 { - if let Some(()) = C::bigendian(ctx, pattern12_2) { - // Rule at src/isa/s390x/lower.isle line 163. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = - constructor_sink_load(ctx, pattern10_0); - let expr2_0 = constructor_sub_mem_sext16( - ctx, pattern3_0, expr0_0, &expr1_0, - ); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - } - } - } - } - } - &Opcode::Imul => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - let pattern8_0 = C::value_type(ctx, pattern7_1); - if pattern8_0 == I16 { - if let Some(pattern10_0) = C::sinkable_inst(ctx, pattern7_1) { - let pattern11_0 = C::inst_data(ctx, pattern10_0); - if let &InstructionData::Load { - opcode: ref pattern12_0, - arg: pattern12_1, - flags: pattern12_2, - offset: pattern12_3, - } = &pattern11_0 - { - if let &Opcode::Load = pattern12_0 { - if let Some(()) = C::bigendian(ctx, pattern12_2) { - // Rule at src/isa/s390x/lower.isle line 303. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = - constructor_sink_load(ctx, pattern10_0); - let expr2_0 = constructor_mul_mem_sext16( - ctx, pattern3_0, expr0_0, &expr1_0, - ); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - } - } - } - } - } - &Opcode::Band => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - if let Some(pattern8_0) = - C::uimm32shifted_from_inverted_value(ctx, pattern7_0) - { - // Rule at src/isa/s390x/lower.isle line 973. - let expr0_0 = C::put_in_reg(ctx, pattern7_1); - let expr1_0 = constructor_and_uimm32shifted( - ctx, pattern3_0, expr0_0, pattern8_0, - ); - let expr2_0 = constructor_output_reg(ctx, expr1_0); - return Some(expr2_0); - } - } - &Opcode::Bor => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - if let Some(pattern8_0) = C::uimm32shifted_from_value(ctx, pattern7_0) { - // Rule at src/isa/s390x/lower.isle line 999. - let expr0_0 = C::put_in_reg(ctx, pattern7_1); - let expr1_0 = constructor_or_uimm32shifted( - ctx, pattern3_0, expr0_0, pattern8_0, - ); - let expr2_0 = constructor_output_reg(ctx, expr1_0); - return Some(expr2_0); - } - } - &Opcode::Bxor => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - if let Some(pattern8_0) = C::uimm32shifted_from_value(ctx, pattern7_0) { - // Rule at src/isa/s390x/lower.isle line 1022. - let expr0_0 = C::put_in_reg(ctx, pattern7_1); - let expr1_0 = constructor_xor_uimm32shifted( - ctx, pattern3_0, expr0_0, pattern8_0, - ); - let expr2_0 = constructor_output_reg(ctx, expr1_0); - return Some(expr2_0); - } - } - _ => {} - } - } - &InstructionData::IntAddTrap { - opcode: ref pattern5_0, - args: ref pattern5_1, - code: ref pattern5_2, - } => { - if let &Opcode::UaddOverflowTrap = pattern5_0 { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - if let Some(pattern8_0) = C::def_inst(ctx, pattern7_1) { - let pattern9_0 = C::inst_data(ctx, pattern8_0); - if let &InstructionData::Unary { - opcode: ref pattern10_0, - arg: pattern10_1, - } = &pattern9_0 - { - if let &Opcode::Uextend = pattern10_0 { - let pattern12_0 = C::value_type(ctx, pattern10_1); - if pattern12_0 == I32 { - // Rule at src/isa/s390x/lower.isle line 3832. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = C::put_in_reg(ctx, pattern10_1); - let expr2_0 = - constructor_add_logical_reg_zext32_with_flags_paired( - ctx, pattern3_0, expr0_0, expr1_0, - ); - let expr3_0: u8 = 3i128 as u8; - let expr4_0 = C::mask_as_cond(ctx, expr3_0); - let expr5_0 = - constructor_trap_if_impl(ctx, &expr4_0, pattern5_2); - let expr6_0 = - constructor_with_flags(ctx, &expr2_0, &expr5_0); - let expr7_0 = C::output(ctx, expr6_0); - return Some(expr7_0); - } - } - } - } - } - } - _ => {} - } - } - if let Some(pattern3_0) = C::ty_vec128(ctx, pattern2_0) { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Binary { - opcode: ref pattern5_0, - args: ref pattern5_1, - } = &pattern4_0 - { - match pattern5_0 { - &Opcode::Rotl => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/s390x/lower.isle line 774. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = constructor_amt_reg(ctx, pattern7_1); - let expr2_0 = constructor_vec_rot_reg(ctx, pattern3_0, expr0_0, expr1_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::Rotr => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/s390x/lower.isle line 832. - let expr0_0: Type = I32; - let expr1_0 = constructor_amt_reg(ctx, pattern7_1); - let expr2_0 = constructor_neg_reg(ctx, expr0_0, expr1_0); - let expr3_0 = C::put_in_reg(ctx, pattern7_0); - let expr4_0 = constructor_vec_rot_reg(ctx, pattern3_0, expr3_0, expr2_0); - let expr5_0 = constructor_output_reg(ctx, expr4_0); - return Some(expr5_0); - } - _ => {} - } - } - } - if let Some(pattern3_0) = C::gpr64_ty(ctx, pattern2_0) { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Load { - opcode: ref pattern5_0, - arg: pattern5_1, - flags: pattern5_2, - offset: pattern5_3, - } = &pattern4_0 - { - if let &Opcode::Uload16 = pattern5_0 { - if let Some(()) = C::bigendian(ctx, pattern5_2) { - // Rule at src/isa/s390x/lower.isle line 2467. - let expr0_0: Type = I16; - let expr1_0 = - constructor_lower_address(ctx, pattern5_2, pattern5_1, pattern5_3); - let expr2_0 = constructor_zext64_mem(ctx, expr0_0, &expr1_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - } - } - } - if let Some(pattern3_0) = C::vr128_ty(ctx, pattern2_0) { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - match &pattern4_0 { - &InstructionData::LoadNoOffset { - opcode: ref pattern5_0, - arg: pattern5_1, - flags: pattern5_2, - } => { - if let &Opcode::Bitcast = pattern5_0 { - let pattern7_0 = C::value_type(ctx, pattern5_1); - if let Some(pattern8_0) = C::vr128_ty(ctx, pattern7_0) { - // Rule at src/isa/s390x/lower.isle line 1736. - let expr0_0 = constructor_lane_order_from_memflags(ctx, pattern5_2); - let expr1_0 = constructor_lane_order_from_memflags(ctx, pattern5_2); - let expr2_0 = C::put_in_reg(ctx, pattern5_1); - let expr3_0 = - constructor_abi_vec_elt_rev(ctx, &expr1_0, pattern8_0, expr2_0); - let expr4_0 = - constructor_abi_vec_elt_rev(ctx, &expr0_0, pattern3_0, expr3_0); - let expr5_0 = constructor_output_reg(ctx, expr4_0); - return Some(expr5_0); - } - } - } - &InstructionData::Load { - opcode: ref pattern5_0, - arg: pattern5_1, - flags: pattern5_2, - offset: pattern5_3, - } => { - if let &Opcode::Load = pattern5_0 { - if let Some(()) = C::bigendian(ctx, pattern5_2) { - let mut closure8 = || { - let expr0_0 = C::lane_order(ctx); - return Some(expr0_0); - }; - if let Some(pattern8_0) = closure8() { - if let &LaneOrder::BigEndian = &pattern8_0 { - // Rule at src/isa/s390x/lower.isle line 2326. - let expr0_0 = constructor_lower_address( - ctx, pattern5_2, pattern5_1, pattern5_3, - ); - let expr1_0 = constructor_vec_load(ctx, pattern3_0, &expr0_0); - let expr2_0 = constructor_output_reg(ctx, expr1_0); - return Some(expr2_0); - } - } - } - } - } - _ => {} - } - } - let pattern3_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Unary { - opcode: ref pattern4_0, - arg: pattern4_1, - } = &pattern3_0 - { - match pattern4_0 { - &Opcode::Splat => { - if let Some(pattern6_0) = C::sinkable_inst(ctx, pattern4_1) { - let pattern7_0 = C::inst_data(ctx, pattern6_0); - if let &InstructionData::Load { - opcode: ref pattern8_0, - arg: pattern8_1, - flags: pattern8_2, - offset: pattern8_3, - } = &pattern7_0 - { - if let &Opcode::Load = pattern8_0 { - if let Some(()) = C::bigendian(ctx, pattern8_2) { - // Rule at src/isa/s390x/lower.isle line 1938. - let expr0_0 = constructor_sink_load(ctx, pattern6_0); - let expr1_0 = - constructor_vec_load_replicate(ctx, pattern2_0, &expr0_0); - let expr2_0 = constructor_output_reg(ctx, expr1_0); - return Some(expr2_0); - } - } - } - } - } - &Opcode::ScalarToVector => { - if let Some(pattern6_0) = C::sinkable_inst(ctx, pattern4_1) { - let pattern7_0 = C::inst_data(ctx, pattern6_0); - if let &InstructionData::Load { - opcode: ref pattern8_0, - arg: pattern8_1, - flags: pattern8_2, - offset: pattern8_3, - } = &pattern7_0 - { - if let &Opcode::Load = pattern8_0 { - if let Some(()) = C::bigendian(ctx, pattern8_2) { - // Rule at src/isa/s390x/lower.isle line 1999. - let expr0_0: u128 = 0i128 as u128; - let expr1_0 = constructor_vec_imm(ctx, pattern2_0, expr0_0); - let expr2_0 = constructor_sink_load(ctx, pattern6_0); - let expr3_0: u8 = 0i128 as u8; - let expr4_0 = C::be_lane_idx(ctx, pattern2_0, expr3_0); - let expr5_0 = constructor_vec_load_lane( - ctx, pattern2_0, expr1_0, &expr2_0, expr4_0, - ); - let expr6_0 = constructor_output_reg(ctx, expr5_0); - return Some(expr6_0); - } - } - } - } - } - _ => {} - } - } - } - let pattern1_0 = C::inst_data(ctx, pattern0_0); - match &pattern1_0 { - &InstructionData::Store { - opcode: ref pattern2_0, - args: ref pattern2_1, - flags: pattern2_2, - offset: pattern2_3, - } => { - if let &Opcode::Store = pattern2_0 { - let (pattern4_0, pattern4_1) = C::unpack_value_array_2(ctx, pattern2_1); - let pattern5_0 = C::value_type(ctx, pattern4_0); - if let Some(pattern6_0) = C::vr128_ty(ctx, pattern5_0) { - if let Some(()) = C::bigendian(ctx, pattern2_2) { - let mut closure8 = || { - let expr0_0 = C::lane_order(ctx); - return Some(expr0_0); - }; - if let Some(pattern8_0) = closure8() { - if let &LaneOrder::BigEndian = &pattern8_0 { - // Rule at src/isa/s390x/lower.isle line 2656. - let expr0_0 = C::put_in_reg(ctx, pattern4_0); - let expr1_0 = constructor_lower_address( - ctx, pattern2_2, pattern4_1, pattern2_3, - ); - let expr2_0 = constructor_vec_store(ctx, expr0_0, &expr1_0); - let expr3_0 = constructor_side_effect(ctx, &expr2_0); - return Some(expr3_0); - } - } - } - } - } - } - &InstructionData::TernaryImm8 { - opcode: ref pattern2_0, - args: ref pattern2_1, - imm: pattern2_2, - } => { - if let &Opcode::Insertlane = pattern2_0 { - let (pattern4_0, pattern4_1) = C::unpack_value_array_2(ctx, pattern2_1); - let pattern5_0 = C::value_type(ctx, pattern4_0); - if let Some(pattern6_0) = C::sinkable_inst(ctx, pattern4_1) { - let pattern7_0 = C::inst_data(ctx, pattern6_0); - if let &InstructionData::Load { - opcode: ref pattern8_0, - arg: pattern8_1, - flags: pattern8_2, - offset: pattern8_3, - } = &pattern7_0 - { - if let &Opcode::Load = pattern8_0 { - if let Some(()) = C::bigendian(ctx, pattern8_2) { - let pattern11_0 = C::u8_from_uimm8(ctx, pattern2_2); - // Rule at src/isa/s390x/lower.isle line 1770. - let expr0_0 = C::put_in_reg(ctx, pattern4_0); - let expr1_0 = constructor_sink_load(ctx, pattern6_0); - let expr2_0 = C::be_lane_idx(ctx, pattern5_0, pattern11_0); - let expr3_0 = constructor_vec_load_lane( - ctx, pattern5_0, expr0_0, &expr1_0, expr2_0, - ); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - } - } - } - } - } - _ => {} - } - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::first_result(ctx, pattern0_0) { - let pattern2_0 = C::value_type(ctx, pattern1_0); - if let Some(pattern3_0) = C::fits_in_64(ctx, pattern2_0) { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - match &pattern4_0 { - &InstructionData::Unary { - opcode: ref pattern5_0, - arg: pattern5_1, - } => { - match pattern5_0 { - &Opcode::Ineg => { - if let Some(pattern7_0) = C::def_inst(ctx, pattern5_1) { - let pattern8_0 = C::inst_data(ctx, pattern7_0); - if let &InstructionData::Unary { - opcode: ref pattern9_0, - arg: pattern9_1, - } = &pattern8_0 - { - if let &Opcode::Sextend = pattern9_0 { - let pattern11_0 = C::value_type(ctx, pattern9_1); - if pattern11_0 == I32 { - // Rule at src/isa/s390x/lower.isle line 227. - let expr0_0 = C::put_in_reg(ctx, pattern9_1); - let expr1_0 = constructor_neg_reg_sext32( - ctx, pattern3_0, expr0_0, - ); - let expr2_0 = constructor_output_reg(ctx, expr1_0); - return Some(expr2_0); - } - } - } - } - } - &Opcode::Iabs => { - if let Some(pattern7_0) = C::def_inst(ctx, pattern5_1) { - let pattern8_0 = C::inst_data(ctx, pattern7_0); - if let &InstructionData::Unary { - opcode: ref pattern9_0, - arg: pattern9_1, - } = &pattern8_0 - { - if let &Opcode::Sextend = pattern9_0 { - let pattern11_0 = C::value_type(ctx, pattern9_1); - if pattern11_0 == I32 { - // Rule at src/isa/s390x/lower.isle line 203. - let expr0_0 = C::put_in_reg(ctx, pattern9_1); - let expr1_0 = constructor_abs_reg_sext32( - ctx, pattern3_0, expr0_0, - ); - let expr2_0 = constructor_output_reg(ctx, expr1_0); - return Some(expr2_0); - } - } - } - } - } - _ => {} - } - } - &InstructionData::Binary { - opcode: ref pattern5_0, - args: ref pattern5_1, - } => { - match pattern5_0 { - &Opcode::Iadd => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - if let Some(pattern8_0) = C::sinkable_inst(ctx, pattern7_1) { - let pattern9_0 = C::inst_data(ctx, pattern8_0); - if let &InstructionData::Load { - opcode: ref pattern10_0, - arg: pattern10_1, - flags: pattern10_2, - offset: pattern10_3, - } = &pattern9_0 - { - if let &Opcode::Sload16 = pattern10_0 { - if let Some(()) = C::bigendian(ctx, pattern10_2) { - // Rule at src/isa/s390x/lower.isle line 99. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = constructor_sink_sload16(ctx, pattern8_0); - let expr2_0 = constructor_add_mem_sext16( - ctx, pattern3_0, expr0_0, &expr1_0, - ); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - } - } - } - } - &Opcode::Isub => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - if let Some(pattern8_0) = C::sinkable_inst(ctx, pattern7_1) { - let pattern9_0 = C::inst_data(ctx, pattern8_0); - if let &InstructionData::Load { - opcode: ref pattern10_0, - arg: pattern10_1, - flags: pattern10_2, - offset: pattern10_3, - } = &pattern9_0 - { - if let &Opcode::Sload16 = pattern10_0 { - if let Some(()) = C::bigendian(ctx, pattern10_2) { - // Rule at src/isa/s390x/lower.isle line 167. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = constructor_sink_sload16(ctx, pattern8_0); - let expr2_0 = constructor_sub_mem_sext16( - ctx, pattern3_0, expr0_0, &expr1_0, - ); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - } - } - } - } - &Opcode::Imul => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - if let Some(pattern8_0) = C::sinkable_inst(ctx, pattern7_1) { - let pattern9_0 = C::inst_data(ctx, pattern8_0); - if let &InstructionData::Load { - opcode: ref pattern10_0, - arg: pattern10_1, - flags: pattern10_2, - offset: pattern10_3, - } = &pattern9_0 - { - if let &Opcode::Sload16 = pattern10_0 { - if let Some(()) = C::bigendian(ctx, pattern10_2) { - // Rule at src/isa/s390x/lower.isle line 309. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = constructor_sink_sload16(ctx, pattern8_0); - let expr2_0 = constructor_mul_mem_sext16( - ctx, pattern3_0, expr0_0, &expr1_0, - ); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - } - } - } - } - &Opcode::Band => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - if let Some(pattern8_0) = - C::uimm32shifted_from_inverted_value(ctx, pattern7_1) - { - // Rule at src/isa/s390x/lower.isle line 971. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = constructor_and_uimm32shifted( - ctx, pattern3_0, expr0_0, pattern8_0, - ); - let expr2_0 = constructor_output_reg(ctx, expr1_0); - return Some(expr2_0); - } - } - &Opcode::Bor => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - if let Some(pattern8_0) = C::uimm32shifted_from_value(ctx, pattern7_1) { - // Rule at src/isa/s390x/lower.isle line 997. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = constructor_or_uimm32shifted( - ctx, pattern3_0, expr0_0, pattern8_0, - ); - let expr2_0 = constructor_output_reg(ctx, expr1_0); - return Some(expr2_0); - } - } - &Opcode::Bxor => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - if let Some(pattern8_0) = C::uimm32shifted_from_value(ctx, pattern7_1) { - // Rule at src/isa/s390x/lower.isle line 1020. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = constructor_xor_uimm32shifted( - ctx, pattern3_0, expr0_0, pattern8_0, - ); - let expr2_0 = constructor_output_reg(ctx, expr1_0); - return Some(expr2_0); - } - } - _ => {} - } - } - &InstructionData::IntAddTrap { - opcode: ref pattern5_0, - args: ref pattern5_1, - code: ref pattern5_2, - } => { - if let &Opcode::UaddOverflowTrap = pattern5_0 { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - if let Some(pattern8_0) = C::u32_from_value(ctx, pattern7_1) { - // Rule at src/isa/s390x/lower.isle line 3844. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = constructor_add_logical_zimm32_with_flags_paired( - ctx, pattern3_0, expr0_0, pattern8_0, - ); - let expr2_0: u8 = 3i128 as u8; - let expr3_0 = C::mask_as_cond(ctx, expr2_0); - let expr4_0 = constructor_trap_if_impl(ctx, &expr3_0, pattern5_2); - let expr5_0 = constructor_with_flags(ctx, &expr1_0, &expr4_0); - let expr6_0 = C::output(ctx, expr5_0); - return Some(expr6_0); - } - } - } - _ => {} - } - } - if let Some(pattern3_0) = C::ty_8_or_16(ctx, pattern2_0) { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Binary { - opcode: ref pattern5_0, - args: ref pattern5_1, - } = &pattern4_0 - { - match pattern5_0 { - &Opcode::Rotl => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - if let Some(pattern8_0) = C::i64_from_value(ctx, pattern7_1) { - if let Some(pattern9_0) = C::i64_from_negated_value(ctx, pattern7_1) { - // Rule at src/isa/s390x/lower.isle line 764. - let expr0_0 = constructor_put_in_reg_zext32(ctx, pattern7_0); - let expr1_0 = constructor_ty_ext32(ctx, pattern3_0); - let expr2_0 = C::mask_amt_imm(ctx, pattern3_0, pattern8_0); - let expr3_0 = C::mask_amt_imm(ctx, pattern3_0, pattern9_0); - let expr4_0 = constructor_lshl_imm(ctx, expr1_0, expr0_0, expr2_0); - let expr5_0 = constructor_lshr_imm(ctx, expr1_0, expr0_0, expr3_0); - let expr6_0 = constructor_or_reg(ctx, pattern3_0, expr4_0, expr5_0); - let expr7_0 = constructor_output_reg(ctx, expr6_0); - return Some(expr7_0); - } - } - } - &Opcode::Rotr => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - if let Some(pattern8_0) = C::i64_from_value(ctx, pattern7_1) { - if let Some(pattern9_0) = C::i64_from_negated_value(ctx, pattern7_1) { - // Rule at src/isa/s390x/lower.isle line 821. - let expr0_0 = constructor_put_in_reg_zext32(ctx, pattern7_0); - let expr1_0 = constructor_ty_ext32(ctx, pattern3_0); - let expr2_0 = C::mask_amt_imm(ctx, pattern3_0, pattern8_0); - let expr3_0 = C::mask_amt_imm(ctx, pattern3_0, pattern9_0); - let expr4_0 = constructor_lshl_imm(ctx, expr1_0, expr0_0, expr3_0); - let expr5_0 = constructor_lshr_imm(ctx, expr1_0, expr0_0, expr2_0); - let expr6_0 = constructor_or_reg(ctx, pattern3_0, expr4_0, expr5_0); - let expr7_0 = constructor_output_reg(ctx, expr6_0); - return Some(expr7_0); - } - } - } - _ => {} - } - } - } - if let Some(pattern3_0) = C::ty_scalar_float(ctx, pattern2_0) { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::LoadNoOffset { - opcode: ref pattern5_0, - arg: pattern5_1, - flags: pattern5_2, - } = &pattern4_0 - { - if let &Opcode::Bitcast = pattern5_0 { - let pattern7_0 = C::value_type(ctx, pattern5_1); - if let Some(pattern8_0) = C::ty_scalar_float(ctx, pattern7_0) { - // Rule at src/isa/s390x/lower.isle line 1722. - let expr0_0 = constructor_output_value(ctx, pattern5_1); - return Some(expr0_0); - } - } - } - } - if let Some(pattern3_0) = C::ty_vec128(ctx, pattern2_0) { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Binary { - opcode: ref pattern5_0, - args: ref pattern5_1, - } = &pattern4_0 - { - match pattern5_0 { - &Opcode::Ishl => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - if let Some(pattern8_0) = C::i64_from_value(ctx, pattern7_1) { - // Rule at src/isa/s390x/lower.isle line 667. - let expr0_0 = C::mask_amt_imm(ctx, pattern3_0, pattern8_0); - let expr1_0 = C::put_in_reg(ctx, pattern7_0); - let expr2_0 = - constructor_vec_lshl_imm(ctx, pattern3_0, expr1_0, expr0_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - } - &Opcode::Ushr => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - if let Some(pattern8_0) = C::i64_from_value(ctx, pattern7_1) { - // Rule at src/isa/s390x/lower.isle line 698. - let expr0_0 = C::mask_amt_imm(ctx, pattern3_0, pattern8_0); - let expr1_0 = C::put_in_reg(ctx, pattern7_0); - let expr2_0 = - constructor_vec_lshr_imm(ctx, pattern3_0, expr1_0, expr0_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - } - &Opcode::Sshr => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - if let Some(pattern8_0) = C::i64_from_value(ctx, pattern7_1) { - // Rule at src/isa/s390x/lower.isle line 729. - let expr0_0 = C::mask_amt_imm(ctx, pattern3_0, pattern8_0); - let expr1_0 = C::put_in_reg(ctx, pattern7_0); - let expr2_0 = - constructor_vec_ashr_imm(ctx, pattern3_0, expr1_0, expr0_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - } - _ => {} - } - } - } - if let Some(pattern3_0) = C::gpr32_ty(ctx, pattern2_0) { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Load { - opcode: ref pattern5_0, - arg: pattern5_1, - flags: pattern5_2, - offset: pattern5_3, - } = &pattern4_0 - { - if let &Opcode::Uload16 = pattern5_0 { - if let Some(()) = C::bigendian(ctx, pattern5_2) { - // Rule at src/isa/s390x/lower.isle line 2456. - let expr0_0: Type = I16; - let expr1_0 = - constructor_lower_address(ctx, pattern5_2, pattern5_1, pattern5_3); - let expr2_0 = constructor_zext32_mem(ctx, expr0_0, &expr1_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - } - } - } - if let Some(pattern3_0) = C::gpr64_ty(ctx, pattern2_0) { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Load { - opcode: ref pattern5_0, - arg: pattern5_1, - flags: pattern5_2, - offset: pattern5_3, - } = &pattern4_0 - { - if let &Opcode::Sload16 = pattern5_0 { - if let Some(()) = C::bigendian(ctx, pattern5_2) { - // Rule at src/isa/s390x/lower.isle line 2492. - let expr0_0: Type = I16; - let expr1_0 = - constructor_lower_address(ctx, pattern5_2, pattern5_1, pattern5_3); - let expr2_0 = constructor_sext64_mem(ctx, expr0_0, &expr1_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - } - } - } - if let Some(pattern3_0) = C::vr128_ty(ctx, pattern2_0) { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Load { - opcode: ref pattern5_0, - arg: pattern5_1, - flags: pattern5_2, - offset: pattern5_3, - } = &pattern4_0 - { - if let &Opcode::Load = pattern5_0 { - if let Some(()) = C::littleendian(ctx, pattern5_2) { - let mut closure8 = || { - let expr0_0 = C::lane_order(ctx); - return Some(expr0_0); - }; - if let Some(pattern8_0) = closure8() { - if let &LaneOrder::BigEndian = &pattern8_0 { - // Rule at src/isa/s390x/lower.isle line 2331. - let expr0_0 = constructor_vec_load_byte_rev( - ctx, pattern3_0, pattern5_2, pattern5_1, pattern5_3, - ); - let expr1_0 = constructor_output_reg(ctx, expr0_0); - return Some(expr1_0); - } - } - } - } - } - } - let pattern3_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Unary { - opcode: ref pattern4_0, - arg: pattern4_1, - } = &pattern3_0 - { - match pattern4_0 { - &Opcode::Splat => { - if let Some(pattern6_0) = C::i16_from_value(ctx, pattern4_1) { - // Rule at src/isa/s390x/lower.isle line 1934. - let expr0_0 = constructor_vec_imm_replicate(ctx, pattern2_0, pattern6_0); - let expr1_0 = constructor_output_reg(ctx, expr0_0); - return Some(expr1_0); - } - } - &Opcode::ScalarToVector => { - if let Some(pattern6_0) = C::i16_from_value(ctx, pattern4_1) { - // Rule at src/isa/s390x/lower.isle line 1995. - let expr0_0: u128 = 0i128 as u128; - let expr1_0 = constructor_vec_imm(ctx, pattern2_0, expr0_0); - let expr2_0: u8 = 0i128 as u8; - let expr3_0 = C::be_lane_idx(ctx, pattern2_0, expr2_0); - let expr4_0 = constructor_vec_insert_lane_imm( - ctx, pattern2_0, expr1_0, pattern6_0, expr3_0, - ); - let expr5_0 = constructor_output_reg(ctx, expr4_0); - return Some(expr5_0); - } - } - _ => {} - } - } - } - let pattern1_0 = C::inst_data(ctx, pattern0_0); - match &pattern1_0 { - &InstructionData::Store { - opcode: ref pattern2_0, - args: ref pattern2_1, - flags: pattern2_2, - offset: pattern2_3, - } => { - if let &Opcode::Store = pattern2_0 { - let (pattern4_0, pattern4_1) = C::unpack_value_array_2(ctx, pattern2_1); - let pattern5_0 = C::value_type(ctx, pattern4_0); - if let Some(pattern6_0) = C::vr128_ty(ctx, pattern5_0) { - if let Some(()) = C::littleendian(ctx, pattern2_2) { - let mut closure8 = || { - let expr0_0 = C::lane_order(ctx); - return Some(expr0_0); - }; - if let Some(pattern8_0) = closure8() { - if let &LaneOrder::BigEndian = &pattern8_0 { - // Rule at src/isa/s390x/lower.isle line 2662. - let expr0_0 = C::put_in_reg(ctx, pattern4_0); - let expr1_0 = constructor_vec_store_byte_rev( - ctx, pattern6_0, expr0_0, pattern2_2, pattern4_1, pattern2_3, - ); - let expr2_0 = constructor_side_effect(ctx, &expr1_0); - return Some(expr2_0); - } - } - } - } - } - } - &InstructionData::TernaryImm8 { - opcode: ref pattern2_0, - args: ref pattern2_1, - imm: pattern2_2, - } => { - if let &Opcode::Insertlane = pattern2_0 { - let (pattern4_0, pattern4_1) = C::unpack_value_array_2(ctx, pattern2_1); - let pattern5_0 = C::value_type(ctx, pattern4_0); - if let Some(pattern6_0) = C::i16_from_value(ctx, pattern4_1) { - let pattern7_0 = C::u8_from_uimm8(ctx, pattern2_2); - // Rule at src/isa/s390x/lower.isle line 1765. - let expr0_0 = C::put_in_reg(ctx, pattern4_0); - let expr1_0 = C::be_lane_idx(ctx, pattern5_0, pattern7_0); - let expr2_0 = constructor_vec_insert_lane_imm( - ctx, pattern5_0, expr0_0, pattern6_0, expr1_0, - ); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - } - } - _ => {} - } - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::first_result(ctx, pattern0_0) { - let pattern2_0 = C::value_type(ctx, pattern1_0); - if let Some(()) = C::mie2_enabled(ctx, pattern2_0) { - if let Some(pattern4_0) = C::fits_in_64(ctx, pattern2_0) { - let pattern5_0 = C::inst_data(ctx, pattern0_0); - match &pattern5_0 { - &InstructionData::Unary { - opcode: ref pattern6_0, - arg: pattern6_1, - } => { - if let &Opcode::Bnot = pattern6_0 { - // Rule at src/isa/s390x/lower.isle line 947. - let expr0_0 = C::put_in_reg(ctx, pattern6_1); - let expr1_0 = constructor_not_or_reg(ctx, pattern4_0, expr0_0, expr0_0); - let expr2_0 = constructor_output_reg(ctx, expr1_0); - return Some(expr2_0); - } - } - &InstructionData::Binary { - opcode: ref pattern6_0, - args: ref pattern6_1, - } => { - match pattern6_0 { - &Opcode::BandNot => { - let (pattern8_0, pattern8_1) = - C::unpack_value_array_2(ctx, pattern6_1); - // Rule at src/isa/s390x/lower.isle line 1039. - let expr0_0 = C::put_in_reg(ctx, pattern8_0); - let expr1_0 = C::put_in_reg(ctx, pattern8_1); - let expr2_0 = - constructor_and_not_reg(ctx, pattern4_0, expr0_0, expr1_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::BorNot => { - let (pattern8_0, pattern8_1) = - C::unpack_value_array_2(ctx, pattern6_1); - // Rule at src/isa/s390x/lower.isle line 1054. - let expr0_0 = C::put_in_reg(ctx, pattern8_0); - let expr1_0 = C::put_in_reg(ctx, pattern8_1); - let expr2_0 = - constructor_or_not_reg(ctx, pattern4_0, expr0_0, expr1_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::BxorNot => { - let (pattern8_0, pattern8_1) = - C::unpack_value_array_2(ctx, pattern6_1); - // Rule at src/isa/s390x/lower.isle line 1069. - let expr0_0 = C::put_in_reg(ctx, pattern8_0); - let expr1_0 = C::put_in_reg(ctx, pattern8_1); - let expr2_0 = - constructor_not_xor_reg(ctx, pattern4_0, expr0_0, expr1_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - _ => {} - } - } - &InstructionData::Ternary { - opcode: ref pattern6_0, - args: ref pattern6_1, - } => { - if let &Opcode::Bitselect = pattern6_0 { - let (pattern8_0, pattern8_1, pattern8_2) = - C::unpack_value_array_3(ctx, pattern6_1); - // Rule at src/isa/s390x/lower.isle line 1084. - let expr0_0 = C::put_in_reg(ctx, pattern8_0); - let expr1_0 = C::put_in_reg(ctx, pattern8_1); - let expr2_0 = constructor_and_reg(ctx, pattern4_0, expr1_0, expr0_0); - let expr3_0 = C::put_in_reg(ctx, pattern8_2); - let expr4_0 = - constructor_and_not_reg(ctx, pattern4_0, expr3_0, expr0_0); - let expr5_0 = constructor_or_reg(ctx, pattern4_0, expr4_0, expr2_0); - let expr6_0 = constructor_output_reg(ctx, expr5_0); - return Some(expr6_0); - } - } - _ => {} - } - } - } - if let Some(pattern3_0) = C::fits_in_64(ctx, pattern2_0) { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - match &pattern4_0 { - &InstructionData::Unary { - opcode: ref pattern5_0, - arg: pattern5_1, - } => { - match pattern5_0 { - &Opcode::Ineg => { - // Rule at src/isa/s390x/lower.isle line 223. - let expr0_0 = C::put_in_reg(ctx, pattern5_1); - let expr1_0 = constructor_neg_reg(ctx, pattern3_0, expr0_0); - let expr2_0 = constructor_output_reg(ctx, expr1_0); - return Some(expr2_0); - } - &Opcode::Iabs => { - // Rule at src/isa/s390x/lower.isle line 199. - let expr0_0 = constructor_ty_ext32(ctx, pattern3_0); - let expr1_0 = constructor_put_in_reg_sext32(ctx, pattern5_1); - let expr2_0 = constructor_abs_reg(ctx, expr0_0, expr1_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - _ => {} - } - } - &InstructionData::Binary { - opcode: ref pattern5_0, - args: ref pattern5_1, - } => { - match pattern5_0 { - &Opcode::Iadd => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - if let Some(pattern8_0) = C::sinkable_inst(ctx, pattern7_1) { - let pattern9_0 = C::inst_data(ctx, pattern8_0); - if let &InstructionData::Load { - opcode: ref pattern10_0, - arg: pattern10_1, - flags: pattern10_2, - offset: pattern10_3, - } = &pattern9_0 - { - if let &Opcode::Sload32 = pattern10_0 { - if let Some(()) = C::bigendian(ctx, pattern10_2) { - // Rule at src/isa/s390x/lower.isle line 103. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = constructor_sink_sload32(ctx, pattern8_0); - let expr2_0 = constructor_add_mem_sext32( - ctx, pattern3_0, expr0_0, &expr1_0, - ); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - } - } - } - } - &Opcode::Isub => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - if let Some(pattern8_0) = C::sinkable_inst(ctx, pattern7_1) { - let pattern9_0 = C::inst_data(ctx, pattern8_0); - if let &InstructionData::Load { - opcode: ref pattern10_0, - arg: pattern10_1, - flags: pattern10_2, - offset: pattern10_3, - } = &pattern9_0 - { - if let &Opcode::Sload32 = pattern10_0 { - if let Some(()) = C::bigendian(ctx, pattern10_2) { - // Rule at src/isa/s390x/lower.isle line 169. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = constructor_sink_sload32(ctx, pattern8_0); - let expr2_0 = constructor_sub_mem_sext32( - ctx, pattern3_0, expr0_0, &expr1_0, - ); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - } - } - } - } - &Opcode::Imul => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - if let Some(pattern8_0) = C::sinkable_inst(ctx, pattern7_1) { - let pattern9_0 = C::inst_data(ctx, pattern8_0); - if let &InstructionData::Load { - opcode: ref pattern10_0, - arg: pattern10_1, - flags: pattern10_2, - offset: pattern10_3, - } = &pattern9_0 - { - if let &Opcode::Sload32 = pattern10_0 { - if let Some(()) = C::bigendian(ctx, pattern10_2) { - // Rule at src/isa/s390x/lower.isle line 313. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = constructor_sink_sload32(ctx, pattern8_0); - let expr2_0 = constructor_mul_mem_sext32( - ctx, pattern3_0, expr0_0, &expr1_0, - ); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - } - } - } - } - &Opcode::Band => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - let pattern8_0 = C::value_type(ctx, pattern7_0); - if let Some(pattern9_0) = C::ty_32_or_64(ctx, pattern8_0) { - if let Some(pattern10_0) = C::sinkable_inst(ctx, pattern7_0) { - let pattern11_0 = C::inst_data(ctx, pattern10_0); - if let &InstructionData::Load { - opcode: ref pattern12_0, - arg: pattern12_1, - flags: pattern12_2, - offset: pattern12_3, - } = &pattern11_0 - { - if let &Opcode::Load = pattern12_0 { - if let Some(()) = C::bigendian(ctx, pattern12_2) { - // Rule at src/isa/s390x/lower.isle line 979. - let expr0_0 = C::put_in_reg(ctx, pattern7_1); - let expr1_0 = - constructor_sink_load(ctx, pattern10_0); - let expr2_0 = constructor_and_mem( - ctx, pattern3_0, expr0_0, &expr1_0, - ); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - } - } - } - } - } - &Opcode::Bor => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - let pattern8_0 = C::value_type(ctx, pattern7_0); - if let Some(pattern9_0) = C::ty_32_or_64(ctx, pattern8_0) { - if let Some(pattern10_0) = C::sinkable_inst(ctx, pattern7_0) { - let pattern11_0 = C::inst_data(ctx, pattern10_0); - if let &InstructionData::Load { - opcode: ref pattern12_0, - arg: pattern12_1, - flags: pattern12_2, - offset: pattern12_3, - } = &pattern11_0 - { - if let &Opcode::Load = pattern12_0 { - if let Some(()) = C::bigendian(ctx, pattern12_2) { - // Rule at src/isa/s390x/lower.isle line 1005. - let expr0_0 = C::put_in_reg(ctx, pattern7_1); - let expr1_0 = - constructor_sink_load(ctx, pattern10_0); - let expr2_0 = constructor_or_mem( - ctx, pattern3_0, expr0_0, &expr1_0, - ); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - } - } - } - } - } - &Opcode::Bxor => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - let pattern8_0 = C::value_type(ctx, pattern7_0); - if let Some(pattern9_0) = C::ty_32_or_64(ctx, pattern8_0) { - if let Some(pattern10_0) = C::sinkable_inst(ctx, pattern7_0) { - let pattern11_0 = C::inst_data(ctx, pattern10_0); - if let &InstructionData::Load { - opcode: ref pattern12_0, - arg: pattern12_1, - flags: pattern12_2, - offset: pattern12_3, - } = &pattern11_0 - { - if let &Opcode::Load = pattern12_0 { - if let Some(()) = C::bigendian(ctx, pattern12_2) { - // Rule at src/isa/s390x/lower.isle line 1028. - let expr0_0 = C::put_in_reg(ctx, pattern7_1); - let expr1_0 = - constructor_sink_load(ctx, pattern10_0); - let expr2_0 = constructor_xor_mem( - ctx, pattern3_0, expr0_0, &expr1_0, - ); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - } - } - } - } - } - _ => {} - } - } - &InstructionData::IntAddTrap { - opcode: ref pattern5_0, - args: ref pattern5_1, - code: ref pattern5_2, - } => { - if let &Opcode::UaddOverflowTrap = pattern5_0 { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - let pattern8_0 = C::value_type(ctx, pattern7_1); - if let Some(pattern9_0) = C::ty_32_or_64(ctx, pattern8_0) { - if let Some(pattern10_0) = C::sinkable_inst(ctx, pattern7_1) { - let pattern11_0 = C::inst_data(ctx, pattern10_0); - if let &InstructionData::Load { - opcode: ref pattern12_0, - arg: pattern12_1, - flags: pattern12_2, - offset: pattern12_3, - } = &pattern11_0 - { - if let &Opcode::Load = pattern12_0 { - if let Some(()) = C::bigendian(ctx, pattern12_2) { - // Rule at src/isa/s390x/lower.isle line 3856. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = constructor_sink_load(ctx, pattern10_0); - let expr2_0 = - constructor_add_logical_mem_with_flags_paired( - ctx, pattern3_0, expr0_0, &expr1_0, - ); - let expr3_0: u8 = 3i128 as u8; - let expr4_0 = C::mask_as_cond(ctx, expr3_0); - let expr5_0 = - constructor_trap_if_impl(ctx, &expr4_0, pattern5_2); - let expr6_0 = - constructor_with_flags(ctx, &expr2_0, &expr5_0); - let expr7_0 = C::output(ctx, expr6_0); - return Some(expr7_0); - } - } - } - } - } - } - } - _ => {} - } - } - if let Some(pattern3_0) = C::ty_32_or_64(ctx, pattern2_0) { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::AtomicCas { - opcode: ref pattern5_0, - args: ref pattern5_1, - flags: pattern5_2, - } = &pattern4_0 - { - if let &Opcode::AtomicCas = pattern5_0 { - let (pattern7_0, pattern7_1, pattern7_2) = - C::unpack_value_array_3(ctx, pattern5_1); - if let Some(()) = C::bigendian(ctx, pattern5_2) { - // Rule at src/isa/s390x/lower.isle line 3110. - let expr0_0 = C::put_in_reg(ctx, pattern7_1); - let expr1_0 = C::put_in_reg(ctx, pattern7_2); - let expr2_0 = C::zero_offset(ctx); - let expr3_0 = - constructor_lower_address(ctx, pattern5_2, pattern7_0, expr2_0); - let expr4_0 = constructor_atomic_cas_impl( - ctx, pattern3_0, expr0_0, expr1_0, &expr3_0, - ); - let expr5_0 = constructor_output_reg(ctx, expr4_0); - return Some(expr5_0); - } - } - } - } - if let Some(pattern3_0) = C::ty_8_or_16(ctx, pattern2_0) { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Binary { - opcode: ref pattern5_0, - args: ref pattern5_1, - } = &pattern4_0 - { - match pattern5_0 { - &Opcode::Rotl => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/s390x/lower.isle line 752. - let expr0_0 = constructor_put_in_reg_zext32(ctx, pattern7_0); - let expr1_0 = constructor_ty_ext32(ctx, pattern3_0); - let expr2_0 = constructor_amt_reg(ctx, pattern7_1); - let expr3_0: Type = I32; - let expr4_0 = constructor_neg_reg(ctx, expr3_0, expr2_0); - let expr5_0 = constructor_mask_amt_reg(ctx, pattern3_0, expr2_0); - let expr6_0 = constructor_mask_amt_reg(ctx, pattern3_0, expr4_0); - let expr7_0 = constructor_lshl_reg(ctx, expr1_0, expr0_0, expr5_0); - let expr8_0 = constructor_lshr_reg(ctx, expr1_0, expr0_0, expr6_0); - let expr9_0 = constructor_or_reg(ctx, pattern3_0, expr7_0, expr8_0); - let expr10_0 = constructor_output_reg(ctx, expr9_0); - return Some(expr10_0); - } - &Opcode::Rotr => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/s390x/lower.isle line 809. - let expr0_0 = constructor_put_in_reg_zext32(ctx, pattern7_0); - let expr1_0 = constructor_ty_ext32(ctx, pattern3_0); - let expr2_0 = constructor_amt_reg(ctx, pattern7_1); - let expr3_0: Type = I32; - let expr4_0 = constructor_neg_reg(ctx, expr3_0, expr2_0); - let expr5_0 = constructor_mask_amt_reg(ctx, pattern3_0, expr2_0); - let expr6_0 = constructor_mask_amt_reg(ctx, pattern3_0, expr4_0); - let expr7_0 = constructor_lshl_reg(ctx, expr1_0, expr0_0, expr6_0); - let expr8_0 = constructor_lshr_reg(ctx, expr1_0, expr0_0, expr5_0); - let expr9_0 = constructor_or_reg(ctx, pattern3_0, expr7_0, expr8_0); - let expr10_0 = constructor_output_reg(ctx, expr9_0); - return Some(expr10_0); - } - _ => {} - } - } - } - if let Some(pattern3_0) = C::ty_vec128(ctx, pattern2_0) { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Binary { - opcode: ref pattern5_0, - args: ref pattern5_1, - } = &pattern4_0 - { - match pattern5_0 { - &Opcode::Ishl => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/s390x/lower.isle line 663. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = constructor_amt_reg(ctx, pattern7_1); - let expr2_0 = constructor_vec_lshl_reg(ctx, pattern3_0, expr0_0, expr1_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::Ushr => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/s390x/lower.isle line 694. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = constructor_amt_reg(ctx, pattern7_1); - let expr2_0 = constructor_vec_lshr_reg(ctx, pattern3_0, expr0_0, expr1_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::Sshr => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/s390x/lower.isle line 725. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = constructor_amt_reg(ctx, pattern7_1); - let expr2_0 = constructor_vec_ashr_reg(ctx, pattern3_0, expr0_0, expr1_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - _ => {} - } - } - } - if let Some(pattern3_0) = C::gpr32_ty(ctx, pattern2_0) { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - match &pattern4_0 { - &InstructionData::Unary { - opcode: ref pattern5_0, - arg: pattern5_1, - } => { - if let &Opcode::Ctz = pattern5_0 { - // Rule at src/isa/s390x/lower.isle line 1239. - let expr0_0: Type = I64; - let expr1_0 = C::put_in_reg(ctx, pattern5_1); - let expr2_0 = constructor_ctz_guardbit(ctx, pattern3_0); - let expr3_0 = constructor_or_uimm16shifted(ctx, expr0_0, expr1_0, expr2_0); - let expr4_0: Type = I64; - let expr5_0: Type = I64; - let expr6_0 = constructor_neg_reg(ctx, expr5_0, expr3_0); - let expr7_0 = constructor_and_reg(ctx, expr4_0, expr3_0, expr6_0); - let expr8_0: i16 = 64i128 as i16; - let expr9_0 = constructor_clz_reg(ctx, expr8_0, expr7_0); - let expr10_0: u64 = 63i128 as u64; - let expr11_0 = constructor_imm(ctx, pattern3_0, expr10_0); - let expr12_0 = constructor_sub_reg(ctx, pattern3_0, expr11_0, expr9_0); - let expr13_0 = constructor_output_reg(ctx, expr12_0); - return Some(expr13_0); - } - } - &InstructionData::Load { - opcode: ref pattern5_0, - arg: pattern5_1, - flags: pattern5_2, - offset: pattern5_3, - } => { - if let &Opcode::Sload16 = pattern5_0 { - if let Some(()) = C::bigendian(ctx, pattern5_2) { - // Rule at src/isa/s390x/lower.isle line 2481. - let expr0_0: Type = I16; - let expr1_0 = - constructor_lower_address(ctx, pattern5_2, pattern5_1, pattern5_3); - let expr2_0 = constructor_sext32_mem(ctx, expr0_0, &expr1_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - } - } - _ => {} - } - } - if let Some(pattern3_0) = C::gpr64_ty(ctx, pattern2_0) { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - match &pattern4_0 { - &InstructionData::Unary { - opcode: ref pattern5_0, - arg: pattern5_1, - } => { - match pattern5_0 { - &Opcode::Uextend => { - // Rule at src/isa/s390x/lower.isle line 871. - let expr0_0 = constructor_put_in_reg_zext64(ctx, pattern5_1); - let expr1_0 = constructor_output_reg(ctx, expr0_0); - return Some(expr1_0); - } - &Opcode::Sextend => { - // Rule at src/isa/s390x/lower.isle line 892. - let expr0_0 = constructor_put_in_reg_sext64(ctx, pattern5_1); - let expr1_0 = constructor_output_reg(ctx, expr0_0); - return Some(expr1_0); - } - _ => {} - } - } - &InstructionData::LoadNoOffset { - opcode: ref pattern5_0, - arg: pattern5_1, - flags: pattern5_2, - } => { - if let &Opcode::Bitcast = pattern5_0 { - let pattern7_0 = C::value_type(ctx, pattern5_1); - if let Some(pattern8_0) = C::gpr64_ty(ctx, pattern7_0) { - // Rule at src/isa/s390x/lower.isle line 1718. - let expr0_0 = constructor_output_value(ctx, pattern5_1); - return Some(expr0_0); - } - } - } - &InstructionData::Load { - opcode: ref pattern5_0, - arg: pattern5_1, - flags: pattern5_2, - offset: pattern5_3, - } => { - if let &Opcode::Uload16 = pattern5_0 { - if let Some(()) = C::littleendian(ctx, pattern5_2) { - // Rule at src/isa/s390x/lower.isle line 2472. - let expr0_0 = - constructor_lower_address(ctx, pattern5_2, pattern5_1, pattern5_3); - let expr1_0 = constructor_loadrev16(ctx, &expr0_0); - let expr2_0: Type = I16; - let expr3_0 = constructor_zext64_reg(ctx, expr2_0, expr1_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - } - } - _ => {} - } - } - if let Some(pattern3_0) = C::vr128_ty(ctx, pattern2_0) { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Load { - opcode: ref pattern5_0, - arg: pattern5_1, - flags: pattern5_2, - offset: pattern5_3, - } = &pattern4_0 - { - if let &Opcode::Load = pattern5_0 { - if let Some(()) = C::bigendian(ctx, pattern5_2) { - let mut closure8 = || { - let expr0_0 = C::lane_order(ctx); - return Some(expr0_0); - }; - if let Some(pattern8_0) = closure8() { - if let &LaneOrder::LittleEndian = &pattern8_0 { - // Rule at src/isa/s390x/lower.isle line 2336. - let expr0_0 = constructor_vec_load_elt_rev( - ctx, pattern3_0, pattern5_2, pattern5_1, pattern5_3, - ); - let expr1_0 = constructor_output_reg(ctx, expr0_0); - return Some(expr1_0); - } - } - } - } - } - } - let pattern3_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Unary { - opcode: ref pattern4_0, - arg: pattern4_1, - } = &pattern3_0 - { - match pattern4_0 { - &Opcode::Splat => { - if let Some(pattern6_0) = C::def_inst(ctx, pattern4_1) { - let pattern7_0 = C::inst_data(ctx, pattern6_0); - if let &InstructionData::BinaryImm8 { - opcode: ref pattern8_0, - arg: pattern8_1, - imm: pattern8_2, - } = &pattern7_0 - { - if let &Opcode::Extractlane = pattern8_0 { - let pattern10_0 = C::u8_from_uimm8(ctx, pattern8_2); - // Rule at src/isa/s390x/lower.isle line 1930. - let expr0_0 = C::put_in_reg(ctx, pattern8_1); - let expr1_0 = C::be_lane_idx(ctx, pattern2_0, pattern10_0); - let expr2_0 = constructor_vec_replicate_lane( - ctx, pattern2_0, expr0_0, expr1_0, - ); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - } - } - } - &Opcode::ScalarToVector => { - if let Some(pattern6_0) = C::def_inst(ctx, pattern4_1) { - let pattern7_0 = C::inst_data(ctx, pattern6_0); - if let &InstructionData::BinaryImm8 { - opcode: ref pattern8_0, - arg: pattern8_1, - imm: pattern8_2, - } = &pattern7_0 - { - if let &Opcode::Extractlane = pattern8_0 { - let pattern10_0 = C::u8_from_uimm8(ctx, pattern8_2); - // Rule at src/isa/s390x/lower.isle line 1990. - let expr0_0: u8 = 0i128 as u8; - let expr1_0 = C::be_lane_idx(ctx, pattern2_0, expr0_0); - let expr2_0 = C::put_in_reg(ctx, pattern8_1); - let expr3_0 = C::be_lane_idx(ctx, pattern2_0, pattern10_0); - let expr4_0 = constructor_vec_move_lane_and_zero( - ctx, pattern2_0, expr1_0, expr2_0, expr3_0, - ); - let expr5_0 = constructor_output_reg(ctx, expr4_0); - return Some(expr5_0); - } - } - } - } - _ => {} - } - } - } - let pattern1_0 = C::inst_data(ctx, pattern0_0); - match &pattern1_0 { - &InstructionData::Store { - opcode: ref pattern2_0, - args: ref pattern2_1, - flags: pattern2_2, - offset: pattern2_3, - } => { - if let &Opcode::Store = pattern2_0 { - let (pattern4_0, pattern4_1) = C::unpack_value_array_2(ctx, pattern2_1); - let pattern5_0 = C::value_type(ctx, pattern4_0); - if let Some(pattern6_0) = C::vr128_ty(ctx, pattern5_0) { - if let Some(()) = C::bigendian(ctx, pattern2_2) { - let mut closure8 = || { - let expr0_0 = C::lane_order(ctx); - return Some(expr0_0); - }; - if let Some(pattern8_0) = closure8() { - if let &LaneOrder::LittleEndian = &pattern8_0 { - // Rule at src/isa/s390x/lower.isle line 2668. - let expr0_0 = C::put_in_reg(ctx, pattern4_0); - let expr1_0 = constructor_vec_store_elt_rev( - ctx, pattern6_0, expr0_0, pattern2_2, pattern4_1, pattern2_3, - ); - let expr2_0 = constructor_side_effect(ctx, &expr1_0); - return Some(expr2_0); - } - } - } - } - } - } - &InstructionData::TernaryImm8 { - opcode: ref pattern2_0, - args: ref pattern2_1, - imm: pattern2_2, - } => { - if let &Opcode::Insertlane = pattern2_0 { - let (pattern4_0, pattern4_1) = C::unpack_value_array_2(ctx, pattern2_1); - let pattern5_0 = C::value_type(ctx, pattern4_0); - if let Some(pattern6_0) = C::def_inst(ctx, pattern4_1) { - let pattern7_0 = C::inst_data(ctx, pattern6_0); - if let &InstructionData::BinaryImm8 { - opcode: ref pattern8_0, - arg: pattern8_1, - imm: pattern8_2, - } = &pattern7_0 - { - if let &Opcode::Extractlane = pattern8_0 { - let pattern10_0 = C::u8_from_uimm8(ctx, pattern8_2); - let pattern11_0 = C::u8_from_uimm8(ctx, pattern2_2); - // Rule at src/isa/s390x/lower.isle line 1758. - let expr0_0 = C::put_in_reg(ctx, pattern4_0); - let expr1_0 = C::be_lane_idx(ctx, pattern5_0, pattern11_0); - let expr2_0 = C::put_in_reg(ctx, pattern8_1); - let expr3_0 = C::be_lane_idx(ctx, pattern5_0, pattern10_0); - let expr4_0 = constructor_vec_move_lane_and_insert( - ctx, pattern5_0, expr0_0, expr1_0, expr2_0, expr3_0, - ); - let expr5_0 = constructor_output_reg(ctx, expr4_0); - return Some(expr5_0); - } - } - } - } - } - _ => {} - } - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::first_result(ctx, pattern0_0) { - let pattern2_0 = C::value_type(ctx, pattern1_0); - if pattern2_0 == I16 { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::LoadNoOffset { - opcode: ref pattern5_0, - arg: pattern5_1, - flags: pattern5_2, - } = &pattern4_0 - { - if let &Opcode::AtomicLoad = pattern5_0 { - if let Some(()) = C::bigendian(ctx, pattern5_2) { - // Rule at src/isa/s390x/lower.isle line 3185. - let expr0_0: Type = I16; - let expr1_0 = C::zero_offset(ctx); - let expr2_0 = - constructor_lower_address(ctx, pattern5_2, pattern5_1, expr1_0); - let expr3_0 = constructor_zext32_mem(ctx, expr0_0, &expr2_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - } - } - } - if pattern2_0 == I32 { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::LoadNoOffset { - opcode: ref pattern5_0, - arg: pattern5_1, - flags: pattern5_2, - } = &pattern4_0 - { - if let &Opcode::AtomicLoad = pattern5_0 { - if let Some(()) = C::bigendian(ctx, pattern5_2) { - // Rule at src/isa/s390x/lower.isle line 3193. - let expr0_0 = C::zero_offset(ctx); - let expr1_0 = - constructor_lower_address(ctx, pattern5_2, pattern5_1, expr0_0); - let expr2_0 = constructor_load32(ctx, &expr1_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - } - } - } - if pattern2_0 == I64 { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::LoadNoOffset { - opcode: ref pattern5_0, - arg: pattern5_1, - flags: pattern5_2, - } = &pattern4_0 - { - if let &Opcode::AtomicLoad = pattern5_0 { - if let Some(()) = C::bigendian(ctx, pattern5_2) { - // Rule at src/isa/s390x/lower.isle line 3201. - let expr0_0 = C::zero_offset(ctx); - let expr1_0 = - constructor_lower_address(ctx, pattern5_2, pattern5_1, expr0_0); - let expr2_0 = constructor_load64(ctx, &expr1_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - } - } - } - if pattern2_0 == F32 { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Unary { - opcode: ref pattern5_0, - arg: pattern5_1, - } = &pattern4_0 - { - match pattern5_0 { - &Opcode::FcvtFromUint => { - let pattern7_0 = C::value_type(ctx, pattern5_1); - if let Some(()) = C::vxrs_ext2_enabled(ctx, pattern7_0) { - if let Some(pattern9_0) = C::fits_in_32(ctx, pattern7_0) { - // Rule at src/isa/s390x/lower.isle line 1479. - let expr0_0: Type = F32; - let expr1_0 = FpuRoundMode::ToNearestTiesToEven; - let expr2_0 = constructor_put_in_reg_zext32(ctx, pattern5_1); - let expr3_0 = - constructor_fcvt_from_uint_reg(ctx, expr0_0, &expr1_0, expr2_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - } - } - &Opcode::FcvtFromSint => { - let pattern7_0 = C::value_type(ctx, pattern5_1); - if let Some(()) = C::vxrs_ext2_enabled(ctx, pattern7_0) { - if let Some(pattern9_0) = C::fits_in_32(ctx, pattern7_0) { - // Rule at src/isa/s390x/lower.isle line 1520. - let expr0_0: Type = F32; - let expr1_0 = FpuRoundMode::ToNearestTiesToEven; - let expr2_0 = constructor_put_in_reg_sext32(ctx, pattern5_1); - let expr3_0 = - constructor_fcvt_from_sint_reg(ctx, expr0_0, &expr1_0, expr2_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - } - } - _ => {} - } - } - } - if let Some(()) = C::mie2_disabled(ctx, pattern2_0) { - if let Some(pattern4_0) = C::fits_in_64(ctx, pattern2_0) { - let pattern5_0 = C::inst_data(ctx, pattern0_0); - match &pattern5_0 { - &InstructionData::Unary { - opcode: ref pattern6_0, - arg: pattern6_1, - } => { - if let &Opcode::Bnot = pattern6_0 { - // Rule at src/isa/s390x/lower.isle line 952. - let expr0_0 = C::put_in_reg(ctx, pattern6_1); - let expr1_0 = constructor_not_reg(ctx, pattern4_0, expr0_0); - let expr2_0 = constructor_output_reg(ctx, expr1_0); - return Some(expr2_0); - } - } - &InstructionData::Binary { - opcode: ref pattern6_0, - args: ref pattern6_1, - } => { - match pattern6_0 { - &Opcode::BandNot => { - let (pattern8_0, pattern8_1) = - C::unpack_value_array_2(ctx, pattern6_1); - // Rule at src/isa/s390x/lower.isle line 1043. - let expr0_0 = C::put_in_reg(ctx, pattern8_0); - let expr1_0 = C::put_in_reg(ctx, pattern8_1); - let expr2_0 = constructor_not_reg(ctx, pattern4_0, expr1_0); - let expr3_0 = - constructor_and_reg(ctx, pattern4_0, expr0_0, expr2_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - &Opcode::BorNot => { - let (pattern8_0, pattern8_1) = - C::unpack_value_array_2(ctx, pattern6_1); - // Rule at src/isa/s390x/lower.isle line 1058. - let expr0_0 = C::put_in_reg(ctx, pattern8_0); - let expr1_0 = C::put_in_reg(ctx, pattern8_1); - let expr2_0 = constructor_not_reg(ctx, pattern4_0, expr1_0); - let expr3_0 = constructor_or_reg(ctx, pattern4_0, expr0_0, expr2_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - &Opcode::BxorNot => { - let (pattern8_0, pattern8_1) = - C::unpack_value_array_2(ctx, pattern6_1); - // Rule at src/isa/s390x/lower.isle line 1073. - let expr0_0 = C::put_in_reg(ctx, pattern8_0); - let expr1_0 = C::put_in_reg(ctx, pattern8_1); - let expr2_0 = - constructor_xor_reg(ctx, pattern4_0, expr0_0, expr1_0); - let expr3_0 = constructor_not_reg(ctx, pattern4_0, expr2_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - _ => {} - } - } - &InstructionData::Ternary { - opcode: ref pattern6_0, - args: ref pattern6_1, - } => { - if let &Opcode::Bitselect = pattern6_0 { - let (pattern8_0, pattern8_1, pattern8_2) = - C::unpack_value_array_3(ctx, pattern6_1); - // Rule at src/isa/s390x/lower.isle line 1091. - let expr0_0 = C::put_in_reg(ctx, pattern8_0); - let expr1_0 = C::put_in_reg(ctx, pattern8_1); - let expr2_0 = constructor_and_reg(ctx, pattern4_0, expr1_0, expr0_0); - let expr3_0 = C::put_in_reg(ctx, pattern8_2); - let expr4_0 = constructor_not_reg(ctx, pattern4_0, expr0_0); - let expr5_0 = constructor_and_reg(ctx, pattern4_0, expr3_0, expr4_0); - let expr6_0 = constructor_or_reg(ctx, pattern4_0, expr5_0, expr2_0); - let expr7_0 = constructor_output_reg(ctx, expr6_0); - return Some(expr7_0); - } - } - _ => {} - } - } - } - if let Some(()) = C::vxrs_ext2_enabled(ctx, pattern2_0) { - if pattern2_0 == I32X4 { - let pattern5_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Unary { - opcode: ref pattern6_0, - arg: pattern6_1, - } = &pattern5_0 - { - match pattern6_0 { - &Opcode::FcvtToUintSat => { - let pattern8_0 = C::value_type(ctx, pattern6_1); - if pattern8_0 == F32X4 { - // Rule at src/isa/s390x/lower.isle line 1630. - let expr0_0: Type = F32X4; - let expr1_0 = FpuRoundMode::ToZero; - let expr2_0 = C::put_in_reg(ctx, pattern6_1); - let expr3_0 = - constructor_fcvt_to_uint_reg(ctx, expr0_0, &expr1_0, expr2_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - } - &Opcode::FcvtToSintSat => { - let pattern8_0 = C::value_type(ctx, pattern6_1); - if pattern8_0 == F32X4 { - // Rule at src/isa/s390x/lower.isle line 1670. - let expr0_0: Type = I32X4; - let expr1_0: Type = F32X4; - let expr2_0 = FpuRoundMode::ToZero; - let expr3_0 = C::put_in_reg(ctx, pattern6_1); - let expr4_0 = - constructor_fcvt_to_sint_reg(ctx, expr1_0, &expr2_0, expr3_0); - let expr5_0: Type = I32X4; - let expr6_0: u128 = 0i128 as u128; - let expr7_0 = constructor_vec_imm(ctx, expr5_0, expr6_0); - let expr8_0: Type = F32X4; - let expr9_0 = C::put_in_reg(ctx, pattern6_1); - let expr10_0 = C::put_in_reg(ctx, pattern6_1); - let expr11_0 = - constructor_vec_fcmpeq(ctx, expr8_0, expr9_0, expr10_0); - let expr12_0 = constructor_vec_select( - ctx, expr0_0, expr4_0, expr7_0, expr11_0, - ); - let expr13_0 = constructor_output_reg(ctx, expr12_0); - return Some(expr13_0); - } - } - _ => {} - } - } - } - if pattern2_0 == F32X4 { - let pattern5_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Unary { - opcode: ref pattern6_0, - arg: pattern6_1, - } = &pattern5_0 - { - match pattern6_0 { - &Opcode::FcvtFromUint => { - let pattern8_0 = C::value_type(ctx, pattern6_1); - if pattern8_0 == I32X4 { - // Rule at src/isa/s390x/lower.isle line 1496. - let expr0_0: Type = F32X4; - let expr1_0 = FpuRoundMode::ToNearestTiesToEven; - let expr2_0 = C::put_in_reg(ctx, pattern6_1); - let expr3_0 = - constructor_fcvt_from_uint_reg(ctx, expr0_0, &expr1_0, expr2_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - } - &Opcode::FcvtFromSint => { - let pattern8_0 = C::value_type(ctx, pattern6_1); - if pattern8_0 == I32X4 { - // Rule at src/isa/s390x/lower.isle line 1537. - let expr0_0: Type = F32X4; - let expr1_0 = FpuRoundMode::ToNearestTiesToEven; - let expr2_0 = C::put_in_reg(ctx, pattern6_1); - let expr3_0 = - constructor_fcvt_from_sint_reg(ctx, expr0_0, &expr1_0, expr2_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - } - _ => {} - } - } - } - } - if let Some(pattern3_0) = C::fits_in_64(ctx, pattern2_0) { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - match &pattern4_0 { - &InstructionData::Unary { - opcode: ref pattern5_0, - arg: pattern5_1, - } => { - match pattern5_0 { - &Opcode::Clz => { - // Rule at src/isa/s390x/lower.isle line 1168. - let expr0_0 = constructor_put_in_reg_zext64(ctx, pattern5_1); - let expr1_0: i16 = 64i128 as i16; - let expr2_0 = constructor_clz_reg(ctx, expr1_0, expr0_0); - let expr3_0 = constructor_clz_offset(ctx, pattern3_0, expr2_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - &Opcode::Cls => { - // Rule at src/isa/s390x/lower.isle line 1202. - let expr0_0 = constructor_put_in_reg_sext64(ctx, pattern5_1); - let expr1_0: Type = I64; - let expr2_0: u8 = 63i128 as u8; - let expr3_0 = constructor_ashr_imm(ctx, expr1_0, expr0_0, expr2_0); - let expr4_0: Type = I64; - let expr5_0 = constructor_xor_reg(ctx, expr4_0, expr0_0, expr3_0); - let expr6_0: i16 = 64i128 as i16; - let expr7_0 = constructor_clz_reg(ctx, expr6_0, expr5_0); - let expr8_0 = constructor_cls_offset(ctx, pattern3_0, expr7_0); - let expr9_0 = constructor_output_reg(ctx, expr8_0); - return Some(expr9_0); - } - _ => {} - } - } - &InstructionData::Binary { - opcode: ref pattern5_0, - args: ref pattern5_1, - } => { - match pattern5_0 { - &Opcode::Band => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - let pattern8_0 = C::value_type(ctx, pattern7_1); - if let Some(pattern9_0) = C::ty_32_or_64(ctx, pattern8_0) { - if let Some(pattern10_0) = C::sinkable_inst(ctx, pattern7_1) { - let pattern11_0 = C::inst_data(ctx, pattern10_0); - if let &InstructionData::Load { - opcode: ref pattern12_0, - arg: pattern12_1, - flags: pattern12_2, - offset: pattern12_3, - } = &pattern11_0 - { - if let &Opcode::Load = pattern12_0 { - if let Some(()) = C::bigendian(ctx, pattern12_2) { - // Rule at src/isa/s390x/lower.isle line 977. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = - constructor_sink_load(ctx, pattern10_0); - let expr2_0 = constructor_and_mem( - ctx, pattern3_0, expr0_0, &expr1_0, - ); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - } - } - } - } - } - &Opcode::Bor => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - let pattern8_0 = C::value_type(ctx, pattern7_1); - if let Some(pattern9_0) = C::ty_32_or_64(ctx, pattern8_0) { - if let Some(pattern10_0) = C::sinkable_inst(ctx, pattern7_1) { - let pattern11_0 = C::inst_data(ctx, pattern10_0); - if let &InstructionData::Load { - opcode: ref pattern12_0, - arg: pattern12_1, - flags: pattern12_2, - offset: pattern12_3, - } = &pattern11_0 - { - if let &Opcode::Load = pattern12_0 { - if let Some(()) = C::bigendian(ctx, pattern12_2) { - // Rule at src/isa/s390x/lower.isle line 1003. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = - constructor_sink_load(ctx, pattern10_0); - let expr2_0 = constructor_or_mem( - ctx, pattern3_0, expr0_0, &expr1_0, - ); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - } - } - } - } - } - &Opcode::Bxor => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - let pattern8_0 = C::value_type(ctx, pattern7_1); - if let Some(pattern9_0) = C::ty_32_or_64(ctx, pattern8_0) { - if let Some(pattern10_0) = C::sinkable_inst(ctx, pattern7_1) { - let pattern11_0 = C::inst_data(ctx, pattern10_0); - if let &InstructionData::Load { - opcode: ref pattern12_0, - arg: pattern12_1, - flags: pattern12_2, - offset: pattern12_3, - } = &pattern11_0 - { - if let &Opcode::Load = pattern12_0 { - if let Some(()) = C::bigendian(ctx, pattern12_2) { - // Rule at src/isa/s390x/lower.isle line 1026. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = - constructor_sink_load(ctx, pattern10_0); - let expr2_0 = constructor_xor_mem( - ctx, pattern3_0, expr0_0, &expr1_0, - ); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - } - } - } - } - } - &Opcode::Ishl => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - if let Some(pattern8_0) = C::i64_from_value(ctx, pattern7_1) { - // Rule at src/isa/s390x/lower.isle line 658. - let expr0_0 = C::mask_amt_imm(ctx, pattern3_0, pattern8_0); - let expr1_0 = C::put_in_reg(ctx, pattern7_0); - let expr2_0 = - constructor_lshl_imm(ctx, pattern3_0, expr1_0, expr0_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - } - &Opcode::Ushr => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - if let Some(pattern8_0) = C::i64_from_value(ctx, pattern7_1) { - // Rule at src/isa/s390x/lower.isle line 688. - let expr0_0 = constructor_put_in_reg_zext32(ctx, pattern7_0); - let expr1_0 = C::mask_amt_imm(ctx, pattern3_0, pattern8_0); - let expr2_0 = constructor_ty_ext32(ctx, pattern3_0); - let expr3_0 = constructor_lshr_imm(ctx, expr2_0, expr0_0, expr1_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - } - &Opcode::Sshr => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - if let Some(pattern8_0) = C::i64_from_value(ctx, pattern7_1) { - // Rule at src/isa/s390x/lower.isle line 719. - let expr0_0 = constructor_put_in_reg_sext32(ctx, pattern7_0); - let expr1_0 = C::mask_amt_imm(ctx, pattern3_0, pattern8_0); - let expr2_0 = constructor_ty_ext32(ctx, pattern3_0); - let expr3_0 = constructor_ashr_imm(ctx, expr2_0, expr0_0, expr1_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - } - _ => {} - } - } - &InstructionData::IntAddTrap { - opcode: ref pattern5_0, - args: ref pattern5_1, - code: ref pattern5_2, - } => { - if let &Opcode::UaddOverflowTrap = pattern5_0 { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - if let Some(pattern8_0) = C::sinkable_inst(ctx, pattern7_1) { - let pattern9_0 = C::inst_data(ctx, pattern8_0); - if let &InstructionData::Load { - opcode: ref pattern10_0, - arg: pattern10_1, - flags: pattern10_2, - offset: pattern10_3, - } = &pattern9_0 - { - if let &Opcode::Uload32 = pattern10_0 { - if let Some(()) = C::bigendian(ctx, pattern10_2) { - // Rule at src/isa/s390x/lower.isle line 3868. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = constructor_sink_uload32(ctx, pattern8_0); - let expr2_0 = - constructor_add_logical_mem_zext32_with_flags_paired( - ctx, pattern3_0, expr0_0, &expr1_0, - ); - let expr3_0: u8 = 3i128 as u8; - let expr4_0 = C::mask_as_cond(ctx, expr3_0); - let expr5_0 = - constructor_trap_if_impl(ctx, &expr4_0, pattern5_2); - let expr6_0 = - constructor_with_flags(ctx, &expr2_0, &expr5_0); - let expr7_0 = C::output(ctx, expr6_0); - return Some(expr7_0); - } - } - } - } - } - } - _ => {} - } - } - if let Some(pattern3_0) = C::ty_32_or_64(ctx, pattern2_0) { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - match &pattern4_0 { - &InstructionData::Binary { - opcode: ref pattern5_0, - args: ref pattern5_1, - } => { - match pattern5_0 { - &Opcode::Rotl => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - if let Some(pattern8_0) = C::i64_from_value(ctx, pattern7_1) { - // Rule at src/isa/s390x/lower.isle line 746. - let expr0_0 = C::mask_amt_imm(ctx, pattern3_0, pattern8_0); - let expr1_0 = C::put_in_reg(ctx, pattern7_0); - let expr2_0 = - constructor_rot_imm(ctx, pattern3_0, expr1_0, expr0_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - } - &Opcode::Rotr => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - if let Some(pattern8_0) = C::i64_from_negated_value(ctx, pattern7_1) { - // Rule at src/isa/s390x/lower.isle line 803. - let expr0_0 = C::mask_amt_imm(ctx, pattern3_0, pattern8_0); - let expr1_0 = C::put_in_reg(ctx, pattern7_0); - let expr2_0 = - constructor_rot_imm(ctx, pattern3_0, expr1_0, expr0_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - } - _ => {} - } - } - &InstructionData::AtomicRmw { - opcode: ref pattern5_0, - args: ref pattern5_1, - flags: pattern5_2, - op: ref pattern5_3, - } => { - if let &Opcode::AtomicRmw = pattern5_0 { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - if let Some(()) = C::bigendian(ctx, pattern5_2) { - match pattern5_3 { - &AtomicRmwOp::And => { - // Rule at src/isa/s390x/lower.isle line 2854. - let expr0_0 = C::put_in_reg(ctx, pattern7_1); - let expr1_0 = C::zero_offset(ctx); - let expr2_0 = constructor_lower_address( - ctx, pattern5_2, pattern7_0, expr1_0, - ); - let expr3_0 = constructor_atomic_rmw_and( - ctx, pattern3_0, expr0_0, &expr2_0, - ); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - &AtomicRmwOp::Or => { - // Rule at src/isa/s390x/lower.isle line 2866. - let expr0_0 = C::put_in_reg(ctx, pattern7_1); - let expr1_0 = C::zero_offset(ctx); - let expr2_0 = constructor_lower_address( - ctx, pattern5_2, pattern7_0, expr1_0, - ); - let expr3_0 = constructor_atomic_rmw_or( - ctx, pattern3_0, expr0_0, &expr2_0, - ); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - &AtomicRmwOp::Xor => { - // Rule at src/isa/s390x/lower.isle line 2878. - let expr0_0 = C::put_in_reg(ctx, pattern7_1); - let expr1_0 = C::zero_offset(ctx); - let expr2_0 = constructor_lower_address( - ctx, pattern5_2, pattern7_0, expr1_0, - ); - let expr3_0 = constructor_atomic_rmw_xor( - ctx, pattern3_0, expr0_0, &expr2_0, - ); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - _ => {} - } - } - } - } - &InstructionData::AtomicCas { - opcode: ref pattern5_0, - args: ref pattern5_1, - flags: pattern5_2, - } => { - if let &Opcode::AtomicCas = pattern5_0 { - let (pattern7_0, pattern7_1, pattern7_2) = - C::unpack_value_array_3(ctx, pattern5_1); - if let Some(()) = C::littleendian(ctx, pattern5_2) { - // Rule at src/isa/s390x/lower.isle line 3117. - let expr0_0 = C::put_in_reg(ctx, pattern7_1); - let expr1_0 = constructor_bswap_reg(ctx, pattern3_0, expr0_0); - let expr2_0 = C::put_in_reg(ctx, pattern7_2); - let expr3_0 = constructor_bswap_reg(ctx, pattern3_0, expr2_0); - let expr4_0 = C::zero_offset(ctx); - let expr5_0 = - constructor_lower_address(ctx, pattern5_2, pattern7_0, expr4_0); - let expr6_0 = constructor_atomic_cas_impl( - ctx, pattern3_0, expr1_0, expr3_0, &expr5_0, - ); - let expr7_0 = constructor_bswap_reg(ctx, pattern3_0, expr6_0); - let expr8_0 = constructor_output_reg(ctx, expr7_0); - return Some(expr8_0); - } - } - } - _ => {} - } - } - if let Some(pattern3_0) = C::ty_vec128(ctx, pattern2_0) { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - match &pattern4_0 { - &InstructionData::Unary { - opcode: ref pattern5_0, - arg: pattern5_1, - } => { - match pattern5_0 { - &Opcode::Ineg => { - // Rule at src/isa/s390x/lower.isle line 231. - let expr0_0 = C::put_in_reg(ctx, pattern5_1); - let expr1_0 = constructor_vec_neg(ctx, pattern3_0, expr0_0); - let expr2_0 = constructor_output_reg(ctx, expr1_0); - return Some(expr2_0); - } - &Opcode::Iabs => { - // Rule at src/isa/s390x/lower.isle line 207. - let expr0_0 = C::put_in_reg(ctx, pattern5_1); - let expr1_0 = constructor_vec_abs(ctx, pattern3_0, expr0_0); - let expr2_0 = constructor_output_reg(ctx, expr1_0); - return Some(expr2_0); - } - &Opcode::Popcnt => { - // Rule at src/isa/s390x/lower.isle line 1309. - let expr0_0 = C::put_in_reg(ctx, pattern5_1); - let expr1_0 = constructor_vec_popcnt(ctx, pattern3_0, expr0_0); - let expr2_0 = constructor_output_reg(ctx, expr1_0); - return Some(expr2_0); - } - _ => {} - } - } - &InstructionData::Binary { - opcode: ref pattern5_0, - args: ref pattern5_1, - } => { - if let &Opcode::Swizzle = pattern5_0 { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - let mut closure8 = || { - let expr0_0 = C::lane_order(ctx); - return Some(expr0_0); - }; - if let Some(pattern8_0) = closure8() { - if let &LaneOrder::BigEndian = &pattern8_0 { - // Rule at src/isa/s390x/lower.isle line 2188. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0: u128 = 0i128 as u128; - let expr2_0 = constructor_vec_imm(ctx, pattern3_0, expr1_0); - let expr3_0: Type = I8X16; - let expr4_0: Type = I8X16; - let expr5_0: u64 = 16i128 as u64; - let expr6_0 = constructor_vec_imm_splat(ctx, expr4_0, expr5_0); - let expr7_0 = C::put_in_reg(ctx, pattern7_1); - let expr8_0 = constructor_vec_umin(ctx, expr3_0, expr6_0, expr7_0); - let expr9_0 = constructor_vec_permute( - ctx, pattern3_0, expr0_0, expr2_0, expr8_0, - ); - let expr10_0 = constructor_output_reg(ctx, expr9_0); - return Some(expr10_0); - } - } - } - } - _ => {} - } - } - if let Some(pattern3_0) = C::gpr32_ty(ctx, pattern2_0) { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - match &pattern4_0 { - &InstructionData::Unary { - opcode: ref pattern5_0, - arg: pattern5_1, - } => { - match pattern5_0 { - &Opcode::Uextend => { - // Rule at src/isa/s390x/lower.isle line 867. - let expr0_0 = constructor_put_in_reg_zext32(ctx, pattern5_1); - let expr1_0 = constructor_output_reg(ctx, expr0_0); - return Some(expr1_0); - } - &Opcode::Sextend => { - // Rule at src/isa/s390x/lower.isle line 888. - let expr0_0 = constructor_put_in_reg_sext32(ctx, pattern5_1); - let expr1_0 = constructor_output_reg(ctx, expr0_0); - return Some(expr1_0); - } - _ => {} - } - } - &InstructionData::LoadNoOffset { - opcode: ref pattern5_0, - arg: pattern5_1, - flags: pattern5_2, - } => { - if let &Opcode::Bitcast = pattern5_0 { - let pattern7_0 = C::value_type(ctx, pattern5_1); - if let Some(pattern8_0) = C::gpr32_ty(ctx, pattern7_0) { - // Rule at src/isa/s390x/lower.isle line 1716. - let expr0_0 = constructor_output_value(ctx, pattern5_1); - return Some(expr0_0); - } - } - } - &InstructionData::Load { - opcode: ref pattern5_0, - arg: pattern5_1, - flags: pattern5_2, - offset: pattern5_3, - } => { - if let &Opcode::Uload16 = pattern5_0 { - if let Some(()) = C::littleendian(ctx, pattern5_2) { - // Rule at src/isa/s390x/lower.isle line 2461. - let expr0_0 = - constructor_lower_address(ctx, pattern5_2, pattern5_1, pattern5_3); - let expr1_0 = constructor_loadrev16(ctx, &expr0_0); - let expr2_0: Type = I16; - let expr3_0 = constructor_zext32_reg(ctx, expr2_0, expr1_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - } - } - _ => {} - } - } - if let Some(pattern3_0) = C::gpr64_ty(ctx, pattern2_0) { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - match &pattern4_0 { - &InstructionData::Unary { - opcode: ref pattern5_0, - arg: pattern5_1, - } => { - if let &Opcode::Ctz = pattern5_0 { - // Rule at src/isa/s390x/lower.isle line 1254. - let expr0_0 = C::put_in_reg(ctx, pattern5_1); - let expr1_0: Type = I64; - let expr2_0: Type = I64; - let expr3_0 = constructor_neg_reg(ctx, expr2_0, expr0_0); - let expr4_0 = constructor_and_reg(ctx, expr1_0, expr0_0, expr3_0); - let expr5_0: i16 = -1i128 as i16; - let expr6_0 = constructor_clz_reg(ctx, expr5_0, expr4_0); - let expr7_0: Type = I64; - let expr8_0: Type = I64; - let expr9_0: u64 = 63i128 as u64; - let expr10_0 = constructor_imm(ctx, expr8_0, expr9_0); - let expr11_0 = constructor_sub_reg(ctx, expr7_0, expr10_0, expr6_0); - let expr12_0 = constructor_output_reg(ctx, expr11_0); - return Some(expr12_0); - } - } - &InstructionData::Load { - opcode: ref pattern5_0, - arg: pattern5_1, - flags: pattern5_2, - offset: pattern5_3, - } => { - match pattern5_0 { - &Opcode::Uload8 => { - // Rule at src/isa/s390x/lower.isle line 2438. - let expr0_0: Type = I8; - let expr1_0 = - constructor_lower_address(ctx, pattern5_2, pattern5_1, pattern5_3); - let expr2_0 = constructor_zext64_mem(ctx, expr0_0, &expr1_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::Sload8 => { - // Rule at src/isa/s390x/lower.isle line 2449. - let expr0_0: Type = I8; - let expr1_0 = - constructor_lower_address(ctx, pattern5_2, pattern5_1, pattern5_3); - let expr2_0 = constructor_sext64_mem(ctx, expr0_0, &expr1_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::Sload16 => { - if let Some(()) = C::littleendian(ctx, pattern5_2) { - // Rule at src/isa/s390x/lower.isle line 2497. - let expr0_0 = constructor_lower_address( - ctx, pattern5_2, pattern5_1, pattern5_3, - ); - let expr1_0 = constructor_loadrev16(ctx, &expr0_0); - let expr2_0: Type = I16; - let expr3_0 = constructor_sext64_reg(ctx, expr2_0, expr1_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - } - &Opcode::Uload32 => { - if let Some(()) = C::bigendian(ctx, pattern5_2) { - // Rule at src/isa/s390x/lower.isle line 2506. - let expr0_0: Type = I32; - let expr1_0 = constructor_lower_address( - ctx, pattern5_2, pattern5_1, pattern5_3, - ); - let expr2_0 = constructor_zext64_mem(ctx, expr0_0, &expr1_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - } - &Opcode::Sload32 => { - if let Some(()) = C::bigendian(ctx, pattern5_2) { - // Rule at src/isa/s390x/lower.isle line 2520. - let expr0_0: Type = I32; - let expr1_0 = constructor_lower_address( - ctx, pattern5_2, pattern5_1, pattern5_3, - ); - let expr2_0 = constructor_sext64_mem(ctx, expr0_0, &expr1_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - } - _ => {} - } - } - _ => {} - } - } - if let Some(pattern3_0) = C::vr128_ty(ctx, pattern2_0) { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - match &pattern4_0 { - &InstructionData::Load { - opcode: ref pattern5_0, - arg: pattern5_1, - flags: pattern5_2, - offset: pattern5_3, - } => { - if let &Opcode::Load = pattern5_0 { - if let Some(()) = C::littleendian(ctx, pattern5_2) { - let mut closure8 = || { - let expr0_0 = C::lane_order(ctx); - return Some(expr0_0); - }; - if let Some(pattern8_0) = closure8() { - if let &LaneOrder::LittleEndian = &pattern8_0 { - // Rule at src/isa/s390x/lower.isle line 2341. - let expr0_0 = constructor_vec_load_full_rev( - ctx, pattern3_0, pattern5_2, pattern5_1, pattern5_3, - ); - let expr1_0 = constructor_output_reg(ctx, expr0_0); - return Some(expr1_0); - } - } - } - } - } - &InstructionData::Binary { - opcode: ref pattern5_0, - args: ref pattern5_1, - } => { - match pattern5_0 { - &Opcode::Iadd => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/s390x/lower.isle line 109. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = C::put_in_reg(ctx, pattern7_1); - let expr2_0 = constructor_vec_add(ctx, pattern3_0, expr0_0, expr1_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::Isub => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/s390x/lower.isle line 173. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = C::put_in_reg(ctx, pattern7_1); - let expr2_0 = constructor_vec_sub(ctx, pattern3_0, expr0_0, expr1_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::Imul => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/s390x/lower.isle line 320. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = C::put_in_reg(ctx, pattern7_1); - let expr2_0 = - constructor_vec_mul_impl(ctx, pattern3_0, expr0_0, expr1_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - _ => {} - } - } - _ => {} - } - } - let pattern3_0 = C::inst_data(ctx, pattern0_0); - match &pattern3_0 { - &InstructionData::Unary { - opcode: ref pattern4_0, - arg: pattern4_1, - } => { - match pattern4_0 { - &Opcode::Splat => { - let pattern6_0 = C::value_type(ctx, pattern4_1); - let mut closure7 = || { - let expr0_0 = C::ty_int_ref_scalar_64(ctx, pattern6_0)?; - return Some(expr0_0); - }; - if let Some(pattern7_0) = closure7() { - // Rule at src/isa/s390x/lower.isle line 1920. - let expr0_0 = C::put_in_reg(ctx, pattern4_1); - let expr1_0: u8 = 0i128 as u8; - let expr2_0 = C::zero_reg(ctx); - let expr3_0 = constructor_vec_insert_lane_undef( - ctx, pattern2_0, expr0_0, expr1_0, expr2_0, - ); - let expr4_0: u8 = 0i128 as u8; - let expr5_0 = - constructor_vec_replicate_lane(ctx, pattern2_0, expr3_0, expr4_0); - let expr6_0 = constructor_output_reg(ctx, expr5_0); - return Some(expr6_0); - } - } - &Opcode::ScalarToVector => { - let pattern6_0 = C::value_type(ctx, pattern4_1); - let mut closure7 = || { - let expr0_0 = C::ty_int_ref_scalar_64(ctx, pattern6_0)?; - return Some(expr0_0); - }; - if let Some(pattern7_0) = closure7() { - // Rule at src/isa/s390x/lower.isle line 1979. - let expr0_0: u128 = 0i128 as u128; - let expr1_0 = constructor_vec_imm(ctx, pattern2_0, expr0_0); - let expr2_0 = C::put_in_reg(ctx, pattern4_1); - let expr3_0: u8 = 0i128 as u8; - let expr4_0 = C::be_lane_idx(ctx, pattern2_0, expr3_0); - let expr5_0 = C::zero_reg(ctx); - let expr6_0 = constructor_vec_insert_lane( - ctx, pattern2_0, expr1_0, expr2_0, expr4_0, expr5_0, - ); - let expr7_0 = constructor_output_reg(ctx, expr6_0); - return Some(expr7_0); - } - } - _ => {} - } - } - &InstructionData::BinaryImm8 { - opcode: ref pattern4_0, - arg: pattern4_1, - imm: pattern4_2, - } => { - if let &Opcode::Extractlane = pattern4_0 { - let pattern6_0 = C::value_type(ctx, pattern4_1); - let pattern7_0 = C::u8_from_uimm8(ctx, pattern4_2); - let mut closure8 = || { - let expr0_0 = C::ty_int_ref_scalar_64(ctx, pattern2_0)?; - return Some(expr0_0); - }; - if let Some(pattern8_0) = closure8() { - // Rule at src/isa/s390x/lower.isle line 1862. - let expr0_0 = C::put_in_reg(ctx, pattern4_1); - let expr1_0 = C::be_lane_idx(ctx, pattern6_0, pattern7_0); - let expr2_0 = C::zero_reg(ctx); - let expr3_0 = constructor_vec_extract_lane( - ctx, pattern6_0, expr0_0, expr1_0, expr2_0, - ); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - } - } - _ => {} - } - } - let pattern1_0 = C::inst_data(ctx, pattern0_0); - match &pattern1_0 { - &InstructionData::Unary { - opcode: ref pattern2_0, - arg: pattern2_1, - } => { - match pattern2_0 { - &Opcode::VhighBits => { - let pattern4_0 = C::value_type(ctx, pattern2_1); - if let Some((pattern5_0, pattern5_1)) = C::multi_lane(ctx, pattern4_0) { - if pattern5_0 == 8i128 as u32 { - if pattern5_1 == 16i128 as u32 { - let mut closure8 = || { - let expr0_0 = C::lane_order(ctx); - return Some(expr0_0); - }; - if let Some(pattern8_0) = closure8() { - if let &LaneOrder::BigEndian = &pattern8_0 { - // Rule at src/isa/s390x/lower.isle line 3623. - let expr0_0: Type = I8X16; - let expr1_0: u8 = 120i128 as u8; - let expr2_0: u8 = 112i128 as u8; - let expr3_0: u8 = 104i128 as u8; - let expr4_0: u8 = 96i128 as u8; - let expr5_0: u8 = 88i128 as u8; - let expr6_0: u8 = 80i128 as u8; - let expr7_0: u8 = 72i128 as u8; - let expr8_0: u8 = 64i128 as u8; - let expr9_0: u8 = 56i128 as u8; - let expr10_0: u8 = 48i128 as u8; - let expr11_0: u8 = 40i128 as u8; - let expr12_0: u8 = 32i128 as u8; - let expr13_0: u8 = 24i128 as u8; - let expr14_0: u8 = 16i128 as u8; - let expr15_0: u8 = 8i128 as u8; - let expr16_0: u8 = 0i128 as u8; - let expr17_0 = constructor_imm8x16( - ctx, expr1_0, expr2_0, expr3_0, expr4_0, expr5_0, - expr6_0, expr7_0, expr8_0, expr9_0, expr10_0, expr11_0, - expr12_0, expr13_0, expr14_0, expr15_0, expr16_0, - ); - let expr18_0 = constructor_vec_imm(ctx, expr0_0, expr17_0); - let expr19_0: Type = I64X2; - let expr20_0 = C::put_in_reg(ctx, pattern2_1); - let expr21_0 = - constructor_vec_bitpermute(ctx, expr20_0, expr18_0); - let expr22_0: u8 = 0i128 as u8; - let expr23_0 = C::zero_reg(ctx); - let expr24_0 = constructor_vec_extract_lane( - ctx, expr19_0, expr21_0, expr22_0, expr23_0, - ); - let expr25_0 = constructor_output_reg(ctx, expr24_0); - return Some(expr25_0); - } - } - } - } - if pattern5_0 == 16i128 as u32 { - if pattern5_1 == 8i128 as u32 { - let mut closure8 = || { - let expr0_0 = C::lane_order(ctx); - return Some(expr0_0); - }; - if let Some(pattern8_0) = closure8() { - if let &LaneOrder::BigEndian = &pattern8_0 { - // Rule at src/isa/s390x/lower.isle line 3634. - let expr0_0: Type = I8X16; - let expr1_0: u8 = 128i128 as u8; - let expr2_0: u8 = 128i128 as u8; - let expr3_0: u8 = 128i128 as u8; - let expr4_0: u8 = 128i128 as u8; - let expr5_0: u8 = 128i128 as u8; - let expr6_0: u8 = 128i128 as u8; - let expr7_0: u8 = 128i128 as u8; - let expr8_0: u8 = 128i128 as u8; - let expr9_0: u8 = 112i128 as u8; - let expr10_0: u8 = 96i128 as u8; - let expr11_0: u8 = 80i128 as u8; - let expr12_0: u8 = 64i128 as u8; - let expr13_0: u8 = 48i128 as u8; - let expr14_0: u8 = 32i128 as u8; - let expr15_0: u8 = 16i128 as u8; - let expr16_0: u8 = 0i128 as u8; - let expr17_0 = constructor_imm8x16( - ctx, expr1_0, expr2_0, expr3_0, expr4_0, expr5_0, - expr6_0, expr7_0, expr8_0, expr9_0, expr10_0, expr11_0, - expr12_0, expr13_0, expr14_0, expr15_0, expr16_0, - ); - let expr18_0 = constructor_vec_imm(ctx, expr0_0, expr17_0); - let expr19_0: Type = I64X2; - let expr20_0 = C::put_in_reg(ctx, pattern2_1); - let expr21_0 = - constructor_vec_bitpermute(ctx, expr20_0, expr18_0); - let expr22_0: u8 = 0i128 as u8; - let expr23_0 = C::zero_reg(ctx); - let expr24_0 = constructor_vec_extract_lane( - ctx, expr19_0, expr21_0, expr22_0, expr23_0, - ); - let expr25_0 = constructor_output_reg(ctx, expr24_0); - return Some(expr25_0); - } - } - } - } - if pattern5_0 == 32i128 as u32 { - if pattern5_1 == 4i128 as u32 { - let mut closure8 = || { - let expr0_0 = C::lane_order(ctx); - return Some(expr0_0); - }; - if let Some(pattern8_0) = closure8() { - if let &LaneOrder::BigEndian = &pattern8_0 { - // Rule at src/isa/s390x/lower.isle line 3645. - let expr0_0: Type = I8X16; - let expr1_0: u8 = 128i128 as u8; - let expr2_0: u8 = 128i128 as u8; - let expr3_0: u8 = 128i128 as u8; - let expr4_0: u8 = 128i128 as u8; - let expr5_0: u8 = 128i128 as u8; - let expr6_0: u8 = 128i128 as u8; - let expr7_0: u8 = 128i128 as u8; - let expr8_0: u8 = 128i128 as u8; - let expr9_0: u8 = 128i128 as u8; - let expr10_0: u8 = 128i128 as u8; - let expr11_0: u8 = 128i128 as u8; - let expr12_0: u8 = 128i128 as u8; - let expr13_0: u8 = 96i128 as u8; - let expr14_0: u8 = 64i128 as u8; - let expr15_0: u8 = 32i128 as u8; - let expr16_0: u8 = 0i128 as u8; - let expr17_0 = constructor_imm8x16( - ctx, expr1_0, expr2_0, expr3_0, expr4_0, expr5_0, - expr6_0, expr7_0, expr8_0, expr9_0, expr10_0, expr11_0, - expr12_0, expr13_0, expr14_0, expr15_0, expr16_0, - ); - let expr18_0 = constructor_vec_imm(ctx, expr0_0, expr17_0); - let expr19_0: Type = I64X2; - let expr20_0 = C::put_in_reg(ctx, pattern2_1); - let expr21_0 = - constructor_vec_bitpermute(ctx, expr20_0, expr18_0); - let expr22_0: u8 = 0i128 as u8; - let expr23_0 = C::zero_reg(ctx); - let expr24_0 = constructor_vec_extract_lane( - ctx, expr19_0, expr21_0, expr22_0, expr23_0, - ); - let expr25_0 = constructor_output_reg(ctx, expr24_0); - return Some(expr25_0); - } - } - } - } - if pattern5_0 == 64i128 as u32 { - if pattern5_1 == 2i128 as u32 { - let mut closure8 = || { - let expr0_0 = C::lane_order(ctx); - return Some(expr0_0); - }; - if let Some(pattern8_0) = closure8() { - if let &LaneOrder::BigEndian = &pattern8_0 { - // Rule at src/isa/s390x/lower.isle line 3656. - let expr0_0: Type = I8X16; - let expr1_0: u8 = 128i128 as u8; - let expr2_0: u8 = 128i128 as u8; - let expr3_0: u8 = 128i128 as u8; - let expr4_0: u8 = 128i128 as u8; - let expr5_0: u8 = 128i128 as u8; - let expr6_0: u8 = 128i128 as u8; - let expr7_0: u8 = 128i128 as u8; - let expr8_0: u8 = 128i128 as u8; - let expr9_0: u8 = 128i128 as u8; - let expr10_0: u8 = 128i128 as u8; - let expr11_0: u8 = 128i128 as u8; - let expr12_0: u8 = 128i128 as u8; - let expr13_0: u8 = 128i128 as u8; - let expr14_0: u8 = 128i128 as u8; - let expr15_0: u8 = 64i128 as u8; - let expr16_0: u8 = 0i128 as u8; - let expr17_0 = constructor_imm8x16( - ctx, expr1_0, expr2_0, expr3_0, expr4_0, expr5_0, - expr6_0, expr7_0, expr8_0, expr9_0, expr10_0, expr11_0, - expr12_0, expr13_0, expr14_0, expr15_0, expr16_0, - ); - let expr18_0 = constructor_vec_imm(ctx, expr0_0, expr17_0); - let expr19_0: Type = I64X2; - let expr20_0 = C::put_in_reg(ctx, pattern2_1); - let expr21_0 = - constructor_vec_bitpermute(ctx, expr20_0, expr18_0); - let expr22_0: u8 = 0i128 as u8; - let expr23_0 = C::zero_reg(ctx); - let expr24_0 = constructor_vec_extract_lane( - ctx, expr19_0, expr21_0, expr22_0, expr23_0, - ); - let expr25_0 = constructor_output_reg(ctx, expr24_0); - return Some(expr25_0); - } - } - } - } - } - } - &Opcode::Ireduce => { - let pattern4_0 = C::value_type(ctx, pattern2_1); - if let Some(pattern5_0) = C::fits_in_64(ctx, pattern4_0) { - // Rule at src/isa/s390x/lower.isle line 856. - let expr0_0 = constructor_output_value(ctx, pattern2_1); - return Some(expr0_0); - } - } - _ => {} - } - } - &InstructionData::Call { - opcode: ref pattern2_0, - args: pattern2_1, - func_ref: pattern2_2, - } => { - if let &Opcode::Call = pattern2_0 { - let pattern4_0 = C::value_list_slice(ctx, pattern2_1); - let (pattern5_0, pattern5_1, pattern5_2) = C::func_ref_data(ctx, pattern2_2); - if let Some(()) = C::reloc_distance_near(ctx, pattern5_2) { - // Rule at src/isa/s390x/lower.isle line 3888. - let expr0_0 = C::abi_sig(ctx, pattern5_0); - let expr1_0 = C::abi_accumulate_outgoing_args_size(ctx, expr0_0); - let expr2_0: usize = 0i128 as usize; - let expr3_0 = C::abi_num_args(ctx, expr0_0); - let expr4_0 = C::range(ctx, expr2_0, expr3_0); - let expr5_0 = constructor_lower_call_args(ctx, expr0_0, expr4_0, pattern4_0); - let expr6_0 = C::defs_init(ctx, expr0_0); - let expr7_0 = Opcode::Call; - let expr8_0 = constructor_abi_call( - ctx, expr0_0, pattern5_1, &expr5_0, &expr6_0, &expr7_0, - ); - let expr9_0 = constructor_side_effect(ctx, &expr8_0); - let expr10_0 = C::abi_first_ret(ctx, pattern5_0, expr0_0); - let expr11_0 = C::abi_num_rets(ctx, expr0_0); - let expr12_0 = C::range(ctx, expr10_0, expr11_0); - let expr13_0 = C::output_builder_new(ctx); - let expr14_0 = - constructor_lower_call_rets(ctx, expr0_0, &expr6_0, expr12_0, &expr13_0); - return Some(expr14_0); - } - } - } - &InstructionData::FuncAddr { - opcode: ref pattern2_0, - func_ref: pattern2_1, - } => { - if let &Opcode::FuncAddr = pattern2_0 { - let (pattern4_0, pattern4_1, pattern4_2) = C::func_ref_data(ctx, pattern2_1); - if let Some(()) = C::reloc_distance_near(ctx, pattern4_2) { - // Rule at src/isa/s390x/lower.isle line 2224. - let expr0_0: i32 = 0i128 as i32; - let expr1_0 = C::memflags_trusted(ctx); - let expr2_0 = C::memarg_symbol(ctx, pattern4_1, expr0_0, expr1_0); - let expr3_0 = constructor_load_addr(ctx, &expr2_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - } - } - &InstructionData::UnaryGlobalValue { - opcode: ref pattern2_0, - global_value: pattern2_1, - } => { - if let &Opcode::SymbolValue = pattern2_0 { - if let Some((pattern4_0, pattern4_1, pattern4_2)) = - C::symbol_value_data(ctx, pattern2_1) - { - if let Some(()) = C::reloc_distance_near(ctx, pattern4_1) { - let mut closure6 = || { - let expr0_0 = constructor_memarg_symbol_offset(ctx, pattern4_2)?; - return Some(expr0_0); - }; - if let Some(pattern6_0) = closure6() { - // Rule at src/isa/s390x/lower.isle line 2235. - let expr0_0 = C::memflags_trusted(ctx); - let expr1_0 = C::memarg_symbol(ctx, pattern4_0, pattern6_0, expr0_0); - let expr2_0 = constructor_load_addr(ctx, &expr1_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - } - } - } - } - &InstructionData::Store { - opcode: ref pattern2_0, - args: ref pattern2_1, - flags: pattern2_2, - offset: pattern2_3, - } => { - if let &Opcode::Store = pattern2_0 { - let (pattern4_0, pattern4_1) = C::unpack_value_array_2(ctx, pattern2_1); - let pattern5_0 = C::value_type(ctx, pattern4_0); - if let Some(pattern6_0) = C::vr128_ty(ctx, pattern5_0) { - if let Some(()) = C::littleendian(ctx, pattern2_2) { - let mut closure8 = || { - let expr0_0 = C::lane_order(ctx); - return Some(expr0_0); - }; - if let Some(pattern8_0) = closure8() { - if let &LaneOrder::LittleEndian = &pattern8_0 { - // Rule at src/isa/s390x/lower.isle line 2674. - let expr0_0 = C::put_in_reg(ctx, pattern4_0); - let expr1_0 = constructor_vec_store_full_rev( - ctx, pattern6_0, expr0_0, pattern2_2, pattern4_1, pattern2_3, - ); - let expr2_0 = constructor_side_effect(ctx, &expr1_0); - return Some(expr2_0); - } - } - } - } - } - } - &InstructionData::TernaryImm8 { - opcode: ref pattern2_0, - args: ref pattern2_1, - imm: pattern2_2, - } => { - if let &Opcode::Insertlane = pattern2_0 { - let (pattern4_0, pattern4_1) = C::unpack_value_array_2(ctx, pattern2_1); - let pattern5_0 = C::value_type(ctx, pattern4_0); - let pattern6_0 = C::value_type(ctx, pattern4_1); - let pattern7_0 = C::u8_from_uimm8(ctx, pattern2_2); - let mut closure8 = || { - let expr0_0 = C::ty_int_ref_scalar_64(ctx, pattern6_0)?; - return Some(expr0_0); - }; - if let Some(pattern8_0) = closure8() { - // Rule at src/isa/s390x/lower.isle line 1745. - let expr0_0 = C::put_in_reg(ctx, pattern4_0); - let expr1_0 = C::put_in_reg(ctx, pattern4_1); - let expr2_0 = C::be_lane_idx(ctx, pattern5_0, pattern7_0); - let expr3_0 = C::zero_reg(ctx); - let expr4_0 = constructor_vec_insert_lane( - ctx, pattern5_0, expr0_0, expr1_0, expr2_0, expr3_0, - ); - let expr5_0 = constructor_output_reg(ctx, expr4_0); - return Some(expr5_0); - } - } - } - _ => {} - } - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::first_result(ctx, pattern0_0) { - let pattern2_0 = C::value_type(ctx, pattern1_0); - if pattern2_0 == I8 { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - match &pattern4_0 { - &InstructionData::Unary { - opcode: ref pattern5_0, - arg: pattern5_1, - } => { - match pattern5_0 { - &Opcode::Popcnt => { - // Rule at src/isa/s390x/lower.isle line 1274. - let expr0_0 = C::put_in_reg(ctx, pattern5_1); - let expr1_0 = constructor_popcnt_byte(ctx, expr0_0); - let expr2_0 = constructor_output_reg(ctx, expr1_0); - return Some(expr2_0); - } - &Opcode::IsNull => { - let pattern7_0 = C::value_type(ctx, pattern5_1); - if pattern7_0 == R64 { - // Rule at src/isa/s390x/lower.isle line 3666. - let expr0_0: Type = I8; - let expr1_0: Type = I64; - let expr2_0 = C::put_in_reg(ctx, pattern5_1); - let expr3_0: i16 = 0i128 as i16; - let expr4_0 = - constructor_icmps_simm16(ctx, expr1_0, expr2_0, expr3_0); - let expr5_0 = IntCC::Equal; - let expr6_0 = C::intcc_as_cond(ctx, &expr5_0); - let expr7_0 = constructor_bool(ctx, &expr4_0, &expr6_0); - let expr8_0 = constructor_lower_bool(ctx, expr0_0, &expr7_0); - let expr9_0 = constructor_output_reg(ctx, expr8_0); - return Some(expr9_0); - } - } - &Opcode::IsInvalid => { - let pattern7_0 = C::value_type(ctx, pattern5_1); - if pattern7_0 == R64 { - // Rule at src/isa/s390x/lower.isle line 3672. - let expr0_0: Type = I8; - let expr1_0: Type = I64; - let expr2_0 = C::put_in_reg(ctx, pattern5_1); - let expr3_0: i16 = -1i128 as i16; - let expr4_0 = - constructor_icmps_simm16(ctx, expr1_0, expr2_0, expr3_0); - let expr5_0 = IntCC::Equal; - let expr6_0 = C::intcc_as_cond(ctx, &expr5_0); - let expr7_0 = constructor_bool(ctx, &expr4_0, &expr6_0); - let expr8_0 = constructor_lower_bool(ctx, expr0_0, &expr7_0); - let expr9_0 = constructor_output_reg(ctx, expr8_0); - return Some(expr9_0); - } - } - _ => {} - } - } - &InstructionData::LoadNoOffset { - opcode: ref pattern5_0, - arg: pattern5_1, - flags: pattern5_2, - } => { - if let &Opcode::AtomicLoad = pattern5_0 { - // Rule at src/isa/s390x/lower.isle line 3181. - let expr0_0: Type = I8; - let expr1_0 = C::zero_offset(ctx); - let expr2_0 = - constructor_lower_address(ctx, pattern5_2, pattern5_1, expr1_0); - let expr3_0 = constructor_zext32_mem(ctx, expr0_0, &expr2_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - } - &InstructionData::Load { - opcode: ref pattern5_0, - arg: pattern5_1, - flags: pattern5_2, - offset: pattern5_3, - } => { - if let &Opcode::Load = pattern5_0 { - // Rule at src/isa/s390x/lower.isle line 2274. - let expr0_0: Type = I8; - let expr1_0 = - constructor_lower_address(ctx, pattern5_2, pattern5_1, pattern5_3); - let expr2_0 = constructor_zext32_mem(ctx, expr0_0, &expr1_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - } - _ => {} - } - } - if pattern2_0 == I16 { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - match &pattern4_0 { - &InstructionData::LoadNoOffset { - opcode: ref pattern5_0, - arg: pattern5_1, - flags: pattern5_2, - } => { - if let &Opcode::AtomicLoad = pattern5_0 { - if let Some(()) = C::littleendian(ctx, pattern5_2) { - // Rule at src/isa/s390x/lower.isle line 3189. - let expr0_0 = C::zero_offset(ctx); - let expr1_0 = - constructor_lower_address(ctx, pattern5_2, pattern5_1, expr0_0); - let expr2_0 = constructor_loadrev16(ctx, &expr1_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - } - } - &InstructionData::Load { - opcode: ref pattern5_0, - arg: pattern5_1, - flags: pattern5_2, - offset: pattern5_3, - } => { - if let &Opcode::Load = pattern5_0 { - if let Some(()) = C::bigendian(ctx, pattern5_2) { - // Rule at src/isa/s390x/lower.isle line 2278. - let expr0_0: Type = I16; - let expr1_0 = - constructor_lower_address(ctx, pattern5_2, pattern5_1, pattern5_3); - let expr2_0 = constructor_zext32_mem(ctx, expr0_0, &expr1_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - } - } - _ => {} - } - } - if pattern2_0 == I32 { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - match &pattern4_0 { - &InstructionData::LoadNoOffset { - opcode: ref pattern5_0, - arg: pattern5_1, - flags: pattern5_2, - } => { - match pattern5_0 { - &Opcode::Bitcast => { - let pattern7_0 = C::value_type(ctx, pattern5_1); - if pattern7_0 == F32 { - // Rule at src/isa/s390x/lower.isle line 1712. - let expr0_0: Type = F32X4; - let expr1_0 = C::put_in_reg(ctx, pattern5_1); - let expr2_0: u8 = 0i128 as u8; - let expr3_0 = C::zero_reg(ctx); - let expr4_0 = constructor_vec_extract_lane( - ctx, expr0_0, expr1_0, expr2_0, expr3_0, - ); - let expr5_0 = constructor_output_reg(ctx, expr4_0); - return Some(expr5_0); - } - } - &Opcode::AtomicLoad => { - if let Some(()) = C::littleendian(ctx, pattern5_2) { - // Rule at src/isa/s390x/lower.isle line 3197. - let expr0_0 = C::zero_offset(ctx); - let expr1_0 = - constructor_lower_address(ctx, pattern5_2, pattern5_1, expr0_0); - let expr2_0 = constructor_loadrev32(ctx, &expr1_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - } - _ => {} - } - } - &InstructionData::Load { - opcode: ref pattern5_0, - arg: pattern5_1, - flags: pattern5_2, - offset: pattern5_3, - } => { - if let &Opcode::Load = pattern5_0 { - if let Some(()) = C::bigendian(ctx, pattern5_2) { - // Rule at src/isa/s390x/lower.isle line 2286. - let expr0_0 = - constructor_lower_address(ctx, pattern5_2, pattern5_1, pattern5_3); - let expr1_0 = constructor_load32(ctx, &expr0_0); - let expr2_0 = constructor_output_reg(ctx, expr1_0); - return Some(expr2_0); - } - } - } - &InstructionData::Binary { - opcode: ref pattern5_0, - args: ref pattern5_1, - } => { - match pattern5_0 { - &Opcode::Umulhi => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/s390x/lower.isle line 361. - let expr0_0 = constructor_put_in_reg_zext64(ctx, pattern7_0); - let expr1_0 = constructor_put_in_reg_zext64(ctx, pattern7_1); - let expr2_0: Type = I64; - let expr3_0 = constructor_mul_reg(ctx, expr2_0, expr0_0, expr1_0); - let expr4_0: Type = I64; - let expr5_0: u8 = 32i128 as u8; - let expr6_0 = constructor_lshr_imm(ctx, expr4_0, expr3_0, expr5_0); - let expr7_0 = constructor_output_reg(ctx, expr6_0); - return Some(expr7_0); - } - &Opcode::Smulhi => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/s390x/lower.isle line 399. - let expr0_0 = constructor_put_in_reg_sext64(ctx, pattern7_0); - let expr1_0 = constructor_put_in_reg_sext64(ctx, pattern7_1); - let expr2_0: Type = I64; - let expr3_0 = constructor_mul_reg(ctx, expr2_0, expr0_0, expr1_0); - let expr4_0: Type = I64; - let expr5_0: u8 = 32i128 as u8; - let expr6_0 = constructor_ashr_imm(ctx, expr4_0, expr3_0, expr5_0); - let expr7_0 = constructor_output_reg(ctx, expr6_0); - return Some(expr7_0); - } - _ => {} - } - } - _ => {} - } - } - if pattern2_0 == I64 { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - match &pattern4_0 { - &InstructionData::LoadNoOffset { - opcode: ref pattern5_0, - arg: pattern5_1, - flags: pattern5_2, - } => { - match pattern5_0 { - &Opcode::Bitcast => { - let pattern7_0 = C::value_type(ctx, pattern5_1); - if pattern7_0 == F64 { - // Rule at src/isa/s390x/lower.isle line 1704. - let expr0_0: Type = F64X2; - let expr1_0 = C::put_in_reg(ctx, pattern5_1); - let expr2_0: u8 = 0i128 as u8; - let expr3_0 = C::zero_reg(ctx); - let expr4_0 = constructor_vec_extract_lane( - ctx, expr0_0, expr1_0, expr2_0, expr3_0, - ); - let expr5_0 = constructor_output_reg(ctx, expr4_0); - return Some(expr5_0); - } - } - &Opcode::AtomicLoad => { - if let Some(()) = C::littleendian(ctx, pattern5_2) { - // Rule at src/isa/s390x/lower.isle line 3205. - let expr0_0 = C::zero_offset(ctx); - let expr1_0 = - constructor_lower_address(ctx, pattern5_2, pattern5_1, expr0_0); - let expr2_0 = constructor_loadrev64(ctx, &expr1_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - } - _ => {} - } - } - &InstructionData::Load { - opcode: ref pattern5_0, - arg: pattern5_1, - flags: pattern5_2, - offset: pattern5_3, - } => { - if let &Opcode::Load = pattern5_0 { - if let Some(()) = C::bigendian(ctx, pattern5_2) { - // Rule at src/isa/s390x/lower.isle line 2294. - let expr0_0 = - constructor_lower_address(ctx, pattern5_2, pattern5_1, pattern5_3); - let expr1_0 = constructor_load64(ctx, &expr0_0); - let expr2_0 = constructor_output_reg(ctx, expr1_0); - return Some(expr2_0); - } - } - } - &InstructionData::Binary { - opcode: ref pattern5_0, - args: ref pattern5_1, - } => { - match pattern5_0 { - &Opcode::Umulhi => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/s390x/lower.isle line 368. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = C::put_in_reg(ctx, pattern7_1); - let expr2_0 = constructor_umul_wide(ctx, expr0_0, expr1_0); - let expr3_0: Type = I64; - let expr4_0 = C::regpair_hi(ctx, expr2_0); - let expr5_0 = constructor_copy_reg(ctx, expr3_0, expr4_0); - let expr6_0 = constructor_output_reg(ctx, expr5_0); - return Some(expr6_0); - } - &Opcode::Smulhi => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/s390x/lower.isle line 406. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = C::put_in_reg(ctx, pattern7_1); - let expr2_0 = constructor_smul_wide(ctx, expr0_0, expr1_0); - let expr3_0: Type = I64; - let expr4_0 = C::regpair_hi(ctx, expr2_0); - let expr5_0 = constructor_copy_reg(ctx, expr3_0, expr4_0); - let expr6_0 = constructor_output_reg(ctx, expr5_0); - return Some(expr6_0); - } - _ => {} - } - } - _ => {} - } - } - if pattern2_0 == I128 { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Unary { - opcode: ref pattern5_0, - arg: pattern5_1, - } = &pattern4_0 - { - match pattern5_0 { - &Opcode::Ineg => { - // Rule at src/isa/s390x/lower.isle line 235. - let expr0_0: Type = I128; - let expr1_0: Type = I128; - let expr2_0: u128 = 0i128 as u128; - let expr3_0 = constructor_vec_imm(ctx, expr1_0, expr2_0); - let expr4_0 = C::put_in_reg(ctx, pattern5_1); - let expr5_0 = constructor_vec_sub(ctx, expr0_0, expr3_0, expr4_0); - let expr6_0 = constructor_output_reg(ctx, expr5_0); - return Some(expr6_0); - } - &Opcode::Iabs => { - // Rule at src/isa/s390x/lower.isle line 211. - let expr0_0: Type = I128; - let expr1_0: u128 = 0i128 as u128; - let expr2_0 = constructor_vec_imm(ctx, expr0_0, expr1_0); - let expr3_0 = C::put_in_reg(ctx, pattern5_1); - let expr4_0: Type = I128; - let expr5_0 = constructor_vec_sub(ctx, expr4_0, expr2_0, expr3_0); - let expr6_0: Type = I64X2; - let expr7_0: u8 = 0i128 as u8; - let expr8_0 = - constructor_vec_replicate_lane(ctx, expr6_0, expr3_0, expr7_0); - let expr9_0: Type = I64X2; - let expr10_0 = constructor_vec_cmph(ctx, expr9_0, expr2_0, expr8_0); - let expr11_0: Type = I128; - let expr12_0 = - constructor_vec_select(ctx, expr11_0, expr5_0, expr3_0, expr10_0); - let expr13_0 = constructor_output_reg(ctx, expr12_0); - return Some(expr13_0); - } - &Opcode::Clz => { - // Rule at src/isa/s390x/lower.isle line 1176. - let expr0_0: Type = I64X2; - let expr1_0 = C::put_in_reg(ctx, pattern5_1); - let expr2_0 = constructor_vec_clz(ctx, expr0_0, expr1_0); - let expr3_0: Type = I64X2; - let expr4_0: u128 = 0i128 as u128; - let expr5_0 = constructor_vec_imm(ctx, expr3_0, expr4_0); - let expr6_0: Type = I64X2; - let expr7_0: u8 = 0i128 as u8; - let expr8_0: u8 = 0i128 as u8; - let expr9_0 = constructor_vec_permute_dw_imm( - ctx, expr6_0, expr5_0, expr7_0, expr2_0, expr8_0, - ); - let expr10_0: Type = I64X2; - let expr11_0: u8 = 0i128 as u8; - let expr12_0: u8 = 1i128 as u8; - let expr13_0 = constructor_vec_permute_dw_imm( - ctx, expr10_0, expr5_0, expr11_0, expr2_0, expr12_0, - ); - let expr14_0: Type = I64X2; - let expr15_0 = constructor_vec_add(ctx, expr14_0, expr9_0, expr13_0); - let expr16_0: Type = I64X2; - let expr17_0: Type = I64X2; - let expr18_0: u64 = 64i128 as u64; - let expr19_0 = constructor_vec_imm_splat(ctx, expr17_0, expr18_0); - let expr20_0 = constructor_vec_cmpeq(ctx, expr16_0, expr9_0, expr19_0); - let expr21_0: Type = I128; - let expr22_0 = - constructor_vec_select(ctx, expr21_0, expr15_0, expr9_0, expr20_0); - let expr23_0 = constructor_output_reg(ctx, expr22_0); - return Some(expr23_0); - } - &Opcode::Cls => { - // Rule at src/isa/s390x/lower.isle line 1210. - let expr0_0 = C::put_in_reg(ctx, pattern5_1); - let expr1_0: Type = I8X16; - let expr2_0: u64 = 255i128 as u64; - let expr3_0 = constructor_vec_imm_splat(ctx, expr1_0, expr2_0); - let expr4_0 = constructor_vec_ashr_by_byte(ctx, expr0_0, expr3_0); - let expr5_0 = constructor_vec_ashr_by_bit(ctx, expr4_0, expr3_0); - let expr6_0: Type = I128; - let expr7_0 = constructor_vec_xor(ctx, expr6_0, expr0_0, expr5_0); - let expr8_0: Type = I64X2; - let expr9_0 = constructor_vec_clz(ctx, expr8_0, expr7_0); - let expr10_0: Type = I64X2; - let expr11_0: u128 = 0i128 as u128; - let expr12_0 = constructor_vec_imm(ctx, expr10_0, expr11_0); - let expr13_0: Type = I64X2; - let expr14_0: u8 = 0i128 as u8; - let expr15_0: u8 = 0i128 as u8; - let expr16_0 = constructor_vec_permute_dw_imm( - ctx, expr13_0, expr12_0, expr14_0, expr9_0, expr15_0, - ); - let expr17_0: Type = I64X2; - let expr18_0: u8 = 0i128 as u8; - let expr19_0: u8 = 1i128 as u8; - let expr20_0 = constructor_vec_permute_dw_imm( - ctx, expr17_0, expr12_0, expr18_0, expr9_0, expr19_0, - ); - let expr21_0: Type = I64X2; - let expr22_0 = constructor_vec_add(ctx, expr21_0, expr16_0, expr20_0); - let expr23_0: Type = I64X2; - let expr24_0: Type = I64X2; - let expr25_0: u64 = 64i128 as u64; - let expr26_0 = constructor_vec_imm_splat(ctx, expr24_0, expr25_0); - let expr27_0 = constructor_vec_cmpeq(ctx, expr23_0, expr16_0, expr26_0); - let expr28_0: Type = I128; - let expr29_0: Type = I128; - let expr30_0 = - constructor_vec_select(ctx, expr29_0, expr22_0, expr16_0, expr27_0); - let expr31_0 = constructor_vec_add(ctx, expr28_0, expr30_0, expr3_0); - let expr32_0 = constructor_output_reg(ctx, expr31_0); - return Some(expr32_0); - } - &Opcode::Ctz => { - // Rule at src/isa/s390x/lower.isle line 1261. - let expr0_0: Type = I64X2; - let expr1_0 = C::put_in_reg(ctx, pattern5_1); - let expr2_0 = constructor_vec_ctz(ctx, expr0_0, expr1_0); - let expr3_0: Type = I64X2; - let expr4_0: u128 = 0i128 as u128; - let expr5_0 = constructor_vec_imm(ctx, expr3_0, expr4_0); - let expr6_0: Type = I64X2; - let expr7_0: u8 = 0i128 as u8; - let expr8_0: u8 = 0i128 as u8; - let expr9_0 = constructor_vec_permute_dw_imm( - ctx, expr6_0, expr5_0, expr7_0, expr2_0, expr8_0, - ); - let expr10_0: Type = I64X2; - let expr11_0: u8 = 0i128 as u8; - let expr12_0: u8 = 1i128 as u8; - let expr13_0 = constructor_vec_permute_dw_imm( - ctx, expr10_0, expr5_0, expr11_0, expr2_0, expr12_0, - ); - let expr14_0: Type = I64X2; - let expr15_0 = constructor_vec_add(ctx, expr14_0, expr9_0, expr13_0); - let expr16_0: Type = I64X2; - let expr17_0: Type = I64X2; - let expr18_0: u64 = 64i128 as u64; - let expr19_0 = constructor_vec_imm_splat(ctx, expr17_0, expr18_0); - let expr20_0 = constructor_vec_cmpeq(ctx, expr16_0, expr13_0, expr19_0); - let expr21_0: Type = I128; - let expr22_0 = - constructor_vec_select(ctx, expr21_0, expr15_0, expr13_0, expr20_0); - let expr23_0 = constructor_output_reg(ctx, expr22_0); - return Some(expr23_0); - } - &Opcode::Popcnt => { - // Rule at src/isa/s390x/lower.isle line 1313. - let expr0_0: Type = I64X2; - let expr1_0 = C::put_in_reg(ctx, pattern5_1); - let expr2_0 = constructor_vec_popcnt(ctx, expr0_0, expr1_0); - let expr3_0: Type = I64X2; - let expr4_0: u128 = 0i128 as u128; - let expr5_0 = constructor_vec_imm(ctx, expr3_0, expr4_0); - let expr6_0: Type = I64X2; - let expr7_0: u8 = 0i128 as u8; - let expr8_0: u8 = 0i128 as u8; - let expr9_0 = constructor_vec_permute_dw_imm( - ctx, expr6_0, expr5_0, expr7_0, expr2_0, expr8_0, - ); - let expr10_0: Type = I64X2; - let expr11_0: u8 = 0i128 as u8; - let expr12_0: u8 = 1i128 as u8; - let expr13_0 = constructor_vec_permute_dw_imm( - ctx, expr10_0, expr5_0, expr11_0, expr2_0, expr12_0, - ); - let expr14_0: Type = I64X2; - let expr15_0 = constructor_vec_add(ctx, expr14_0, expr9_0, expr13_0); - let expr16_0 = constructor_output_reg(ctx, expr15_0); - return Some(expr16_0); - } - _ => {} - } - } - } - if pattern2_0 == R64 { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Load { - opcode: ref pattern5_0, - arg: pattern5_1, - flags: pattern5_2, - offset: pattern5_3, - } = &pattern4_0 - { - if let &Opcode::Load = pattern5_0 { - if let Some(()) = C::bigendian(ctx, pattern5_2) { - // Rule at src/isa/s390x/lower.isle line 2302. - let expr0_0 = - constructor_lower_address(ctx, pattern5_2, pattern5_1, pattern5_3); - let expr1_0 = constructor_load64(ctx, &expr0_0); - let expr2_0 = constructor_output_reg(ctx, expr1_0); - return Some(expr2_0); - } - } - } - } - if pattern2_0 == F32 { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - match &pattern4_0 { - &InstructionData::Unary { - opcode: ref pattern5_0, - arg: pattern5_1, - } => { - match pattern5_0 { - &Opcode::FcvtFromUint => { - let pattern7_0 = C::value_type(ctx, pattern5_1); - if let Some(pattern8_0) = C::fits_in_64(ctx, pattern7_0) { - // Rule at src/isa/s390x/lower.isle line 1485. - let expr0_0: Type = F32; - let expr1_0: Type = F64; - let expr2_0 = FpuRoundMode::ToNearestTiesToEven; - let expr3_0: Type = F64; - let expr4_0 = FpuRoundMode::ShorterPrecision; - let expr5_0 = constructor_put_in_reg_zext64(ctx, pattern5_1); - let expr6_0 = - constructor_fcvt_from_uint_reg(ctx, expr3_0, &expr4_0, expr5_0); - let expr7_0 = constructor_fdemote_reg( - ctx, expr0_0, expr1_0, &expr2_0, expr6_0, - ); - let expr8_0 = constructor_output_reg(ctx, expr7_0); - return Some(expr8_0); - } - } - &Opcode::FcvtFromSint => { - let pattern7_0 = C::value_type(ctx, pattern5_1); - if let Some(pattern8_0) = C::fits_in_64(ctx, pattern7_0) { - // Rule at src/isa/s390x/lower.isle line 1526. - let expr0_0: Type = F32; - let expr1_0: Type = F64; - let expr2_0 = FpuRoundMode::ToNearestTiesToEven; - let expr3_0: Type = F64; - let expr4_0 = FpuRoundMode::ShorterPrecision; - let expr5_0 = constructor_put_in_reg_sext64(ctx, pattern5_1); - let expr6_0 = - constructor_fcvt_from_sint_reg(ctx, expr3_0, &expr4_0, expr5_0); - let expr7_0 = constructor_fdemote_reg( - ctx, expr0_0, expr1_0, &expr2_0, expr6_0, - ); - let expr8_0 = constructor_output_reg(ctx, expr7_0); - return Some(expr8_0); - } - } - _ => {} - } - } - &InstructionData::LoadNoOffset { - opcode: ref pattern5_0, - arg: pattern5_1, - flags: pattern5_2, - } => { - if let &Opcode::Bitcast = pattern5_0 { - let pattern7_0 = C::value_type(ctx, pattern5_1); - if pattern7_0 == I32 { - // Rule at src/isa/s390x/lower.isle line 1708. - let expr0_0: Type = F32X4; - let expr1_0 = C::put_in_reg(ctx, pattern5_1); - let expr2_0: u8 = 0i128 as u8; - let expr3_0 = C::zero_reg(ctx); - let expr4_0 = constructor_vec_insert_lane_undef( - ctx, expr0_0, expr1_0, expr2_0, expr3_0, - ); - let expr5_0 = constructor_output_reg(ctx, expr4_0); - return Some(expr5_0); - } - } - } - &InstructionData::Load { - opcode: ref pattern5_0, - arg: pattern5_1, - flags: pattern5_2, - offset: pattern5_3, - } => { - if let &Opcode::Load = pattern5_0 { - if let Some(()) = C::bigendian(ctx, pattern5_2) { - // Rule at src/isa/s390x/lower.isle line 2310. - let expr0_0: Type = F32X4; - let expr1_0 = - constructor_lower_address(ctx, pattern5_2, pattern5_1, pattern5_3); - let expr2_0: u8 = 0i128 as u8; - let expr3_0 = - constructor_vec_load_lane_undef(ctx, expr0_0, &expr1_0, expr2_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - } - } - &InstructionData::Binary { - opcode: ref pattern5_0, - args: ref pattern5_1, - } => { - if let &Opcode::Fcopysign = pattern5_0 { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/s390x/lower.isle line 1380. - let expr0_0: Type = F32; - let expr1_0 = C::put_in_reg(ctx, pattern7_0); - let expr2_0 = C::put_in_reg(ctx, pattern7_1); - let expr3_0: Type = F32; - let expr4_0: u64 = 2147483647i128 as u64; - let expr5_0 = constructor_imm(ctx, expr3_0, expr4_0); - let expr6_0 = - constructor_vec_select(ctx, expr0_0, expr1_0, expr2_0, expr5_0); - let expr7_0 = constructor_output_reg(ctx, expr6_0); - return Some(expr7_0); - } - } - _ => {} - } - } - if pattern2_0 == F64 { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - match &pattern4_0 { - &InstructionData::Unary { - opcode: ref pattern5_0, - arg: pattern5_1, - } => { - match pattern5_0 { - &Opcode::FcvtFromUint => { - let pattern7_0 = C::value_type(ctx, pattern5_1); - if let Some(pattern8_0) = C::fits_in_64(ctx, pattern7_0) { - // Rule at src/isa/s390x/lower.isle line 1491. - let expr0_0: Type = F64; - let expr1_0 = FpuRoundMode::ToNearestTiesToEven; - let expr2_0 = constructor_put_in_reg_zext64(ctx, pattern5_1); - let expr3_0 = - constructor_fcvt_from_uint_reg(ctx, expr0_0, &expr1_0, expr2_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - } - &Opcode::FcvtFromSint => { - let pattern7_0 = C::value_type(ctx, pattern5_1); - if let Some(pattern8_0) = C::fits_in_64(ctx, pattern7_0) { - // Rule at src/isa/s390x/lower.isle line 1532. - let expr0_0: Type = F64; - let expr1_0 = FpuRoundMode::ToNearestTiesToEven; - let expr2_0 = constructor_put_in_reg_sext64(ctx, pattern5_1); - let expr3_0 = - constructor_fcvt_from_sint_reg(ctx, expr0_0, &expr1_0, expr2_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - } - _ => {} - } - } - &InstructionData::LoadNoOffset { - opcode: ref pattern5_0, - arg: pattern5_1, - flags: pattern5_2, - } => { - if let &Opcode::Bitcast = pattern5_0 { - let pattern7_0 = C::value_type(ctx, pattern5_1); - if pattern7_0 == I64 { - // Rule at src/isa/s390x/lower.isle line 1700. - let expr0_0: Type = F64X2; - let expr1_0 = C::put_in_reg(ctx, pattern5_1); - let expr2_0: u8 = 0i128 as u8; - let expr3_0 = C::zero_reg(ctx); - let expr4_0 = constructor_vec_insert_lane_undef( - ctx, expr0_0, expr1_0, expr2_0, expr3_0, - ); - let expr5_0 = constructor_output_reg(ctx, expr4_0); - return Some(expr5_0); - } - } - } - &InstructionData::Load { - opcode: ref pattern5_0, - arg: pattern5_1, - flags: pattern5_2, - offset: pattern5_3, - } => { - if let &Opcode::Load = pattern5_0 { - if let Some(()) = C::bigendian(ctx, pattern5_2) { - // Rule at src/isa/s390x/lower.isle line 2318. - let expr0_0: Type = F64X2; - let expr1_0 = - constructor_lower_address(ctx, pattern5_2, pattern5_1, pattern5_3); - let expr2_0: u8 = 0i128 as u8; - let expr3_0 = - constructor_vec_load_lane_undef(ctx, expr0_0, &expr1_0, expr2_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - } - } - &InstructionData::Binary { - opcode: ref pattern5_0, - args: ref pattern5_1, - } => { - if let &Opcode::Fcopysign = pattern5_0 { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/s390x/lower.isle line 1382. - let expr0_0: Type = F64; - let expr1_0 = C::put_in_reg(ctx, pattern7_0); - let expr2_0 = C::put_in_reg(ctx, pattern7_1); - let expr3_0: Type = F64; - let expr4_0: u64 = 9223372036854775807i128 as u64; - let expr5_0 = constructor_imm(ctx, expr3_0, expr4_0); - let expr6_0 = - constructor_vec_select(ctx, expr0_0, expr1_0, expr2_0, expr5_0); - let expr7_0 = constructor_output_reg(ctx, expr6_0); - return Some(expr7_0); - } - } - _ => {} - } - } - if pattern2_0 == I8X16 { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Binary { - opcode: ref pattern5_0, - args: ref pattern5_1, - } = &pattern4_0 - { - match pattern5_0 { - &Opcode::Umulhi => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/s390x/lower.isle line 373. - let expr0_0: Type = I8X16; - let expr1_0 = C::put_in_reg(ctx, pattern7_0); - let expr2_0 = C::put_in_reg(ctx, pattern7_1); - let expr3_0 = constructor_vec_umulhi(ctx, expr0_0, expr1_0, expr2_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - &Opcode::Smulhi => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/s390x/lower.isle line 411. - let expr0_0: Type = I8X16; - let expr1_0 = C::put_in_reg(ctx, pattern7_0); - let expr2_0 = C::put_in_reg(ctx, pattern7_1); - let expr3_0 = constructor_vec_smulhi(ctx, expr0_0, expr1_0, expr2_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - _ => {} - } - } - } - if pattern2_0 == I16X8 { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - match &pattern4_0 { - &InstructionData::Load { - opcode: ref pattern5_0, - arg: pattern5_1, - flags: pattern5_2, - offset: pattern5_3, - } => { - match pattern5_0 { - &Opcode::Uload8x8 => { - // Rule at src/isa/s390x/lower.isle line 2534. - let expr0_0: Type = I8X16; - let expr1_0: Type = I8X16; - let expr2_0 = constructor_load_v64( - ctx, expr1_0, pattern5_2, pattern5_1, pattern5_3, - ); - let expr3_0 = constructor_vec_unpacku_high(ctx, expr0_0, expr2_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - &Opcode::Sload8x8 => { - // Rule at src/isa/s390x/lower.isle line 2538. - let expr0_0: Type = I8X16; - let expr1_0: Type = I8X16; - let expr2_0 = constructor_load_v64( - ctx, expr1_0, pattern5_2, pattern5_1, pattern5_3, - ); - let expr3_0 = constructor_vec_unpacks_high(ctx, expr0_0, expr2_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - _ => {} - } - } - &InstructionData::Binary { - opcode: ref pattern5_0, - args: ref pattern5_1, - } => { - match pattern5_0 { - &Opcode::Umulhi => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/s390x/lower.isle line 374. - let expr0_0: Type = I16X8; - let expr1_0 = C::put_in_reg(ctx, pattern7_0); - let expr2_0 = C::put_in_reg(ctx, pattern7_1); - let expr3_0 = constructor_vec_umulhi(ctx, expr0_0, expr1_0, expr2_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - &Opcode::Smulhi => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/s390x/lower.isle line 412. - let expr0_0: Type = I16X8; - let expr1_0 = C::put_in_reg(ctx, pattern7_0); - let expr2_0 = C::put_in_reg(ctx, pattern7_1); - let expr3_0 = constructor_vec_smulhi(ctx, expr0_0, expr1_0, expr2_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - _ => {} - } - } - _ => {} - } - } - if pattern2_0 == I32X4 { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - match &pattern4_0 { - &InstructionData::Load { - opcode: ref pattern5_0, - arg: pattern5_1, - flags: pattern5_2, - offset: pattern5_3, - } => { - match pattern5_0 { - &Opcode::Uload16x4 => { - // Rule at src/isa/s390x/lower.isle line 2542. - let expr0_0: Type = I16X8; - let expr1_0: Type = I16X8; - let expr2_0 = constructor_load_v64( - ctx, expr1_0, pattern5_2, pattern5_1, pattern5_3, - ); - let expr3_0 = constructor_vec_unpacku_high(ctx, expr0_0, expr2_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - &Opcode::Sload16x4 => { - // Rule at src/isa/s390x/lower.isle line 2546. - let expr0_0: Type = I16X8; - let expr1_0: Type = I16X8; - let expr2_0 = constructor_load_v64( - ctx, expr1_0, pattern5_2, pattern5_1, pattern5_3, - ); - let expr3_0 = constructor_vec_unpacks_high(ctx, expr0_0, expr2_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - _ => {} - } - } - &InstructionData::Binary { - opcode: ref pattern5_0, - args: ref pattern5_1, - } => { - match pattern5_0 { - &Opcode::Umulhi => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/s390x/lower.isle line 375. - let expr0_0: Type = I32X4; - let expr1_0 = C::put_in_reg(ctx, pattern7_0); - let expr2_0 = C::put_in_reg(ctx, pattern7_1); - let expr3_0 = constructor_vec_umulhi(ctx, expr0_0, expr1_0, expr2_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - &Opcode::Smulhi => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/s390x/lower.isle line 413. - let expr0_0: Type = I32X4; - let expr1_0 = C::put_in_reg(ctx, pattern7_0); - let expr2_0 = C::put_in_reg(ctx, pattern7_1); - let expr3_0 = constructor_vec_smulhi(ctx, expr0_0, expr1_0, expr2_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - _ => {} - } - } - _ => {} - } - } - if pattern2_0 == I64X2 { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - match &pattern4_0 { - &InstructionData::Unary { - opcode: ref pattern5_0, - arg: pattern5_1, - } => { - match pattern5_0 { - &Opcode::FcvtToUintSat => { - let pattern7_0 = C::value_type(ctx, pattern5_1); - if pattern7_0 == F64X2 { - // Rule at src/isa/s390x/lower.isle line 1644. - let expr0_0: Type = F64X2; - let expr1_0 = FpuRoundMode::ToZero; - let expr2_0 = C::put_in_reg(ctx, pattern5_1); - let expr3_0 = - constructor_fcvt_to_uint_reg(ctx, expr0_0, &expr1_0, expr2_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - } - &Opcode::FcvtToSintSat => { - let pattern7_0 = C::value_type(ctx, pattern5_1); - if pattern7_0 == F64X2 { - // Rule at src/isa/s390x/lower.isle line 1690. - let expr0_0: Type = I64X2; - let expr1_0: Type = F64X2; - let expr2_0 = FpuRoundMode::ToZero; - let expr3_0 = C::put_in_reg(ctx, pattern5_1); - let expr4_0 = - constructor_fcvt_to_sint_reg(ctx, expr1_0, &expr2_0, expr3_0); - let expr5_0: Type = I64X2; - let expr6_0: u128 = 0i128 as u128; - let expr7_0 = constructor_vec_imm(ctx, expr5_0, expr6_0); - let expr8_0: Type = F64X2; - let expr9_0 = C::put_in_reg(ctx, pattern5_1); - let expr10_0 = C::put_in_reg(ctx, pattern5_1); - let expr11_0 = - constructor_vec_fcmpeq(ctx, expr8_0, expr9_0, expr10_0); - let expr12_0 = constructor_vec_select( - ctx, expr0_0, expr4_0, expr7_0, expr11_0, - ); - let expr13_0 = constructor_output_reg(ctx, expr12_0); - return Some(expr13_0); - } - } - _ => {} - } - } - &InstructionData::Load { - opcode: ref pattern5_0, - arg: pattern5_1, - flags: pattern5_2, - offset: pattern5_3, - } => { - match pattern5_0 { - &Opcode::Uload32x2 => { - // Rule at src/isa/s390x/lower.isle line 2550. - let expr0_0: Type = I32X4; - let expr1_0: Type = I32X4; - let expr2_0 = constructor_load_v64( - ctx, expr1_0, pattern5_2, pattern5_1, pattern5_3, - ); - let expr3_0 = constructor_vec_unpacku_high(ctx, expr0_0, expr2_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - &Opcode::Sload32x2 => { - // Rule at src/isa/s390x/lower.isle line 2554. - let expr0_0: Type = I32X4; - let expr1_0: Type = I32X4; - let expr2_0 = constructor_load_v64( - ctx, expr1_0, pattern5_2, pattern5_1, pattern5_3, - ); - let expr3_0 = constructor_vec_unpacks_high(ctx, expr0_0, expr2_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - _ => {} - } - } - &InstructionData::Binary { - opcode: ref pattern5_0, - args: ref pattern5_1, - } => { - match pattern5_0 { - &Opcode::Umulhi => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/s390x/lower.isle line 379. - let expr0_0: Type = I64X2; - let expr1_0 = C::put_in_reg(ctx, pattern7_0); - let expr2_0: u8 = 0i128 as u8; - let expr3_0 = C::zero_reg(ctx); - let expr4_0 = constructor_vec_extract_lane( - ctx, expr0_0, expr1_0, expr2_0, expr3_0, - ); - let expr5_0: Type = I64X2; - let expr6_0 = C::put_in_reg(ctx, pattern7_1); - let expr7_0: u8 = 0i128 as u8; - let expr8_0 = C::zero_reg(ctx); - let expr9_0 = constructor_vec_extract_lane( - ctx, expr5_0, expr6_0, expr7_0, expr8_0, - ); - let expr10_0 = constructor_umul_wide(ctx, expr4_0, expr9_0); - let expr11_0: Type = I64; - let expr12_0 = C::regpair_hi(ctx, expr10_0); - let expr13_0 = constructor_copy_reg(ctx, expr11_0, expr12_0); - let expr14_0: Type = I64X2; - let expr15_0 = C::put_in_reg(ctx, pattern7_0); - let expr16_0: u8 = 1i128 as u8; - let expr17_0 = C::zero_reg(ctx); - let expr18_0 = constructor_vec_extract_lane( - ctx, expr14_0, expr15_0, expr16_0, expr17_0, - ); - let expr19_0: Type = I64X2; - let expr20_0 = C::put_in_reg(ctx, pattern7_1); - let expr21_0: u8 = 1i128 as u8; - let expr22_0 = C::zero_reg(ctx); - let expr23_0 = constructor_vec_extract_lane( - ctx, expr19_0, expr20_0, expr21_0, expr22_0, - ); - let expr24_0 = constructor_umul_wide(ctx, expr18_0, expr23_0); - let expr25_0: Type = I64; - let expr26_0 = C::regpair_hi(ctx, expr24_0); - let expr27_0 = constructor_copy_reg(ctx, expr25_0, expr26_0); - let expr28_0: Type = I64X2; - let expr29_0 = - constructor_mov_to_vec128(ctx, expr28_0, expr13_0, expr27_0); - let expr30_0 = constructor_output_reg(ctx, expr29_0); - return Some(expr30_0); - } - &Opcode::Smulhi => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/s390x/lower.isle line 417. - let expr0_0: Type = I64X2; - let expr1_0 = C::put_in_reg(ctx, pattern7_0); - let expr2_0: u8 = 0i128 as u8; - let expr3_0 = C::zero_reg(ctx); - let expr4_0 = constructor_vec_extract_lane( - ctx, expr0_0, expr1_0, expr2_0, expr3_0, - ); - let expr5_0: Type = I64X2; - let expr6_0 = C::put_in_reg(ctx, pattern7_1); - let expr7_0: u8 = 0i128 as u8; - let expr8_0 = C::zero_reg(ctx); - let expr9_0 = constructor_vec_extract_lane( - ctx, expr5_0, expr6_0, expr7_0, expr8_0, - ); - let expr10_0 = constructor_smul_wide(ctx, expr4_0, expr9_0); - let expr11_0: Type = I64; - let expr12_0 = C::regpair_hi(ctx, expr10_0); - let expr13_0 = constructor_copy_reg(ctx, expr11_0, expr12_0); - let expr14_0: Type = I64X2; - let expr15_0 = C::put_in_reg(ctx, pattern7_0); - let expr16_0: u8 = 1i128 as u8; - let expr17_0 = C::zero_reg(ctx); - let expr18_0 = constructor_vec_extract_lane( - ctx, expr14_0, expr15_0, expr16_0, expr17_0, - ); - let expr19_0: Type = I64X2; - let expr20_0 = C::put_in_reg(ctx, pattern7_1); - let expr21_0: u8 = 1i128 as u8; - let expr22_0 = C::zero_reg(ctx); - let expr23_0 = constructor_vec_extract_lane( - ctx, expr19_0, expr20_0, expr21_0, expr22_0, - ); - let expr24_0 = constructor_smul_wide(ctx, expr18_0, expr23_0); - let expr25_0: Type = I64; - let expr26_0 = C::regpair_hi(ctx, expr24_0); - let expr27_0 = constructor_copy_reg(ctx, expr25_0, expr26_0); - let expr28_0: Type = I64X2; - let expr29_0 = - constructor_mov_to_vec128(ctx, expr28_0, expr13_0, expr27_0); - let expr30_0 = constructor_output_reg(ctx, expr29_0); - return Some(expr30_0); - } - _ => {} - } - } - _ => {} - } - } - if pattern2_0 == F32X4 { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - match &pattern4_0 { - &InstructionData::Unary { - opcode: ref pattern5_0, - arg: pattern5_1, - } => { - if let &Opcode::Fvdemote = pattern5_0 { - let pattern7_0 = C::value_type(ctx, pattern5_1); - if pattern7_0 == F64X2 { - // Rule at src/isa/s390x/lower.isle line 1470. - let expr0_0: Type = F32X4; - let expr1_0: Type = F64X2; - let expr2_0 = FpuRoundMode::Current; - let expr3_0 = C::put_in_reg(ctx, pattern5_1); - let expr4_0 = - constructor_fdemote_reg(ctx, expr0_0, expr1_0, &expr2_0, expr3_0); - let expr5_0: Type = I64X2; - let expr6_0: Type = I64X2; - let expr7_0: u8 = 32i128 as u8; - let expr8_0 = constructor_vec_lshr_imm(ctx, expr6_0, expr4_0, expr7_0); - let expr9_0: Type = I64X2; - let expr10_0: u128 = 0i128 as u128; - let expr11_0 = constructor_vec_imm(ctx, expr9_0, expr10_0); - let expr12_0 = - constructor_vec_pack_lane_order(ctx, expr5_0, expr8_0, expr11_0); - let expr13_0 = constructor_output_reg(ctx, expr12_0); - return Some(expr13_0); - } - } - } - &InstructionData::Binary { - opcode: ref pattern5_0, - args: ref pattern5_1, - } => { - if let &Opcode::Fcopysign = pattern5_0 { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/s390x/lower.isle line 1384. - let expr0_0: Type = F32X4; - let expr1_0 = C::put_in_reg(ctx, pattern7_0); - let expr2_0 = C::put_in_reg(ctx, pattern7_1); - let expr3_0: Type = F32X4; - let expr4_0: u8 = 1i128 as u8; - let expr5_0: u8 = 31i128 as u8; - let expr6_0 = constructor_vec_imm_bit_mask(ctx, expr3_0, expr4_0, expr5_0); - let expr7_0 = - constructor_vec_select(ctx, expr0_0, expr1_0, expr2_0, expr6_0); - let expr8_0 = constructor_output_reg(ctx, expr7_0); - return Some(expr8_0); - } - } - _ => {} - } - } - if pattern2_0 == F64X2 { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - match &pattern4_0 { - &InstructionData::Unary { - opcode: ref pattern5_0, - arg: pattern5_1, - } => { - match pattern5_0 { - &Opcode::FvpromoteLow => { - let pattern7_0 = C::value_type(ctx, pattern5_1); - if pattern7_0 == F32X4 { - // Rule at src/isa/s390x/lower.isle line 1456. - let expr0_0: Type = F64X2; - let expr1_0: Type = F32X4; - let expr2_0: Type = I32X4; - let expr3_0 = C::put_in_reg(ctx, pattern5_1); - let expr4_0 = C::put_in_reg(ctx, pattern5_1); - let expr5_0 = constructor_vec_merge_low_lane_order( - ctx, expr2_0, expr3_0, expr4_0, - ); - let expr6_0 = - constructor_fpromote_reg(ctx, expr0_0, expr1_0, expr5_0); - let expr7_0 = constructor_output_reg(ctx, expr6_0); - return Some(expr7_0); - } - } - &Opcode::FcvtFromUint => { - let pattern7_0 = C::value_type(ctx, pattern5_1); - if pattern7_0 == I64X2 { - // Rule at src/isa/s390x/lower.isle line 1513. - let expr0_0: Type = F64X2; - let expr1_0 = FpuRoundMode::ToNearestTiesToEven; - let expr2_0 = C::put_in_reg(ctx, pattern5_1); - let expr3_0 = - constructor_fcvt_from_uint_reg(ctx, expr0_0, &expr1_0, expr2_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - } - &Opcode::FcvtFromSint => { - let pattern7_0 = C::value_type(ctx, pattern5_1); - if pattern7_0 == I64X2 { - // Rule at src/isa/s390x/lower.isle line 1554. - let expr0_0: Type = F64X2; - let expr1_0 = FpuRoundMode::ToNearestTiesToEven; - let expr2_0 = C::put_in_reg(ctx, pattern5_1); - let expr3_0 = - constructor_fcvt_from_sint_reg(ctx, expr0_0, &expr1_0, expr2_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - } - &Opcode::FcvtLowFromSint => { - let pattern7_0 = C::value_type(ctx, pattern5_1); - if pattern7_0 == I32X4 { - // Rule at src/isa/s390x/lower.isle line 1561. - let expr0_0: Type = F64X2; - let expr1_0 = FpuRoundMode::ToNearestTiesToEven; - let expr2_0: Type = I32X4; - let expr3_0 = C::put_in_reg(ctx, pattern5_1); - let expr4_0 = - constructor_vec_unpacks_low_lane_order(ctx, expr2_0, expr3_0); - let expr5_0 = - constructor_fcvt_from_sint_reg(ctx, expr0_0, &expr1_0, expr4_0); - let expr6_0 = constructor_output_reg(ctx, expr5_0); - return Some(expr6_0); - } - } - _ => {} - } - } - &InstructionData::Binary { - opcode: ref pattern5_0, - args: ref pattern5_1, - } => { - if let &Opcode::Fcopysign = pattern5_0 { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/s390x/lower.isle line 1386. - let expr0_0: Type = F64X2; - let expr1_0 = C::put_in_reg(ctx, pattern7_0); - let expr2_0 = C::put_in_reg(ctx, pattern7_1); - let expr3_0: Type = F64X2; - let expr4_0: u8 = 1i128 as u8; - let expr5_0: u8 = 63i128 as u8; - let expr6_0 = constructor_vec_imm_bit_mask(ctx, expr3_0, expr4_0, expr5_0); - let expr7_0 = - constructor_vec_select(ctx, expr0_0, expr1_0, expr2_0, expr6_0); - let expr8_0 = constructor_output_reg(ctx, expr7_0); - return Some(expr8_0); - } - } - _ => {} - } - } - if let Some(()) = C::mie2_disabled(ctx, pattern2_0) { - if pattern2_0 == I16 { - let pattern5_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Unary { - opcode: ref pattern6_0, - arg: pattern6_1, - } = &pattern5_0 - { - if let &Opcode::Popcnt = pattern6_0 { - // Rule at src/isa/s390x/lower.isle line 1290. - let expr0_0 = C::put_in_reg(ctx, pattern6_1); - let expr1_0 = constructor_popcnt_byte(ctx, expr0_0); - let expr2_0: Type = I32; - let expr3_0: Type = I32; - let expr4_0: u8 = 8i128 as u8; - let expr5_0 = constructor_lshr_imm(ctx, expr3_0, expr1_0, expr4_0); - let expr6_0 = constructor_add_reg(ctx, expr2_0, expr1_0, expr5_0); - let expr7_0: Type = I32; - let expr8_0: u16 = 255i128 as u16; - let expr9_0: u8 = 0i128 as u8; - let expr10_0 = C::uimm16shifted(ctx, expr8_0, expr9_0); - let expr11_0 = - constructor_and_uimm16shifted(ctx, expr7_0, expr6_0, expr10_0); - let expr12_0 = constructor_output_reg(ctx, expr11_0); - return Some(expr12_0); - } - } - } - if pattern2_0 == I32 { - let pattern5_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Unary { - opcode: ref pattern6_0, - arg: pattern6_1, - } = &pattern5_0 - { - if let &Opcode::Popcnt = pattern6_0 { - // Rule at src/isa/s390x/lower.isle line 1295. - let expr0_0 = C::put_in_reg(ctx, pattern6_1); - let expr1_0 = constructor_popcnt_byte(ctx, expr0_0); - let expr2_0: Type = I32; - let expr3_0: Type = I32; - let expr4_0: u8 = 16i128 as u8; - let expr5_0 = constructor_lshl_imm(ctx, expr3_0, expr1_0, expr4_0); - let expr6_0 = constructor_add_reg(ctx, expr2_0, expr1_0, expr5_0); - let expr7_0: Type = I32; - let expr8_0: Type = I32; - let expr9_0: u8 = 8i128 as u8; - let expr10_0 = constructor_lshl_imm(ctx, expr8_0, expr6_0, expr9_0); - let expr11_0 = constructor_add_reg(ctx, expr7_0, expr6_0, expr10_0); - let expr12_0: Type = I32; - let expr13_0: u8 = 24i128 as u8; - let expr14_0 = constructor_lshr_imm(ctx, expr12_0, expr11_0, expr13_0); - let expr15_0 = constructor_output_reg(ctx, expr14_0); - return Some(expr15_0); - } - } - } - if pattern2_0 == I64 { - let pattern5_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Unary { - opcode: ref pattern6_0, - arg: pattern6_1, - } = &pattern5_0 - { - if let &Opcode::Popcnt = pattern6_0 { - // Rule at src/isa/s390x/lower.isle line 1301. - let expr0_0 = C::put_in_reg(ctx, pattern6_1); - let expr1_0 = constructor_popcnt_byte(ctx, expr0_0); - let expr2_0: Type = I64; - let expr3_0: Type = I64; - let expr4_0: u8 = 32i128 as u8; - let expr5_0 = constructor_lshl_imm(ctx, expr3_0, expr1_0, expr4_0); - let expr6_0 = constructor_add_reg(ctx, expr2_0, expr1_0, expr5_0); - let expr7_0: Type = I64; - let expr8_0: Type = I64; - let expr9_0: u8 = 16i128 as u8; - let expr10_0 = constructor_lshl_imm(ctx, expr8_0, expr6_0, expr9_0); - let expr11_0 = constructor_add_reg(ctx, expr7_0, expr6_0, expr10_0); - let expr12_0: Type = I64; - let expr13_0: Type = I64; - let expr14_0: u8 = 8i128 as u8; - let expr15_0 = constructor_lshl_imm(ctx, expr13_0, expr11_0, expr14_0); - let expr16_0 = constructor_add_reg(ctx, expr12_0, expr11_0, expr15_0); - let expr17_0: Type = I64; - let expr18_0: u8 = 56i128 as u8; - let expr19_0 = constructor_lshr_imm(ctx, expr17_0, expr16_0, expr18_0); - let expr20_0 = constructor_output_reg(ctx, expr19_0); - return Some(expr20_0); - } - } - } - } - if let Some(()) = C::vxrs_ext2_disabled(ctx, pattern2_0) { - if pattern2_0 == I32X4 { - let pattern5_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Unary { - opcode: ref pattern6_0, - arg: pattern6_1, - } = &pattern5_0 - { - match pattern6_0 { - &Opcode::FcvtToUintSat => { - let pattern8_0 = C::value_type(ctx, pattern6_1); - if pattern8_0 == F32X4 { - // Rule at src/isa/s390x/lower.isle line 1635. - let expr0_0: Type = I64X2; - let expr1_0: Type = F64X2; - let expr2_0 = FpuRoundMode::ToZero; - let expr3_0: Type = F64X2; - let expr4_0: Type = F32X4; - let expr5_0: Type = I32X4; - let expr6_0 = C::put_in_reg(ctx, pattern6_1); - let expr7_0 = C::put_in_reg(ctx, pattern6_1); - let expr8_0 = - constructor_vec_merge_high(ctx, expr5_0, expr6_0, expr7_0); - let expr9_0 = - constructor_fpromote_reg(ctx, expr3_0, expr4_0, expr8_0); - let expr10_0 = - constructor_fcvt_to_uint_reg(ctx, expr1_0, &expr2_0, expr9_0); - let expr11_0: Type = F64X2; - let expr12_0 = FpuRoundMode::ToZero; - let expr13_0: Type = F64X2; - let expr14_0: Type = F32X4; - let expr15_0: Type = I32X4; - let expr16_0 = C::put_in_reg(ctx, pattern6_1); - let expr17_0 = C::put_in_reg(ctx, pattern6_1); - let expr18_0 = - constructor_vec_merge_low(ctx, expr15_0, expr16_0, expr17_0); - let expr19_0 = - constructor_fpromote_reg(ctx, expr13_0, expr14_0, expr18_0); - let expr20_0 = constructor_fcvt_to_uint_reg( - ctx, expr11_0, &expr12_0, expr19_0, - ); - let expr21_0 = - constructor_vec_pack_usat(ctx, expr0_0, expr10_0, expr20_0); - let expr22_0 = constructor_output_reg(ctx, expr21_0); - return Some(expr22_0); - } - } - &Opcode::FcvtToSintSat => { - let pattern8_0 = C::value_type(ctx, pattern6_1); - if pattern8_0 == F32X4 { - // Rule at src/isa/s390x/lower.isle line 1678. - let expr0_0: Type = I32X4; - let expr1_0: Type = I64X2; - let expr2_0: Type = F64X2; - let expr3_0 = FpuRoundMode::ToZero; - let expr4_0: Type = F64X2; - let expr5_0: Type = F32X4; - let expr6_0: Type = I32X4; - let expr7_0 = C::put_in_reg(ctx, pattern6_1); - let expr8_0 = C::put_in_reg(ctx, pattern6_1); - let expr9_0 = - constructor_vec_merge_high(ctx, expr6_0, expr7_0, expr8_0); - let expr10_0 = - constructor_fpromote_reg(ctx, expr4_0, expr5_0, expr9_0); - let expr11_0 = - constructor_fcvt_to_sint_reg(ctx, expr2_0, &expr3_0, expr10_0); - let expr12_0: Type = F64X2; - let expr13_0 = FpuRoundMode::ToZero; - let expr14_0: Type = F64X2; - let expr15_0: Type = F32X4; - let expr16_0: Type = I32X4; - let expr17_0 = C::put_in_reg(ctx, pattern6_1); - let expr18_0 = C::put_in_reg(ctx, pattern6_1); - let expr19_0 = - constructor_vec_merge_low(ctx, expr16_0, expr17_0, expr18_0); - let expr20_0 = - constructor_fpromote_reg(ctx, expr14_0, expr15_0, expr19_0); - let expr21_0 = constructor_fcvt_to_sint_reg( - ctx, expr12_0, &expr13_0, expr20_0, - ); - let expr22_0 = - constructor_vec_pack_ssat(ctx, expr1_0, expr11_0, expr21_0); - let expr23_0: Type = I32X4; - let expr24_0: u128 = 0i128 as u128; - let expr25_0 = constructor_vec_imm(ctx, expr23_0, expr24_0); - let expr26_0: Type = F32X4; - let expr27_0 = C::put_in_reg(ctx, pattern6_1); - let expr28_0 = C::put_in_reg(ctx, pattern6_1); - let expr29_0 = - constructor_vec_fcmpeq(ctx, expr26_0, expr27_0, expr28_0); - let expr30_0 = constructor_vec_select( - ctx, expr0_0, expr22_0, expr25_0, expr29_0, - ); - let expr31_0 = constructor_output_reg(ctx, expr30_0); - return Some(expr31_0); - } - } - _ => {} - } - } - } - if pattern2_0 == F32X4 { - let pattern5_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Unary { - opcode: ref pattern6_0, - arg: pattern6_1, - } = &pattern5_0 - { - match pattern6_0 { - &Opcode::FcvtFromUint => { - let pattern8_0 = C::value_type(ctx, pattern6_1); - if pattern8_0 == I32X4 { - // Rule at src/isa/s390x/lower.isle line 1501. - let expr0_0: Type = F32X4; - let expr1_0: Type = F32X4; - let expr2_0: Type = F64X2; - let expr3_0 = FpuRoundMode::ToNearestTiesToEven; - let expr4_0: Type = F64X2; - let expr5_0 = FpuRoundMode::ShorterPrecision; - let expr6_0: Type = I32X4; - let expr7_0 = C::put_in_reg(ctx, pattern6_1); - let expr8_0 = constructor_vec_unpacku_high(ctx, expr6_0, expr7_0); - let expr9_0 = - constructor_fcvt_from_uint_reg(ctx, expr4_0, &expr5_0, expr8_0); - let expr10_0 = constructor_fdemote_reg( - ctx, expr1_0, expr2_0, &expr3_0, expr9_0, - ); - let expr11_0: Type = F32X4; - let expr12_0: Type = F64X2; - let expr13_0 = FpuRoundMode::ToNearestTiesToEven; - let expr14_0: Type = F64X2; - let expr15_0 = FpuRoundMode::ShorterPrecision; - let expr16_0: Type = I32X4; - let expr17_0 = C::put_in_reg(ctx, pattern6_1); - let expr18_0 = constructor_vec_unpacku_low(ctx, expr16_0, expr17_0); - let expr19_0 = constructor_fcvt_from_uint_reg( - ctx, expr14_0, &expr15_0, expr18_0, - ); - let expr20_0 = constructor_fdemote_reg( - ctx, expr11_0, expr12_0, &expr13_0, expr19_0, - ); - let expr21_0: Type = I8X16; - let expr22_0: u8 = 0i128 as u8; - let expr23_0: u8 = 1i128 as u8; - let expr24_0: u8 = 2i128 as u8; - let expr25_0: u8 = 3i128 as u8; - let expr26_0: u8 = 8i128 as u8; - let expr27_0: u8 = 9i128 as u8; - let expr28_0: u8 = 10i128 as u8; - let expr29_0: u8 = 11i128 as u8; - let expr30_0: u8 = 16i128 as u8; - let expr31_0: u8 = 17i128 as u8; - let expr32_0: u8 = 18i128 as u8; - let expr33_0: u8 = 19i128 as u8; - let expr34_0: u8 = 24i128 as u8; - let expr35_0: u8 = 25i128 as u8; - let expr36_0: u8 = 26i128 as u8; - let expr37_0: u8 = 27i128 as u8; - let expr38_0 = constructor_imm8x16( - ctx, expr22_0, expr23_0, expr24_0, expr25_0, expr26_0, - expr27_0, expr28_0, expr29_0, expr30_0, expr31_0, expr32_0, - expr33_0, expr34_0, expr35_0, expr36_0, expr37_0, - ); - let expr39_0 = constructor_vec_imm(ctx, expr21_0, expr38_0); - let expr40_0 = constructor_vec_permute( - ctx, expr0_0, expr10_0, expr20_0, expr39_0, - ); - let expr41_0 = constructor_output_reg(ctx, expr40_0); - return Some(expr41_0); - } - } - &Opcode::FcvtFromSint => { - let pattern8_0 = C::value_type(ctx, pattern6_1); - if pattern8_0 == I32X4 { - // Rule at src/isa/s390x/lower.isle line 1542. - let expr0_0: Type = F32X4; - let expr1_0: Type = F32X4; - let expr2_0: Type = F64X2; - let expr3_0 = FpuRoundMode::ToNearestTiesToEven; - let expr4_0: Type = F64X2; - let expr5_0 = FpuRoundMode::ShorterPrecision; - let expr6_0: Type = I32X4; - let expr7_0 = C::put_in_reg(ctx, pattern6_1); - let expr8_0 = constructor_vec_unpacks_high(ctx, expr6_0, expr7_0); - let expr9_0 = - constructor_fcvt_from_sint_reg(ctx, expr4_0, &expr5_0, expr8_0); - let expr10_0 = constructor_fdemote_reg( - ctx, expr1_0, expr2_0, &expr3_0, expr9_0, - ); - let expr11_0: Type = F32X4; - let expr12_0: Type = F64X2; - let expr13_0 = FpuRoundMode::ToNearestTiesToEven; - let expr14_0: Type = F64X2; - let expr15_0 = FpuRoundMode::ShorterPrecision; - let expr16_0: Type = I32X4; - let expr17_0 = C::put_in_reg(ctx, pattern6_1); - let expr18_0 = constructor_vec_unpacks_low(ctx, expr16_0, expr17_0); - let expr19_0 = constructor_fcvt_from_sint_reg( - ctx, expr14_0, &expr15_0, expr18_0, - ); - let expr20_0 = constructor_fdemote_reg( - ctx, expr11_0, expr12_0, &expr13_0, expr19_0, - ); - let expr21_0: Type = I8X16; - let expr22_0: u8 = 0i128 as u8; - let expr23_0: u8 = 1i128 as u8; - let expr24_0: u8 = 2i128 as u8; - let expr25_0: u8 = 3i128 as u8; - let expr26_0: u8 = 8i128 as u8; - let expr27_0: u8 = 9i128 as u8; - let expr28_0: u8 = 10i128 as u8; - let expr29_0: u8 = 11i128 as u8; - let expr30_0: u8 = 16i128 as u8; - let expr31_0: u8 = 17i128 as u8; - let expr32_0: u8 = 18i128 as u8; - let expr33_0: u8 = 19i128 as u8; - let expr34_0: u8 = 24i128 as u8; - let expr35_0: u8 = 25i128 as u8; - let expr36_0: u8 = 26i128 as u8; - let expr37_0: u8 = 27i128 as u8; - let expr38_0 = constructor_imm8x16( - ctx, expr22_0, expr23_0, expr24_0, expr25_0, expr26_0, - expr27_0, expr28_0, expr29_0, expr30_0, expr31_0, expr32_0, - expr33_0, expr34_0, expr35_0, expr36_0, expr37_0, - ); - let expr39_0 = constructor_vec_imm(ctx, expr21_0, expr38_0); - let expr40_0 = constructor_vec_permute( - ctx, expr0_0, expr10_0, expr20_0, expr39_0, - ); - let expr41_0 = constructor_output_reg(ctx, expr40_0); - return Some(expr41_0); - } - } - _ => {} - } - } - } - } - if let Some((pattern3_0, pattern3_1)) = C::multi_lane(ctx, pattern2_0) { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Binary { - opcode: ref pattern5_0, - args: ref pattern5_1, - } = &pattern4_0 - { - if let &Opcode::IaddPairwise = pattern5_0 { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/s390x/lower.isle line 135. - let expr0_0: Type = I8X16; - let expr1_0 = C::u32_as_u64(ctx, pattern3_0); - let expr2_0 = constructor_vec_imm_splat(ctx, expr0_0, expr1_0); - let expr3_0 = constructor_vec_widen_type(ctx, pattern2_0); - let expr4_0 = C::put_in_reg(ctx, pattern7_0); - let expr5_0 = C::put_in_reg(ctx, pattern7_0); - let expr6_0 = constructor_vec_lshr_by_byte(ctx, expr5_0, expr2_0); - let expr7_0 = constructor_vec_add(ctx, pattern2_0, expr4_0, expr6_0); - let expr8_0 = C::put_in_reg(ctx, pattern7_1); - let expr9_0 = C::put_in_reg(ctx, pattern7_1); - let expr10_0 = constructor_vec_lshr_by_byte(ctx, expr9_0, expr2_0); - let expr11_0 = constructor_vec_add(ctx, pattern2_0, expr8_0, expr10_0); - let expr12_0 = constructor_vec_pack_lane_order(ctx, expr3_0, expr7_0, expr11_0); - let expr13_0 = constructor_output_reg(ctx, expr12_0); - return Some(expr13_0); - } - } - } - if let Some(pattern3_0) = C::fits_in_64(ctx, pattern2_0) { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - match &pattern4_0 { - &InstructionData::Unary { - opcode: ref pattern5_0, - arg: pattern5_1, - } => { - match pattern5_0 { - &Opcode::VanyTrue => { - // Rule at src/isa/s390x/lower.isle line 3542. - let expr0_0 = constructor_vany_true_val(ctx, pattern5_1); - let expr1_0 = constructor_lower_bool(ctx, pattern3_0, &expr0_0); - let expr2_0 = constructor_output_reg(ctx, expr1_0); - return Some(expr2_0); - } - &Opcode::VallTrue => { - // Rule at src/isa/s390x/lower.isle line 3464. - let expr0_0 = constructor_vall_true_val(ctx, pattern5_1); - let expr1_0 = constructor_lower_bool(ctx, pattern3_0, &expr0_0); - let expr2_0 = constructor_output_reg(ctx, expr1_0); - return Some(expr2_0); - } - &Opcode::Fpromote => { - let pattern7_0 = C::value_type(ctx, pattern5_1); - // Rule at src/isa/s390x/lower.isle line 1449. - let expr0_0 = C::put_in_reg(ctx, pattern5_1); - let expr1_0 = - constructor_fpromote_reg(ctx, pattern3_0, pattern7_0, expr0_0); - let expr2_0 = constructor_output_reg(ctx, expr1_0); - return Some(expr2_0); - } - &Opcode::Fdemote => { - let pattern7_0 = C::value_type(ctx, pattern5_1); - // Rule at src/isa/s390x/lower.isle line 1463. - let expr0_0 = FpuRoundMode::Current; - let expr1_0 = C::put_in_reg(ctx, pattern5_1); - let expr2_0 = constructor_fdemote_reg( - ctx, pattern3_0, pattern7_0, &expr0_0, expr1_0, - ); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::FcvtToUint => { - let pattern7_0 = C::value_type(ctx, pattern5_1); - // Rule at src/isa/s390x/lower.isle line 1570. - let expr0_0 = C::put_in_reg(ctx, pattern5_1); - let expr1_0 = constructor_fcmp_reg(ctx, pattern7_0, expr0_0, expr0_0); - let expr2_0 = FloatCC::Unordered; - let expr3_0 = C::floatcc_as_cond(ctx, &expr2_0); - let expr4_0 = C::trap_code_bad_conversion_to_integer(ctx); - let expr5_0 = constructor_trap_if(ctx, &expr1_0, &expr3_0, &expr4_0); - let expr6_0 = constructor_fcvt_to_uint_ub(ctx, pattern7_0, pattern3_0); - let expr7_0 = constructor_fcmp_reg(ctx, pattern7_0, expr0_0, expr6_0); - let expr8_0 = FloatCC::GreaterThanOrEqual; - let expr9_0 = C::floatcc_as_cond(ctx, &expr8_0); - let expr10_0 = C::trap_code_integer_overflow(ctx); - let expr11_0 = constructor_trap_if(ctx, &expr7_0, &expr9_0, &expr10_0); - let expr12_0 = constructor_fcvt_to_uint_lb(ctx, pattern7_0); - let expr13_0 = constructor_fcmp_reg(ctx, pattern7_0, expr0_0, expr12_0); - let expr14_0 = FloatCC::LessThanOrEqual; - let expr15_0 = C::floatcc_as_cond(ctx, &expr14_0); - let expr16_0 = C::trap_code_integer_overflow(ctx); - let expr17_0 = - constructor_trap_if(ctx, &expr13_0, &expr15_0, &expr16_0); - let expr18_0 = constructor_fcvt_flt_ty(ctx, pattern3_0, pattern7_0); - let expr19_0 = - constructor_fpromote_reg(ctx, expr18_0, pattern7_0, expr0_0); - let expr20_0 = FpuRoundMode::ToZero; - let expr21_0 = - constructor_fcvt_to_uint_reg(ctx, expr18_0, &expr20_0, expr19_0); - let expr22_0 = constructor_output_reg(ctx, expr21_0); - return Some(expr22_0); - } - &Opcode::FcvtToSint => { - let pattern7_0 = C::value_type(ctx, pattern5_1); - // Rule at src/isa/s390x/lower.isle line 1594. - let expr0_0 = C::put_in_reg(ctx, pattern5_1); - let expr1_0 = constructor_fcmp_reg(ctx, pattern7_0, expr0_0, expr0_0); - let expr2_0 = FloatCC::Unordered; - let expr3_0 = C::floatcc_as_cond(ctx, &expr2_0); - let expr4_0 = C::trap_code_bad_conversion_to_integer(ctx); - let expr5_0 = constructor_trap_if(ctx, &expr1_0, &expr3_0, &expr4_0); - let expr6_0 = constructor_fcvt_to_sint_ub(ctx, pattern7_0, pattern3_0); - let expr7_0 = constructor_fcmp_reg(ctx, pattern7_0, expr0_0, expr6_0); - let expr8_0 = FloatCC::GreaterThanOrEqual; - let expr9_0 = C::floatcc_as_cond(ctx, &expr8_0); - let expr10_0 = C::trap_code_integer_overflow(ctx); - let expr11_0 = constructor_trap_if(ctx, &expr7_0, &expr9_0, &expr10_0); - let expr12_0 = constructor_fcvt_to_sint_lb(ctx, pattern7_0, pattern3_0); - let expr13_0 = constructor_fcmp_reg(ctx, pattern7_0, expr0_0, expr12_0); - let expr14_0 = FloatCC::LessThanOrEqual; - let expr15_0 = C::floatcc_as_cond(ctx, &expr14_0); - let expr16_0 = C::trap_code_integer_overflow(ctx); - let expr17_0 = - constructor_trap_if(ctx, &expr13_0, &expr15_0, &expr16_0); - let expr18_0 = constructor_fcvt_flt_ty(ctx, pattern3_0, pattern7_0); - let expr19_0 = - constructor_fpromote_reg(ctx, expr18_0, pattern7_0, expr0_0); - let expr20_0 = FpuRoundMode::ToZero; - let expr21_0 = - constructor_fcvt_to_sint_reg(ctx, expr18_0, &expr20_0, expr19_0); - let expr22_0 = constructor_output_reg(ctx, expr21_0); - return Some(expr22_0); - } - _ => {} - } - } - &InstructionData::Binary { - opcode: ref pattern5_0, - args: ref pattern5_1, - } => { - match pattern5_0 { - &Opcode::Iadd => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/s390x/lower.isle line 67. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = C::put_in_reg(ctx, pattern7_1); - let expr2_0 = constructor_add_reg(ctx, pattern3_0, expr0_0, expr1_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::Isub => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/s390x/lower.isle line 145. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = C::put_in_reg(ctx, pattern7_1); - let expr2_0 = constructor_sub_reg(ctx, pattern3_0, expr0_0, expr1_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::Imul => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/s390x/lower.isle line 277. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = C::put_in_reg(ctx, pattern7_1); - let expr2_0 = constructor_mul_reg(ctx, pattern3_0, expr0_0, expr1_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::Udiv => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/s390x/lower.isle line 477. - let expr0_0 = constructor_zero_divisor_check_needed(ctx, pattern7_1); - let expr1_0 = constructor_ty_ext32(ctx, pattern3_0); - let expr2_0: u64 = 0i128 as u64; - let expr3_0 = constructor_imm(ctx, expr1_0, expr2_0); - let expr4_0 = constructor_put_in_reg_zext32(ctx, pattern7_0); - let expr5_0 = C::regpair(ctx, expr3_0, expr4_0); - let expr6_0 = constructor_put_in_reg_zext32(ctx, pattern7_1); - let expr7_0 = constructor_ty_ext32(ctx, pattern3_0); - let expr8_0 = constructor_maybe_trap_if_zero_divisor( - ctx, expr0_0, expr7_0, expr6_0, - ); - let expr9_0 = constructor_udivmod(ctx, expr7_0, expr5_0, expr6_0); - let expr10_0 = C::regpair_lo(ctx, expr9_0); - let expr11_0 = constructor_copy_reg(ctx, pattern3_0, expr10_0); - let expr12_0 = constructor_output_reg(ctx, expr11_0); - return Some(expr12_0); - } - &Opcode::Sdiv => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/s390x/lower.isle line 551. - let expr0_0 = constructor_zero_divisor_check_needed(ctx, pattern7_1); - let expr1_0 = constructor_div_overflow_check_needed(ctx, pattern7_1); - let expr2_0 = constructor_put_in_reg_sext64(ctx, pattern7_0); - let expr3_0 = constructor_put_in_reg_sext32(ctx, pattern7_1); - let expr4_0 = constructor_ty_ext32(ctx, pattern3_0); - let expr5_0 = constructor_maybe_trap_if_zero_divisor( - ctx, expr0_0, expr4_0, expr3_0, - ); - let expr6_0 = constructor_maybe_trap_if_sdiv_overflow( - ctx, expr1_0, expr4_0, pattern3_0, expr2_0, expr3_0, - ); - let expr7_0 = constructor_sdivmod(ctx, expr4_0, expr2_0, expr3_0); - let expr8_0 = C::regpair_lo(ctx, expr7_0); - let expr9_0 = constructor_copy_reg(ctx, pattern3_0, expr8_0); - let expr10_0 = constructor_output_reg(ctx, expr9_0); - return Some(expr10_0); - } - &Opcode::Urem => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/s390x/lower.isle line 500. - let expr0_0 = constructor_zero_divisor_check_needed(ctx, pattern7_1); - let expr1_0 = constructor_ty_ext32(ctx, pattern3_0); - let expr2_0: u64 = 0i128 as u64; - let expr3_0 = constructor_imm(ctx, expr1_0, expr2_0); - let expr4_0 = constructor_put_in_reg_zext32(ctx, pattern7_0); - let expr5_0 = C::regpair(ctx, expr3_0, expr4_0); - let expr6_0 = constructor_put_in_reg_zext32(ctx, pattern7_1); - let expr7_0 = constructor_ty_ext32(ctx, pattern3_0); - let expr8_0 = constructor_maybe_trap_if_zero_divisor( - ctx, expr0_0, expr7_0, expr6_0, - ); - let expr9_0 = constructor_udivmod(ctx, expr7_0, expr5_0, expr6_0); - let expr10_0 = C::regpair_hi(ctx, expr9_0); - let expr11_0 = constructor_copy_reg(ctx, pattern3_0, expr10_0); - let expr12_0 = constructor_output_reg(ctx, expr11_0); - return Some(expr12_0); - } - &Opcode::Srem => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/s390x/lower.isle line 573. - let expr0_0 = constructor_zero_divisor_check_needed(ctx, pattern7_1); - let expr1_0 = constructor_div_overflow_check_needed(ctx, pattern7_1); - let expr2_0 = constructor_put_in_reg_sext64(ctx, pattern7_0); - let expr3_0 = constructor_put_in_reg_sext32(ctx, pattern7_1); - let expr4_0 = constructor_ty_ext32(ctx, pattern3_0); - let expr5_0 = constructor_maybe_trap_if_zero_divisor( - ctx, expr0_0, expr4_0, expr3_0, - ); - let expr6_0 = constructor_maybe_avoid_srem_overflow( - ctx, expr1_0, expr4_0, expr2_0, expr3_0, - ); - let expr7_0 = constructor_sdivmod(ctx, expr4_0, expr6_0, expr3_0); - let expr8_0 = C::regpair_hi(ctx, expr7_0); - let expr9_0 = constructor_copy_reg(ctx, pattern3_0, expr8_0); - let expr10_0 = constructor_output_reg(ctx, expr9_0); - return Some(expr10_0); - } - &Opcode::Ishl => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/s390x/lower.isle line 653. - let expr0_0 = constructor_amt_reg(ctx, pattern7_1); - let expr1_0 = constructor_mask_amt_reg(ctx, pattern3_0, expr0_0); - let expr2_0 = C::put_in_reg(ctx, pattern7_0); - let expr3_0 = constructor_lshl_reg(ctx, pattern3_0, expr2_0, expr1_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - &Opcode::Ushr => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/s390x/lower.isle line 681. - let expr0_0 = constructor_put_in_reg_zext32(ctx, pattern7_0); - let expr1_0 = constructor_amt_reg(ctx, pattern7_1); - let expr2_0 = constructor_mask_amt_reg(ctx, pattern3_0, expr1_0); - let expr3_0 = constructor_ty_ext32(ctx, pattern3_0); - let expr4_0 = constructor_lshr_reg(ctx, expr3_0, expr0_0, expr2_0); - let expr5_0 = constructor_output_reg(ctx, expr4_0); - return Some(expr5_0); - } - &Opcode::Sshr => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/s390x/lower.isle line 712. - let expr0_0 = constructor_put_in_reg_sext32(ctx, pattern7_0); - let expr1_0 = constructor_amt_reg(ctx, pattern7_1); - let expr2_0 = constructor_mask_amt_reg(ctx, pattern3_0, expr1_0); - let expr3_0 = constructor_ty_ext32(ctx, pattern3_0); - let expr4_0 = constructor_ashr_reg(ctx, expr3_0, expr0_0, expr2_0); - let expr5_0 = constructor_output_reg(ctx, expr4_0); - return Some(expr5_0); - } - _ => {} - } - } - &InstructionData::IntAddTrap { - opcode: ref pattern5_0, - args: ref pattern5_1, - code: ref pattern5_2, - } => { - if let &Opcode::UaddOverflowTrap = pattern5_0 { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/s390x/lower.isle line 3826. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = C::put_in_reg(ctx, pattern7_1); - let expr2_0 = constructor_add_logical_reg_with_flags_paired( - ctx, pattern3_0, expr0_0, expr1_0, - ); - let expr3_0: u8 = 3i128 as u8; - let expr4_0 = C::mask_as_cond(ctx, expr3_0); - let expr5_0 = constructor_trap_if_impl(ctx, &expr4_0, pattern5_2); - let expr6_0 = constructor_with_flags(ctx, &expr2_0, &expr5_0); - let expr7_0 = C::output(ctx, expr6_0); - return Some(expr7_0); - } - } - _ => {} - } - } - if let Some(pattern3_0) = C::ty_32_or_64(ctx, pattern2_0) { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - match &pattern4_0 { - &InstructionData::Binary { - opcode: ref pattern5_0, - args: ref pattern5_1, - } => { - match pattern5_0 { - &Opcode::Rotl => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/s390x/lower.isle line 742. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = constructor_amt_reg(ctx, pattern7_1); - let expr2_0 = constructor_rot_reg(ctx, pattern3_0, expr0_0, expr1_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::Rotr => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/s390x/lower.isle line 797. - let expr0_0: Type = I32; - let expr1_0 = constructor_amt_reg(ctx, pattern7_1); - let expr2_0 = constructor_neg_reg(ctx, expr0_0, expr1_0); - let expr3_0 = C::put_in_reg(ctx, pattern7_0); - let expr4_0 = constructor_rot_reg(ctx, pattern3_0, expr3_0, expr2_0); - let expr5_0 = constructor_output_reg(ctx, expr4_0); - return Some(expr5_0); - } - _ => {} - } - } - &InstructionData::AtomicRmw { - opcode: ref pattern5_0, - args: ref pattern5_1, - flags: pattern5_2, - op: ref pattern5_3, - } => { - if let &Opcode::AtomicRmw = pattern5_0 { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - if let Some(()) = C::littleendian(ctx, pattern5_2) { - match pattern5_3 { - &AtomicRmwOp::And => { - // Rule at src/isa/s390x/lower.isle line 2860. - let expr0_0 = C::put_in_reg(ctx, pattern7_1); - let expr1_0 = constructor_bswap_reg(ctx, pattern3_0, expr0_0); - let expr2_0 = C::zero_offset(ctx); - let expr3_0 = constructor_lower_address( - ctx, pattern5_2, pattern7_0, expr2_0, - ); - let expr4_0 = constructor_atomic_rmw_and( - ctx, pattern3_0, expr1_0, &expr3_0, - ); - let expr5_0 = constructor_bswap_reg(ctx, pattern3_0, expr4_0); - let expr6_0 = constructor_output_reg(ctx, expr5_0); - return Some(expr6_0); - } - &AtomicRmwOp::Or => { - // Rule at src/isa/s390x/lower.isle line 2872. - let expr0_0 = C::put_in_reg(ctx, pattern7_1); - let expr1_0 = constructor_bswap_reg(ctx, pattern3_0, expr0_0); - let expr2_0 = C::zero_offset(ctx); - let expr3_0 = constructor_lower_address( - ctx, pattern5_2, pattern7_0, expr2_0, - ); - let expr4_0 = constructor_atomic_rmw_or( - ctx, pattern3_0, expr1_0, &expr3_0, - ); - let expr5_0 = constructor_bswap_reg(ctx, pattern3_0, expr4_0); - let expr6_0 = constructor_output_reg(ctx, expr5_0); - return Some(expr6_0); - } - &AtomicRmwOp::Xor => { - // Rule at src/isa/s390x/lower.isle line 2884. - let expr0_0 = C::put_in_reg(ctx, pattern7_1); - let expr1_0 = constructor_bswap_reg(ctx, pattern3_0, expr0_0); - let expr2_0 = C::zero_offset(ctx); - let expr3_0 = constructor_lower_address( - ctx, pattern5_2, pattern7_0, expr2_0, - ); - let expr4_0 = constructor_atomic_rmw_xor( - ctx, pattern3_0, expr1_0, &expr3_0, - ); - let expr5_0 = constructor_bswap_reg(ctx, pattern3_0, expr4_0); - let expr6_0 = constructor_output_reg(ctx, expr5_0); - return Some(expr6_0); - } - _ => {} - } - } - if let Some(()) = C::bigendian(ctx, pattern5_2) { - match pattern5_3 { - &AtomicRmwOp::Add => { - // Rule at src/isa/s390x/lower.isle line 2890. - let expr0_0 = C::put_in_reg(ctx, pattern7_1); - let expr1_0 = C::zero_offset(ctx); - let expr2_0 = constructor_lower_address( - ctx, pattern5_2, pattern7_0, expr1_0, - ); - let expr3_0 = constructor_atomic_rmw_add( - ctx, pattern3_0, expr0_0, &expr2_0, - ); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - &AtomicRmwOp::Sub => { - // Rule at src/isa/s390x/lower.isle line 2896. - let expr0_0 = C::put_in_reg(ctx, pattern7_1); - let expr1_0 = constructor_neg_reg(ctx, pattern3_0, expr0_0); - let expr2_0 = C::zero_offset(ctx); - let expr3_0 = constructor_lower_address( - ctx, pattern5_2, pattern7_0, expr2_0, - ); - let expr4_0 = constructor_atomic_rmw_add( - ctx, pattern3_0, expr1_0, &expr3_0, - ); - let expr5_0 = constructor_output_reg(ctx, expr4_0); - return Some(expr5_0); - } - _ => {} - } - } - } - } - _ => {} - } - } - if let Some(pattern3_0) = C::ty_8_or_16(ctx, pattern2_0) { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::AtomicCas { - opcode: ref pattern5_0, - args: ref pattern5_1, - flags: pattern5_2, - } = &pattern4_0 - { - if let &Opcode::AtomicCas = pattern5_0 { - let (pattern7_0, pattern7_1, pattern7_2) = - C::unpack_value_array_3(ctx, pattern5_1); - // Rule at src/isa/s390x/lower.isle line 3124. - let expr0_0 = C::put_in_reg(ctx, pattern7_1); - let expr1_0 = C::put_in_reg(ctx, pattern7_2); - let expr2_0 = C::put_in_reg(ctx, pattern7_0); - let expr3_0 = constructor_casloop_bitshift(ctx, expr2_0); - let expr4_0 = constructor_casloop_aligned_addr(ctx, expr2_0); - let expr5_0 = C::inst_builder_new(ctx); - let expr6_0 = constructor_casloop_val_reg(ctx); - let expr7_0 = C::writable_reg_to_reg(ctx, expr6_0); - let expr8_0 = constructor_casloop_rotate_in( - ctx, &expr5_0, pattern3_0, pattern5_2, expr3_0, expr7_0, - ); - let expr9_0 = constructor_casloop_tmp_reg(ctx); - let expr10_0 = constructor_atomic_cas_body( - ctx, &expr5_0, pattern3_0, pattern5_2, expr9_0, expr8_0, expr0_0, expr1_0, - ); - let expr11_0 = constructor_casloop_rotate_out( - ctx, &expr5_0, pattern3_0, pattern5_2, expr3_0, expr10_0, - ); - let expr12_0 = constructor_casloop_subword( - ctx, &expr5_0, pattern3_0, pattern5_2, expr4_0, expr3_0, expr11_0, - ); - let expr13_0 = constructor_output_reg(ctx, expr12_0); - return Some(expr13_0); - } - } - } - if let Some(pattern3_0) = C::ty_scalar_float(ctx, pattern2_0) { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::BinaryImm8 { - opcode: ref pattern5_0, - arg: pattern5_1, - imm: pattern5_2, - } = &pattern4_0 - { - if let &Opcode::Extractlane = pattern5_0 { - let pattern7_0 = C::value_type(ctx, pattern5_1); - let pattern8_0 = C::u8_from_uimm8(ctx, pattern5_2); - // Rule at src/isa/s390x/lower.isle line 1868. - let expr0_0 = C::put_in_reg(ctx, pattern5_1); - let expr1_0 = C::be_lane_idx(ctx, pattern7_0, pattern8_0); - let expr2_0 = constructor_vec_replicate_lane(ctx, pattern7_0, expr0_0, expr1_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - } - } - if let Some(pattern3_0) = C::ty_vec128(ctx, pattern2_0) { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - match &pattern4_0 { - &InstructionData::Binary { - opcode: ref pattern5_0, - args: ref pattern5_1, - } => { - match pattern5_0 { - &Opcode::Swizzle => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - let mut closure8 = || { - let expr0_0 = C::lane_order(ctx); - return Some(expr0_0); - }; - if let Some(pattern8_0) = closure8() { - if let &LaneOrder::LittleEndian = &pattern8_0 { - // Rule at src/isa/s390x/lower.isle line 2207. - let expr0_0: u128 = 0i128 as u128; - let expr1_0 = constructor_vec_imm(ctx, pattern3_0, expr0_0); - let expr2_0 = C::put_in_reg(ctx, pattern7_0); - let expr3_0: Type = I8X16; - let expr4_0: Type = I8X16; - let expr5_0: u64 = 239i128 as u64; - let expr6_0 = constructor_vec_imm_splat(ctx, expr4_0, expr5_0); - let expr7_0: Type = I8X16; - let expr8_0 = C::put_in_reg(ctx, pattern7_1); - let expr9_0 = constructor_vec_not(ctx, expr7_0, expr8_0); - let expr10_0 = - constructor_vec_umax(ctx, expr3_0, expr6_0, expr9_0); - let expr11_0 = constructor_vec_permute( - ctx, pattern3_0, expr1_0, expr2_0, expr10_0, - ); - let expr12_0 = constructor_output_reg(ctx, expr11_0); - return Some(expr12_0); - } - } - } - &Opcode::Smin => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/s390x/lower.isle line 263. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = C::put_in_reg(ctx, pattern7_1); - let expr2_0 = constructor_vec_smin(ctx, pattern3_0, expr0_0, expr1_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::Umin => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/s390x/lower.isle line 249. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = C::put_in_reg(ctx, pattern7_1); - let expr2_0 = constructor_vec_umin(ctx, pattern3_0, expr0_0, expr1_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::Smax => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/s390x/lower.isle line 256. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = C::put_in_reg(ctx, pattern7_1); - let expr2_0 = constructor_vec_smax(ctx, pattern3_0, expr0_0, expr1_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::Umax => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/s390x/lower.isle line 242. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = C::put_in_reg(ctx, pattern7_1); - let expr2_0 = constructor_vec_umax(ctx, pattern3_0, expr0_0, expr1_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::AvgRound => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/s390x/lower.isle line 270. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = C::put_in_reg(ctx, pattern7_1); - let expr2_0 = constructor_vec_uavg(ctx, pattern3_0, expr0_0, expr1_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::UaddSat => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/s390x/lower.isle line 116. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = C::put_in_reg(ctx, pattern7_1); - let expr2_0 = constructor_vec_add(ctx, pattern3_0, expr0_0, expr1_0); - let expr3_0 = C::put_in_reg(ctx, pattern7_0); - let expr4_0 = constructor_vec_cmphl(ctx, pattern3_0, expr3_0, expr2_0); - let expr5_0 = constructor_vec_or(ctx, pattern3_0, expr2_0, expr4_0); - let expr6_0 = constructor_output_reg(ctx, expr5_0); - return Some(expr6_0); - } - &Opcode::SaddSat => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/s390x/lower.isle line 124. - let expr0_0 = constructor_vec_widen_type(ctx, pattern3_0); - let expr1_0 = constructor_vec_widen_type(ctx, pattern3_0); - let expr2_0 = C::put_in_reg(ctx, pattern7_0); - let expr3_0 = constructor_vec_unpacks_high(ctx, pattern3_0, expr2_0); - let expr4_0 = C::put_in_reg(ctx, pattern7_1); - let expr5_0 = constructor_vec_unpacks_high(ctx, pattern3_0, expr4_0); - let expr6_0 = constructor_vec_add(ctx, expr1_0, expr3_0, expr5_0); - let expr7_0 = constructor_vec_widen_type(ctx, pattern3_0); - let expr8_0 = C::put_in_reg(ctx, pattern7_0); - let expr9_0 = constructor_vec_unpacks_low(ctx, pattern3_0, expr8_0); - let expr10_0 = C::put_in_reg(ctx, pattern7_1); - let expr11_0 = constructor_vec_unpacks_low(ctx, pattern3_0, expr10_0); - let expr12_0 = constructor_vec_add(ctx, expr7_0, expr9_0, expr11_0); - let expr13_0 = - constructor_vec_pack_ssat(ctx, expr0_0, expr6_0, expr12_0); - let expr14_0 = constructor_output_reg(ctx, expr13_0); - return Some(expr14_0); - } - &Opcode::UsubSat => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/s390x/lower.isle line 180. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = C::put_in_reg(ctx, pattern7_1); - let expr2_0 = constructor_vec_sub(ctx, pattern3_0, expr0_0, expr1_0); - let expr3_0 = C::put_in_reg(ctx, pattern7_0); - let expr4_0 = C::put_in_reg(ctx, pattern7_1); - let expr5_0 = constructor_vec_cmphl(ctx, pattern3_0, expr3_0, expr4_0); - let expr6_0 = constructor_vec_and(ctx, pattern3_0, expr2_0, expr5_0); - let expr7_0 = constructor_output_reg(ctx, expr6_0); - return Some(expr7_0); - } - &Opcode::SsubSat => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/s390x/lower.isle line 187. - let expr0_0 = constructor_vec_widen_type(ctx, pattern3_0); - let expr1_0 = constructor_vec_widen_type(ctx, pattern3_0); - let expr2_0 = C::put_in_reg(ctx, pattern7_0); - let expr3_0 = constructor_vec_unpacks_high(ctx, pattern3_0, expr2_0); - let expr4_0 = C::put_in_reg(ctx, pattern7_1); - let expr5_0 = constructor_vec_unpacks_high(ctx, pattern3_0, expr4_0); - let expr6_0 = constructor_vec_sub(ctx, expr1_0, expr3_0, expr5_0); - let expr7_0 = constructor_vec_widen_type(ctx, pattern3_0); - let expr8_0 = C::put_in_reg(ctx, pattern7_0); - let expr9_0 = constructor_vec_unpacks_low(ctx, pattern3_0, expr8_0); - let expr10_0 = C::put_in_reg(ctx, pattern7_1); - let expr11_0 = constructor_vec_unpacks_low(ctx, pattern3_0, expr10_0); - let expr12_0 = constructor_vec_sub(ctx, expr7_0, expr9_0, expr11_0); - let expr13_0 = - constructor_vec_pack_ssat(ctx, expr0_0, expr6_0, expr12_0); - let expr14_0 = constructor_output_reg(ctx, expr13_0); - return Some(expr14_0); - } - &Opcode::SqmulRoundSat => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/s390x/lower.isle line 439. - let expr0_0 = constructor_vec_widen_type(ctx, pattern3_0); - let expr1_0 = constructor_vec_widen_type(ctx, pattern3_0); - let expr2_0 = C::put_in_reg(ctx, pattern7_0); - let expr3_0 = constructor_vec_unpacks_high(ctx, pattern3_0, expr2_0); - let expr4_0 = C::put_in_reg(ctx, pattern7_1); - let expr5_0 = constructor_vec_unpacks_high(ctx, pattern3_0, expr4_0); - let expr6_0 = constructor_sqmul_impl(ctx, expr1_0, expr3_0, expr5_0); - let expr7_0 = constructor_vec_widen_type(ctx, pattern3_0); - let expr8_0 = C::put_in_reg(ctx, pattern7_0); - let expr9_0 = constructor_vec_unpacks_low(ctx, pattern3_0, expr8_0); - let expr10_0 = C::put_in_reg(ctx, pattern7_1); - let expr11_0 = constructor_vec_unpacks_low(ctx, pattern3_0, expr10_0); - let expr12_0 = constructor_sqmul_impl(ctx, expr7_0, expr9_0, expr11_0); - let expr13_0 = - constructor_vec_pack_ssat(ctx, expr0_0, expr6_0, expr12_0); - let expr14_0 = constructor_output_reg(ctx, expr13_0); - return Some(expr14_0); - } - _ => {} - } - } - &InstructionData::FloatCompare { - opcode: ref pattern5_0, - args: ref pattern5_1, - cond: ref pattern5_2, - } => { - if let &Opcode::Fcmp = pattern5_0 { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - match pattern5_2 { - &FloatCC::Equal => { - // Rule at src/isa/s390x/lower.isle line 3430. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = C::put_in_reg(ctx, pattern7_1); - let expr2_0 = - constructor_vec_fcmpeq(ctx, pattern3_0, expr0_0, expr1_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - &FloatCC::GreaterThan => { - // Rule at src/isa/s390x/lower.isle line 3434. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = C::put_in_reg(ctx, pattern7_1); - let expr2_0 = - constructor_vec_fcmph(ctx, pattern3_0, expr0_0, expr1_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - &FloatCC::GreaterThanOrEqual => { - // Rule at src/isa/s390x/lower.isle line 3438. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = C::put_in_reg(ctx, pattern7_1); - let expr2_0 = - constructor_vec_fcmphe(ctx, pattern3_0, expr0_0, expr1_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - &FloatCC::LessThan => { - // Rule at src/isa/s390x/lower.isle line 3442. - let expr0_0 = C::put_in_reg(ctx, pattern7_1); - let expr1_0 = C::put_in_reg(ctx, pattern7_0); - let expr2_0 = - constructor_vec_fcmph(ctx, pattern3_0, expr0_0, expr1_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - &FloatCC::LessThanOrEqual => { - // Rule at src/isa/s390x/lower.isle line 3446. - let expr0_0 = C::put_in_reg(ctx, pattern7_1); - let expr1_0 = C::put_in_reg(ctx, pattern7_0); - let expr2_0 = - constructor_vec_fcmphe(ctx, pattern3_0, expr0_0, expr1_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - &FloatCC::NotEqual => { - // Rule at src/isa/s390x/lower.isle line 3432. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = C::put_in_reg(ctx, pattern7_1); - let expr2_0 = - constructor_vec_fcmpeq(ctx, pattern3_0, expr0_0, expr1_0); - let expr3_0 = constructor_vec_not(ctx, pattern3_0, expr2_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - &FloatCC::Ordered => { - // Rule at src/isa/s390x/lower.isle line 3450. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = C::put_in_reg(ctx, pattern7_1); - let expr2_0 = - constructor_vec_fcmphe(ctx, pattern3_0, expr0_0, expr1_0); - let expr3_0 = C::put_in_reg(ctx, pattern7_1); - let expr4_0 = C::put_in_reg(ctx, pattern7_0); - let expr5_0 = - constructor_vec_fcmphe(ctx, pattern3_0, expr3_0, expr4_0); - let expr6_0 = constructor_vec_or(ctx, pattern3_0, expr2_0, expr5_0); - let expr7_0 = constructor_output_reg(ctx, expr6_0); - return Some(expr7_0); - } - &FloatCC::OrderedNotEqual => { - // Rule at src/isa/s390x/lower.isle line 3454. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = C::put_in_reg(ctx, pattern7_1); - let expr2_0 = - constructor_vec_fcmph(ctx, pattern3_0, expr0_0, expr1_0); - let expr3_0 = C::put_in_reg(ctx, pattern7_1); - let expr4_0 = C::put_in_reg(ctx, pattern7_0); - let expr5_0 = - constructor_vec_fcmph(ctx, pattern3_0, expr3_0, expr4_0); - let expr6_0 = constructor_vec_or(ctx, pattern3_0, expr2_0, expr5_0); - let expr7_0 = constructor_output_reg(ctx, expr6_0); - return Some(expr7_0); - } - &FloatCC::Unordered => { - // Rule at src/isa/s390x/lower.isle line 3452. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = C::put_in_reg(ctx, pattern7_1); - let expr2_0 = - constructor_vec_fcmphe(ctx, pattern3_0, expr0_0, expr1_0); - let expr3_0 = C::put_in_reg(ctx, pattern7_1); - let expr4_0 = C::put_in_reg(ctx, pattern7_0); - let expr5_0 = - constructor_vec_fcmphe(ctx, pattern3_0, expr3_0, expr4_0); - let expr6_0 = - constructor_vec_not_or(ctx, pattern3_0, expr2_0, expr5_0); - let expr7_0 = constructor_output_reg(ctx, expr6_0); - return Some(expr7_0); - } - &FloatCC::UnorderedOrEqual => { - // Rule at src/isa/s390x/lower.isle line 3456. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = C::put_in_reg(ctx, pattern7_1); - let expr2_0 = - constructor_vec_fcmph(ctx, pattern3_0, expr0_0, expr1_0); - let expr3_0 = C::put_in_reg(ctx, pattern7_1); - let expr4_0 = C::put_in_reg(ctx, pattern7_0); - let expr5_0 = - constructor_vec_fcmph(ctx, pattern3_0, expr3_0, expr4_0); - let expr6_0 = - constructor_vec_not_or(ctx, pattern3_0, expr2_0, expr5_0); - let expr7_0 = constructor_output_reg(ctx, expr6_0); - return Some(expr7_0); - } - &FloatCC::UnorderedOrGreaterThan => { - // Rule at src/isa/s390x/lower.isle line 3448. - let expr0_0 = C::put_in_reg(ctx, pattern7_1); - let expr1_0 = C::put_in_reg(ctx, pattern7_0); - let expr2_0 = - constructor_vec_fcmphe(ctx, pattern3_0, expr0_0, expr1_0); - let expr3_0 = constructor_vec_not(ctx, pattern3_0, expr2_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - &FloatCC::UnorderedOrGreaterThanOrEqual => { - // Rule at src/isa/s390x/lower.isle line 3444. - let expr0_0 = C::put_in_reg(ctx, pattern7_1); - let expr1_0 = C::put_in_reg(ctx, pattern7_0); - let expr2_0 = - constructor_vec_fcmph(ctx, pattern3_0, expr0_0, expr1_0); - let expr3_0 = constructor_vec_not(ctx, pattern3_0, expr2_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - &FloatCC::UnorderedOrLessThan => { - // Rule at src/isa/s390x/lower.isle line 3440. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = C::put_in_reg(ctx, pattern7_1); - let expr2_0 = - constructor_vec_fcmphe(ctx, pattern3_0, expr0_0, expr1_0); - let expr3_0 = constructor_vec_not(ctx, pattern3_0, expr2_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - &FloatCC::UnorderedOrLessThanOrEqual => { - // Rule at src/isa/s390x/lower.isle line 3436. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = C::put_in_reg(ctx, pattern7_1); - let expr2_0 = - constructor_vec_fcmph(ctx, pattern3_0, expr0_0, expr1_0); - let expr3_0 = constructor_vec_not(ctx, pattern3_0, expr2_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - _ => {} - } - } - } - &InstructionData::IntCompare { - opcode: ref pattern5_0, - args: ref pattern5_1, - cond: ref pattern5_2, - } => { - if let &Opcode::Icmp = pattern5_0 { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - match pattern5_2 { - &IntCC::Equal => { - // Rule at src/isa/s390x/lower.isle line 3392. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = C::put_in_reg(ctx, pattern7_1); - let expr2_0 = - constructor_vec_cmpeq(ctx, pattern3_0, expr0_0, expr1_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - &IntCC::NotEqual => { - // Rule at src/isa/s390x/lower.isle line 3394. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = C::put_in_reg(ctx, pattern7_1); - let expr2_0 = - constructor_vec_cmpeq(ctx, pattern3_0, expr0_0, expr1_0); - let expr3_0 = constructor_vec_not(ctx, pattern3_0, expr2_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - &IntCC::SignedGreaterThan => { - // Rule at src/isa/s390x/lower.isle line 3396. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = C::put_in_reg(ctx, pattern7_1); - let expr2_0 = - constructor_vec_cmph(ctx, pattern3_0, expr0_0, expr1_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - &IntCC::SignedGreaterThanOrEqual => { - // Rule at src/isa/s390x/lower.isle line 3402. - let expr0_0 = C::put_in_reg(ctx, pattern7_1); - let expr1_0 = C::put_in_reg(ctx, pattern7_0); - let expr2_0 = - constructor_vec_cmph(ctx, pattern3_0, expr0_0, expr1_0); - let expr3_0 = constructor_vec_not(ctx, pattern3_0, expr2_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - &IntCC::SignedLessThan => { - // Rule at src/isa/s390x/lower.isle line 3400. - let expr0_0 = C::put_in_reg(ctx, pattern7_1); - let expr1_0 = C::put_in_reg(ctx, pattern7_0); - let expr2_0 = - constructor_vec_cmph(ctx, pattern3_0, expr0_0, expr1_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - &IntCC::SignedLessThanOrEqual => { - // Rule at src/isa/s390x/lower.isle line 3398. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = C::put_in_reg(ctx, pattern7_1); - let expr2_0 = - constructor_vec_cmph(ctx, pattern3_0, expr0_0, expr1_0); - let expr3_0 = constructor_vec_not(ctx, pattern3_0, expr2_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - &IntCC::UnsignedGreaterThan => { - // Rule at src/isa/s390x/lower.isle line 3404. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = C::put_in_reg(ctx, pattern7_1); - let expr2_0 = - constructor_vec_cmphl(ctx, pattern3_0, expr0_0, expr1_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - &IntCC::UnsignedGreaterThanOrEqual => { - // Rule at src/isa/s390x/lower.isle line 3410. - let expr0_0 = C::put_in_reg(ctx, pattern7_1); - let expr1_0 = C::put_in_reg(ctx, pattern7_0); - let expr2_0 = - constructor_vec_cmphl(ctx, pattern3_0, expr0_0, expr1_0); - let expr3_0 = constructor_vec_not(ctx, pattern3_0, expr2_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - &IntCC::UnsignedLessThan => { - // Rule at src/isa/s390x/lower.isle line 3408. - let expr0_0 = C::put_in_reg(ctx, pattern7_1); - let expr1_0 = C::put_in_reg(ctx, pattern7_0); - let expr2_0 = - constructor_vec_cmphl(ctx, pattern3_0, expr0_0, expr1_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - &IntCC::UnsignedLessThanOrEqual => { - // Rule at src/isa/s390x/lower.isle line 3406. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = C::put_in_reg(ctx, pattern7_1); - let expr2_0 = - constructor_vec_cmphl(ctx, pattern3_0, expr0_0, expr1_0); - let expr3_0 = constructor_vec_not(ctx, pattern3_0, expr2_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - _ => {} - } - } - } - &InstructionData::Ternary { - opcode: ref pattern5_0, - args: ref pattern5_1, - } => { - if let &Opcode::Vselect = pattern5_0 { - let (pattern7_0, pattern7_1, pattern7_2) = - C::unpack_value_array_3(ctx, pattern5_1); - // Rule at src/isa/s390x/lower.isle line 1105. - let expr0_0 = C::put_in_reg(ctx, pattern7_1); - let expr1_0 = C::put_in_reg(ctx, pattern7_2); - let expr2_0 = C::put_in_reg(ctx, pattern7_0); - let expr3_0 = - constructor_vec_select(ctx, pattern3_0, expr0_0, expr1_0, expr2_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - } - _ => {} - } - } - if let Some(pattern3_0) = C::gpr32_ty(ctx, pattern2_0) { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Load { - opcode: ref pattern5_0, - arg: pattern5_1, - flags: pattern5_2, - offset: pattern5_3, - } = &pattern4_0 - { - match pattern5_0 { - &Opcode::Uload8 => { - // Rule at src/isa/s390x/lower.isle line 2434. - let expr0_0: Type = I8; - let expr1_0 = - constructor_lower_address(ctx, pattern5_2, pattern5_1, pattern5_3); - let expr2_0 = constructor_zext32_mem(ctx, expr0_0, &expr1_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::Sload8 => { - // Rule at src/isa/s390x/lower.isle line 2445. - let expr0_0: Type = I8; - let expr1_0 = - constructor_lower_address(ctx, pattern5_2, pattern5_1, pattern5_3); - let expr2_0 = constructor_sext32_mem(ctx, expr0_0, &expr1_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::Sload16 => { - if let Some(()) = C::littleendian(ctx, pattern5_2) { - // Rule at src/isa/s390x/lower.isle line 2486. - let expr0_0 = - constructor_lower_address(ctx, pattern5_2, pattern5_1, pattern5_3); - let expr1_0 = constructor_loadrev16(ctx, &expr0_0); - let expr2_0: Type = I16; - let expr3_0 = constructor_sext32_reg(ctx, expr2_0, expr1_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - } - _ => {} - } - } - } - if let Some(pattern3_0) = C::gpr64_ty(ctx, pattern2_0) { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Load { - opcode: ref pattern5_0, - arg: pattern5_1, - flags: pattern5_2, - offset: pattern5_3, - } = &pattern4_0 - { - match pattern5_0 { - &Opcode::Uload32 => { - if let Some(()) = C::littleendian(ctx, pattern5_2) { - // Rule at src/isa/s390x/lower.isle line 2511. - let expr0_0 = - constructor_lower_address(ctx, pattern5_2, pattern5_1, pattern5_3); - let expr1_0 = constructor_loadrev32(ctx, &expr0_0); - let expr2_0: Type = I32; - let expr3_0 = constructor_zext64_reg(ctx, expr2_0, expr1_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - } - &Opcode::Sload32 => { - if let Some(()) = C::littleendian(ctx, pattern5_2) { - // Rule at src/isa/s390x/lower.isle line 2525. - let expr0_0 = - constructor_lower_address(ctx, pattern5_2, pattern5_1, pattern5_3); - let expr1_0 = constructor_loadrev32(ctx, &expr0_0); - let expr2_0: Type = I32; - let expr3_0 = constructor_sext64_reg(ctx, expr2_0, expr1_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - } - _ => {} - } - } - } - if let Some(pattern3_0) = C::vr128_ty(ctx, pattern2_0) { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - match &pattern4_0 { - &InstructionData::Unary { - opcode: ref pattern5_0, - arg: pattern5_1, - } => { - match pattern5_0 { - &Opcode::Bnot => { - // Rule at src/isa/s390x/lower.isle line 956. - let expr0_0 = C::put_in_reg(ctx, pattern5_1); - let expr1_0 = constructor_vec_not(ctx, pattern3_0, expr0_0); - let expr2_0 = constructor_output_reg(ctx, expr1_0); - return Some(expr2_0); - } - &Opcode::Uextend => { - let pattern7_0 = C::value_type(ctx, pattern5_1); - if pattern7_0 == I8 { - // Rule at src/isa/s390x/lower.isle line 875. - let expr0_0: Type = I8X16; - let expr1_0: u128 = 0i128 as u128; - let expr2_0 = constructor_vec_imm(ctx, pattern3_0, expr1_0); - let expr3_0 = C::put_in_reg(ctx, pattern5_1); - let expr4_0: u8 = 15i128 as u8; - let expr5_0 = C::zero_reg(ctx); - let expr6_0 = constructor_vec_insert_lane( - ctx, expr0_0, expr2_0, expr3_0, expr4_0, expr5_0, - ); - let expr7_0 = constructor_output_reg(ctx, expr6_0); - return Some(expr7_0); - } - if pattern7_0 == I16 { - // Rule at src/isa/s390x/lower.isle line 877. - let expr0_0: Type = I16X8; - let expr1_0: u128 = 0i128 as u128; - let expr2_0 = constructor_vec_imm(ctx, pattern3_0, expr1_0); - let expr3_0 = C::put_in_reg(ctx, pattern5_1); - let expr4_0: u8 = 7i128 as u8; - let expr5_0 = C::zero_reg(ctx); - let expr6_0 = constructor_vec_insert_lane( - ctx, expr0_0, expr2_0, expr3_0, expr4_0, expr5_0, - ); - let expr7_0 = constructor_output_reg(ctx, expr6_0); - return Some(expr7_0); - } - if pattern7_0 == I32 { - // Rule at src/isa/s390x/lower.isle line 879. - let expr0_0: Type = I32X4; - let expr1_0: u128 = 0i128 as u128; - let expr2_0 = constructor_vec_imm(ctx, pattern3_0, expr1_0); - let expr3_0 = C::put_in_reg(ctx, pattern5_1); - let expr4_0: u8 = 3i128 as u8; - let expr5_0 = C::zero_reg(ctx); - let expr6_0 = constructor_vec_insert_lane( - ctx, expr0_0, expr2_0, expr3_0, expr4_0, expr5_0, - ); - let expr7_0 = constructor_output_reg(ctx, expr6_0); - return Some(expr7_0); - } - if pattern7_0 == I64 { - // Rule at src/isa/s390x/lower.isle line 881. - let expr0_0: Type = I64X2; - let expr1_0: u128 = 0i128 as u128; - let expr2_0 = constructor_vec_imm(ctx, pattern3_0, expr1_0); - let expr3_0 = C::put_in_reg(ctx, pattern5_1); - let expr4_0: u8 = 1i128 as u8; - let expr5_0 = C::zero_reg(ctx); - let expr6_0 = constructor_vec_insert_lane( - ctx, expr0_0, expr2_0, expr3_0, expr4_0, expr5_0, - ); - let expr7_0 = constructor_output_reg(ctx, expr6_0); - return Some(expr7_0); - } - } - &Opcode::Sextend => { - // Rule at src/isa/s390x/lower.isle line 896. - let expr0_0 = constructor_put_in_reg_sext64(ctx, pattern5_1); - let expr1_0: Type = I64; - let expr2_0: u8 = 63i128 as u8; - let expr3_0 = constructor_ashr_imm(ctx, expr1_0, expr0_0, expr2_0); - let expr4_0 = - constructor_mov_to_vec128(ctx, pattern3_0, expr3_0, expr0_0); - let expr5_0 = constructor_output_reg(ctx, expr4_0); - return Some(expr5_0); - } - _ => {} - } - } - &InstructionData::Binary { - opcode: ref pattern5_0, - args: ref pattern5_1, - } => { - match pattern5_0 { - &Opcode::Band => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/s390x/lower.isle line 983. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = C::put_in_reg(ctx, pattern7_1); - let expr2_0 = constructor_vec_and(ctx, pattern3_0, expr0_0, expr1_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::Bor => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/s390x/lower.isle line 1009. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = C::put_in_reg(ctx, pattern7_1); - let expr2_0 = constructor_vec_or(ctx, pattern3_0, expr0_0, expr1_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::Bxor => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/s390x/lower.isle line 1032. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = C::put_in_reg(ctx, pattern7_1); - let expr2_0 = constructor_vec_xor(ctx, pattern3_0, expr0_0, expr1_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::BandNot => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/s390x/lower.isle line 1047. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = C::put_in_reg(ctx, pattern7_1); - let expr2_0 = - constructor_vec_and_not(ctx, pattern3_0, expr0_0, expr1_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::BorNot => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/s390x/lower.isle line 1062. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = C::put_in_reg(ctx, pattern7_1); - let expr2_0 = constructor_vec_or_not(ctx, pattern3_0, expr0_0, expr1_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::BxorNot => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/s390x/lower.isle line 1077. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = C::put_in_reg(ctx, pattern7_1); - let expr2_0 = - constructor_vec_not_xor(ctx, pattern3_0, expr0_0, expr1_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::Iconcat => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/s390x/lower.isle line 51. - let expr0_0 = C::put_in_reg(ctx, pattern7_1); - let expr1_0 = C::put_in_reg(ctx, pattern7_0); - let expr2_0 = - constructor_mov_to_vec128(ctx, pattern3_0, expr0_0, expr1_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - _ => {} - } - } - &InstructionData::Ternary { - opcode: ref pattern5_0, - args: ref pattern5_1, - } => { - if let &Opcode::Bitselect = pattern5_0 { - let (pattern7_0, pattern7_1, pattern7_2) = - C::unpack_value_array_3(ctx, pattern5_1); - // Rule at src/isa/s390x/lower.isle line 1098. - let expr0_0 = C::put_in_reg(ctx, pattern7_1); - let expr1_0 = C::put_in_reg(ctx, pattern7_2); - let expr2_0 = C::put_in_reg(ctx, pattern7_0); - let expr3_0 = - constructor_vec_select(ctx, pattern3_0, expr0_0, expr1_0, expr2_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - } - _ => {} - } - } - let pattern3_0 = C::inst_data(ctx, pattern0_0); - match &pattern3_0 { - &InstructionData::NullAry { - opcode: ref pattern4_0, - } => { - if let &Opcode::Null = pattern4_0 { - // Rule at src/isa/s390x/lower.isle line 39. - let expr0_0: u64 = 0i128 as u64; - let expr1_0 = constructor_imm(ctx, pattern2_0, expr0_0); - let expr2_0 = constructor_output_reg(ctx, expr1_0); - return Some(expr2_0); - } - } - &InstructionData::Unary { - opcode: ref pattern4_0, - arg: pattern4_1, - } => { - match pattern4_0 { - &Opcode::Splat => { - let pattern6_0 = C::value_type(ctx, pattern4_1); - if let Some(pattern7_0) = C::ty_scalar_float(ctx, pattern6_0) { - // Rule at src/isa/s390x/lower.isle line 1925. - let expr0_0 = C::put_in_reg(ctx, pattern4_1); - let expr1_0: u8 = 0i128 as u8; - let expr2_0 = - constructor_vec_replicate_lane(ctx, pattern2_0, expr0_0, expr1_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - } - &Opcode::Bitrev => { - // Rule at src/isa/s390x/lower.isle line 1117. - let expr0_0: u8 = 4i128 as u8; - let expr1_0: u64 = 17361641481138401520i128 as u64; - let expr2_0: u8 = 2i128 as u8; - let expr3_0: u64 = 14757395258967641292i128 as u64; - let expr4_0: u8 = 1i128 as u8; - let expr5_0: u64 = 12297829382473034410i128 as u64; - let expr6_0 = C::put_in_reg(ctx, pattern4_1); - let expr7_0 = - constructor_bitrev_bits(ctx, expr4_0, expr5_0, pattern2_0, expr6_0); - let expr8_0 = - constructor_bitrev_bits(ctx, expr2_0, expr3_0, pattern2_0, expr7_0); - let expr9_0 = - constructor_bitrev_bits(ctx, expr0_0, expr1_0, pattern2_0, expr8_0); - let expr10_0 = constructor_bitrev_bytes(ctx, pattern2_0, expr9_0); - let expr11_0 = constructor_output_reg(ctx, expr10_0); - return Some(expr11_0); - } - &Opcode::Bswap => { - // Rule at src/isa/s390x/lower.isle line 1152. - let expr0_0 = C::put_in_reg(ctx, pattern4_1); - let expr1_0 = constructor_bitrev_bytes(ctx, pattern2_0, expr0_0); - let expr2_0 = constructor_output_reg(ctx, expr1_0); - return Some(expr2_0); - } - &Opcode::Sqrt => { - // Rule at src/isa/s390x/lower.isle line 1400. - let expr0_0 = C::put_in_reg(ctx, pattern4_1); - let expr1_0 = constructor_sqrt_reg(ctx, pattern2_0, expr0_0); - let expr2_0 = constructor_output_reg(ctx, expr1_0); - return Some(expr2_0); - } - &Opcode::Fneg => { - // Rule at src/isa/s390x/lower.isle line 1407. - let expr0_0 = C::put_in_reg(ctx, pattern4_1); - let expr1_0 = constructor_fneg_reg(ctx, pattern2_0, expr0_0); - let expr2_0 = constructor_output_reg(ctx, expr1_0); - return Some(expr2_0); - } - &Opcode::Fabs => { - // Rule at src/isa/s390x/lower.isle line 1414. - let expr0_0 = C::put_in_reg(ctx, pattern4_1); - let expr1_0 = constructor_fabs_reg(ctx, pattern2_0, expr0_0); - let expr2_0 = constructor_output_reg(ctx, expr1_0); - return Some(expr2_0); - } - &Opcode::Ceil => { - // Rule at src/isa/s390x/lower.isle line 1421. - let expr0_0 = C::put_in_reg(ctx, pattern4_1); - let expr1_0 = constructor_ceil_reg(ctx, pattern2_0, expr0_0); - let expr2_0 = constructor_output_reg(ctx, expr1_0); - return Some(expr2_0); - } - &Opcode::Floor => { - // Rule at src/isa/s390x/lower.isle line 1428. - let expr0_0 = C::put_in_reg(ctx, pattern4_1); - let expr1_0 = constructor_floor_reg(ctx, pattern2_0, expr0_0); - let expr2_0 = constructor_output_reg(ctx, expr1_0); - return Some(expr2_0); - } - &Opcode::Trunc => { - // Rule at src/isa/s390x/lower.isle line 1435. - let expr0_0 = C::put_in_reg(ctx, pattern4_1); - let expr1_0 = constructor_trunc_reg(ctx, pattern2_0, expr0_0); - let expr2_0 = constructor_output_reg(ctx, expr1_0); - return Some(expr2_0); - } - &Opcode::Nearest => { - // Rule at src/isa/s390x/lower.isle line 1442. - let expr0_0 = C::put_in_reg(ctx, pattern4_1); - let expr1_0 = constructor_nearest_reg(ctx, pattern2_0, expr0_0); - let expr2_0 = constructor_output_reg(ctx, expr1_0); - return Some(expr2_0); - } - &Opcode::ScalarToVector => { - let pattern6_0 = C::value_type(ctx, pattern4_1); - if let Some(pattern7_0) = C::ty_scalar_float(ctx, pattern6_0) { - // Rule at src/isa/s390x/lower.isle line 1985. - let expr0_0: u8 = 0i128 as u8; - let expr1_0 = C::be_lane_idx(ctx, pattern2_0, expr0_0); - let expr2_0 = C::put_in_reg(ctx, pattern4_1); - let expr3_0: u8 = 0i128 as u8; - let expr4_0 = constructor_vec_move_lane_and_zero( - ctx, pattern2_0, expr1_0, expr2_0, expr3_0, - ); - let expr5_0 = constructor_output_reg(ctx, expr4_0); - return Some(expr5_0); - } - } - &Opcode::Bmask => { - // Rule at src/isa/s390x/lower.isle line 1111. - let expr0_0 = constructor_value_nonzero(ctx, pattern4_1); - let expr1_0 = constructor_lower_bool_to_mask(ctx, pattern2_0, &expr0_0); - let expr2_0 = constructor_output_reg(ctx, expr1_0); - return Some(expr2_0); - } - _ => {} - } - } - &InstructionData::UnaryConst { - opcode: ref pattern4_0, - constant_handle: pattern4_1, - } => { - if let &Opcode::Vconst = pattern4_0 { - if let Some(pattern6_0) = C::u128_from_constant(ctx, pattern4_1) { - // Rule at src/isa/s390x/lower.isle line 33. - let expr0_0 = C::be_vec_const(ctx, pattern2_0, pattern6_0); - let expr1_0 = constructor_vec_imm(ctx, pattern2_0, expr0_0); - let expr2_0 = constructor_output_reg(ctx, expr1_0); - return Some(expr2_0); - } - } - } - &InstructionData::UnaryImm { - opcode: ref pattern4_0, - imm: pattern4_1, - } => { - if let &Opcode::Iconst = pattern4_0 { - let pattern6_0 = C::u64_from_imm64(ctx, pattern4_1); - // Rule at src/isa/s390x/lower.isle line 15. - let expr0_0 = constructor_imm(ctx, pattern2_0, pattern6_0); - let expr1_0 = constructor_output_reg(ctx, expr0_0); - return Some(expr1_0); - } - } - &InstructionData::StackLoad { - opcode: ref pattern4_0, - stack_slot: pattern4_1, - offset: pattern4_2, - } => { - if let &Opcode::StackAddr = pattern4_0 { - // Rule at src/isa/s390x/lower.isle line 2217. - let expr0_0 = - constructor_stack_addr_impl(ctx, pattern2_0, pattern4_1, pattern4_2); - let expr1_0 = constructor_output_reg(ctx, expr0_0); - return Some(expr1_0); - } - } - &InstructionData::Binary { - opcode: ref pattern4_0, - args: ref pattern4_1, - } => { - match pattern4_0 { - &Opcode::Fadd => { - let (pattern6_0, pattern6_1) = C::unpack_value_array_2(ctx, pattern4_1); - // Rule at src/isa/s390x/lower.isle line 1324. - let expr0_0 = C::put_in_reg(ctx, pattern6_0); - let expr1_0 = C::put_in_reg(ctx, pattern6_1); - let expr2_0 = constructor_fadd_reg(ctx, pattern2_0, expr0_0, expr1_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::Fsub => { - let (pattern6_0, pattern6_1) = C::unpack_value_array_2(ctx, pattern4_1); - // Rule at src/isa/s390x/lower.isle line 1331. - let expr0_0 = C::put_in_reg(ctx, pattern6_0); - let expr1_0 = C::put_in_reg(ctx, pattern6_1); - let expr2_0 = constructor_fsub_reg(ctx, pattern2_0, expr0_0, expr1_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::Fmul => { - let (pattern6_0, pattern6_1) = C::unpack_value_array_2(ctx, pattern4_1); - // Rule at src/isa/s390x/lower.isle line 1338. - let expr0_0 = C::put_in_reg(ctx, pattern6_0); - let expr1_0 = C::put_in_reg(ctx, pattern6_1); - let expr2_0 = constructor_fmul_reg(ctx, pattern2_0, expr0_0, expr1_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::Fdiv => { - let (pattern6_0, pattern6_1) = C::unpack_value_array_2(ctx, pattern4_1); - // Rule at src/isa/s390x/lower.isle line 1345. - let expr0_0 = C::put_in_reg(ctx, pattern6_0); - let expr1_0 = C::put_in_reg(ctx, pattern6_1); - let expr2_0 = constructor_fdiv_reg(ctx, pattern2_0, expr0_0, expr1_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::Fmin => { - let (pattern6_0, pattern6_1) = C::unpack_value_array_2(ctx, pattern4_1); - // Rule at src/isa/s390x/lower.isle line 1352. - let expr0_0 = C::put_in_reg(ctx, pattern6_0); - let expr1_0 = C::put_in_reg(ctx, pattern6_1); - let expr2_0 = constructor_fmin_reg(ctx, pattern2_0, expr0_0, expr1_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::FminPseudo => { - let (pattern6_0, pattern6_1) = C::unpack_value_array_2(ctx, pattern4_1); - // Rule at src/isa/s390x/lower.isle line 1366. - let expr0_0 = C::put_in_reg(ctx, pattern6_0); - let expr1_0 = C::put_in_reg(ctx, pattern6_1); - let expr2_0 = - constructor_fmin_pseudo_reg(ctx, pattern2_0, expr0_0, expr1_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::Fmax => { - let (pattern6_0, pattern6_1) = C::unpack_value_array_2(ctx, pattern4_1); - // Rule at src/isa/s390x/lower.isle line 1359. - let expr0_0 = C::put_in_reg(ctx, pattern6_0); - let expr1_0 = C::put_in_reg(ctx, pattern6_1); - let expr2_0 = constructor_fmax_reg(ctx, pattern2_0, expr0_0, expr1_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::FmaxPseudo => { - let (pattern6_0, pattern6_1) = C::unpack_value_array_2(ctx, pattern4_1); - // Rule at src/isa/s390x/lower.isle line 1373. - let expr0_0 = C::put_in_reg(ctx, pattern6_0); - let expr1_0 = C::put_in_reg(ctx, pattern6_1); - let expr2_0 = - constructor_fmax_pseudo_reg(ctx, pattern2_0, expr0_0, expr1_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::WideningPairwiseDotProductS => { - let (pattern6_0, pattern6_1) = C::unpack_value_array_2(ctx, pattern4_1); - let pattern7_0 = C::value_type(ctx, pattern6_0); - // Rule at src/isa/s390x/lower.isle line 430. - let expr0_0 = C::put_in_reg(ctx, pattern6_0); - let expr1_0 = C::put_in_reg(ctx, pattern6_1); - let expr2_0 = constructor_vec_smul_even(ctx, pattern7_0, expr0_0, expr1_0); - let expr3_0 = C::put_in_reg(ctx, pattern6_0); - let expr4_0 = C::put_in_reg(ctx, pattern6_1); - let expr5_0 = constructor_vec_smul_odd(ctx, pattern7_0, expr3_0, expr4_0); - let expr6_0 = constructor_vec_add(ctx, pattern2_0, expr2_0, expr5_0); - let expr7_0 = constructor_output_reg(ctx, expr6_0); - return Some(expr7_0); - } - _ => {} - } - } - &InstructionData::Ternary { - opcode: ref pattern4_0, - args: ref pattern4_1, - } => { - match pattern4_0 { - &Opcode::Select => { - let (pattern6_0, pattern6_1, pattern6_2) = - C::unpack_value_array_3(ctx, pattern4_1); - // Rule at src/isa/s390x/lower.isle line 3697. - let expr0_0 = constructor_value_nonzero(ctx, pattern6_0); - let expr1_0 = C::put_in_reg(ctx, pattern6_1); - let expr2_0 = C::put_in_reg(ctx, pattern6_2); - let expr3_0 = constructor_select_bool_reg( - ctx, pattern2_0, &expr0_0, expr1_0, expr2_0, - ); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - &Opcode::SelectSpectreGuard => { - let (pattern6_0, pattern6_1, pattern6_2) = - C::unpack_value_array_3(ctx, pattern4_1); - // Rule at src/isa/s390x/lower.isle line 3707. - let expr0_0 = constructor_value_nonzero(ctx, pattern6_0); - let expr1_0 = C::put_in_reg(ctx, pattern6_1); - let expr2_0 = C::put_in_reg(ctx, pattern6_2); - let expr3_0 = constructor_select_bool_reg( - ctx, pattern2_0, &expr0_0, expr1_0, expr2_0, - ); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - &Opcode::Fma => { - let (pattern6_0, pattern6_1, pattern6_2) = - C::unpack_value_array_3(ctx, pattern4_1); - // Rule at src/isa/s390x/lower.isle line 1393. - let expr0_0 = C::put_in_reg(ctx, pattern6_0); - let expr1_0 = C::put_in_reg(ctx, pattern6_1); - let expr2_0 = C::put_in_reg(ctx, pattern6_2); - let expr3_0 = - constructor_fma_reg(ctx, pattern2_0, expr0_0, expr1_0, expr2_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - _ => {} - } - } - _ => {} - } - } - let pattern1_0 = C::inst_data(ctx, pattern0_0); - match &pattern1_0 { - &InstructionData::NullAry { - opcode: ref pattern2_0, - } => { - match pattern2_0 { - &Opcode::Debugtrap => { - // Rule at src/isa/s390x/lower.isle line 3807. - let expr0_0 = constructor_debugtrap_impl(ctx); - let expr1_0 = constructor_side_effect(ctx, &expr0_0); - return Some(expr1_0); - } - &Opcode::GetFramePointer => { - // Rule at src/isa/s390x/lower.isle line 3967. - let expr0_0: i64 = 0i128 as i64; - let expr1_0: i64 = 0i128 as i64; - let expr2_0 = C::memarg_stack_off(ctx, expr0_0, expr1_0); - let expr3_0 = constructor_load64(ctx, &expr2_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - &Opcode::GetStackPointer => { - // Rule at src/isa/s390x/lower.isle line 3964. - let expr0_0 = constructor_sp(ctx); - let expr1_0 = constructor_output_reg(ctx, expr0_0); - return Some(expr1_0); - } - &Opcode::GetReturnAddress => { - // Rule at src/isa/s390x/lower.isle line 3970. - let expr0_0: i64 = 112i128 as i64; - let expr1_0 = C::memarg_initial_sp_offset(ctx, expr0_0); - let expr2_0 = constructor_load64(ctx, &expr1_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::Nop => { - // Rule at src/isa/s390x/lower.isle line 45. - let expr0_0 = C::invalid_reg(ctx); - let expr1_0 = constructor_output_reg(ctx, expr0_0); - return Some(expr1_0); - } - &Opcode::Fence => { - // Rule at src/isa/s390x/lower.isle line 3237. - let expr0_0 = constructor_fence_impl(ctx); - let expr1_0 = constructor_side_effect(ctx, &expr0_0); - return Some(expr1_0); - } - _ => {} - } - } - &InstructionData::Unary { - opcode: ref pattern2_0, - arg: pattern2_1, - } => { - match pattern2_0 { - &Opcode::VhighBits => { - let pattern4_0 = C::value_type(ctx, pattern2_1); - if let Some((pattern5_0, pattern5_1)) = C::multi_lane(ctx, pattern4_0) { - if pattern5_0 == 8i128 as u32 { - if pattern5_1 == 16i128 as u32 { - let mut closure8 = || { - let expr0_0 = C::lane_order(ctx); - return Some(expr0_0); - }; - if let Some(pattern8_0) = closure8() { - if let &LaneOrder::LittleEndian = &pattern8_0 { - // Rule at src/isa/s390x/lower.isle line 3618. - let expr0_0: Type = I8X16; - let expr1_0: u8 = 0i128 as u8; - let expr2_0: u8 = 8i128 as u8; - let expr3_0: u8 = 16i128 as u8; - let expr4_0: u8 = 24i128 as u8; - let expr5_0: u8 = 32i128 as u8; - let expr6_0: u8 = 40i128 as u8; - let expr7_0: u8 = 48i128 as u8; - let expr8_0: u8 = 56i128 as u8; - let expr9_0: u8 = 64i128 as u8; - let expr10_0: u8 = 72i128 as u8; - let expr11_0: u8 = 80i128 as u8; - let expr12_0: u8 = 88i128 as u8; - let expr13_0: u8 = 96i128 as u8; - let expr14_0: u8 = 104i128 as u8; - let expr15_0: u8 = 112i128 as u8; - let expr16_0: u8 = 120i128 as u8; - let expr17_0 = constructor_imm8x16( - ctx, expr1_0, expr2_0, expr3_0, expr4_0, expr5_0, - expr6_0, expr7_0, expr8_0, expr9_0, expr10_0, expr11_0, - expr12_0, expr13_0, expr14_0, expr15_0, expr16_0, - ); - let expr18_0 = constructor_vec_imm(ctx, expr0_0, expr17_0); - let expr19_0: Type = I64X2; - let expr20_0 = C::put_in_reg(ctx, pattern2_1); - let expr21_0 = - constructor_vec_bitpermute(ctx, expr20_0, expr18_0); - let expr22_0: u8 = 0i128 as u8; - let expr23_0 = C::zero_reg(ctx); - let expr24_0 = constructor_vec_extract_lane( - ctx, expr19_0, expr21_0, expr22_0, expr23_0, - ); - let expr25_0 = constructor_output_reg(ctx, expr24_0); - return Some(expr25_0); - } - } - } - } - if pattern5_0 == 16i128 as u32 { - if pattern5_1 == 8i128 as u32 { - let mut closure8 = || { - let expr0_0 = C::lane_order(ctx); - return Some(expr0_0); - }; - if let Some(pattern8_0) = closure8() { - if let &LaneOrder::LittleEndian = &pattern8_0 { - // Rule at src/isa/s390x/lower.isle line 3629. - let expr0_0: Type = I8X16; - let expr1_0: u8 = 128i128 as u8; - let expr2_0: u8 = 128i128 as u8; - let expr3_0: u8 = 128i128 as u8; - let expr4_0: u8 = 128i128 as u8; - let expr5_0: u8 = 128i128 as u8; - let expr6_0: u8 = 128i128 as u8; - let expr7_0: u8 = 128i128 as u8; - let expr8_0: u8 = 128i128 as u8; - let expr9_0: u8 = 0i128 as u8; - let expr10_0: u8 = 16i128 as u8; - let expr11_0: u8 = 32i128 as u8; - let expr12_0: u8 = 48i128 as u8; - let expr13_0: u8 = 64i128 as u8; - let expr14_0: u8 = 80i128 as u8; - let expr15_0: u8 = 96i128 as u8; - let expr16_0: u8 = 112i128 as u8; - let expr17_0 = constructor_imm8x16( - ctx, expr1_0, expr2_0, expr3_0, expr4_0, expr5_0, - expr6_0, expr7_0, expr8_0, expr9_0, expr10_0, expr11_0, - expr12_0, expr13_0, expr14_0, expr15_0, expr16_0, - ); - let expr18_0 = constructor_vec_imm(ctx, expr0_0, expr17_0); - let expr19_0: Type = I64X2; - let expr20_0 = C::put_in_reg(ctx, pattern2_1); - let expr21_0 = - constructor_vec_bitpermute(ctx, expr20_0, expr18_0); - let expr22_0: u8 = 0i128 as u8; - let expr23_0 = C::zero_reg(ctx); - let expr24_0 = constructor_vec_extract_lane( - ctx, expr19_0, expr21_0, expr22_0, expr23_0, - ); - let expr25_0 = constructor_output_reg(ctx, expr24_0); - return Some(expr25_0); - } - } - } - } - if pattern5_0 == 32i128 as u32 { - if pattern5_1 == 4i128 as u32 { - let mut closure8 = || { - let expr0_0 = C::lane_order(ctx); - return Some(expr0_0); - }; - if let Some(pattern8_0) = closure8() { - if let &LaneOrder::LittleEndian = &pattern8_0 { - // Rule at src/isa/s390x/lower.isle line 3640. - let expr0_0: Type = I8X16; - let expr1_0: u8 = 128i128 as u8; - let expr2_0: u8 = 128i128 as u8; - let expr3_0: u8 = 128i128 as u8; - let expr4_0: u8 = 128i128 as u8; - let expr5_0: u8 = 128i128 as u8; - let expr6_0: u8 = 128i128 as u8; - let expr7_0: u8 = 128i128 as u8; - let expr8_0: u8 = 128i128 as u8; - let expr9_0: u8 = 128i128 as u8; - let expr10_0: u8 = 128i128 as u8; - let expr11_0: u8 = 128i128 as u8; - let expr12_0: u8 = 128i128 as u8; - let expr13_0: u8 = 0i128 as u8; - let expr14_0: u8 = 32i128 as u8; - let expr15_0: u8 = 64i128 as u8; - let expr16_0: u8 = 96i128 as u8; - let expr17_0 = constructor_imm8x16( - ctx, expr1_0, expr2_0, expr3_0, expr4_0, expr5_0, - expr6_0, expr7_0, expr8_0, expr9_0, expr10_0, expr11_0, - expr12_0, expr13_0, expr14_0, expr15_0, expr16_0, - ); - let expr18_0 = constructor_vec_imm(ctx, expr0_0, expr17_0); - let expr19_0: Type = I64X2; - let expr20_0 = C::put_in_reg(ctx, pattern2_1); - let expr21_0 = - constructor_vec_bitpermute(ctx, expr20_0, expr18_0); - let expr22_0: u8 = 0i128 as u8; - let expr23_0 = C::zero_reg(ctx); - let expr24_0 = constructor_vec_extract_lane( - ctx, expr19_0, expr21_0, expr22_0, expr23_0, - ); - let expr25_0 = constructor_output_reg(ctx, expr24_0); - return Some(expr25_0); - } - } - } - } - if pattern5_0 == 64i128 as u32 { - if pattern5_1 == 2i128 as u32 { - let mut closure8 = || { - let expr0_0 = C::lane_order(ctx); - return Some(expr0_0); - }; - if let Some(pattern8_0) = closure8() { - if let &LaneOrder::LittleEndian = &pattern8_0 { - // Rule at src/isa/s390x/lower.isle line 3651. - let expr0_0: Type = I8X16; - let expr1_0: u8 = 128i128 as u8; - let expr2_0: u8 = 128i128 as u8; - let expr3_0: u8 = 128i128 as u8; - let expr4_0: u8 = 128i128 as u8; - let expr5_0: u8 = 128i128 as u8; - let expr6_0: u8 = 128i128 as u8; - let expr7_0: u8 = 128i128 as u8; - let expr8_0: u8 = 128i128 as u8; - let expr9_0: u8 = 128i128 as u8; - let expr10_0: u8 = 128i128 as u8; - let expr11_0: u8 = 128i128 as u8; - let expr12_0: u8 = 128i128 as u8; - let expr13_0: u8 = 128i128 as u8; - let expr14_0: u8 = 128i128 as u8; - let expr15_0: u8 = 0i128 as u8; - let expr16_0: u8 = 64i128 as u8; - let expr17_0 = constructor_imm8x16( - ctx, expr1_0, expr2_0, expr3_0, expr4_0, expr5_0, - expr6_0, expr7_0, expr8_0, expr9_0, expr10_0, expr11_0, - expr12_0, expr13_0, expr14_0, expr15_0, expr16_0, - ); - let expr18_0 = constructor_vec_imm(ctx, expr0_0, expr17_0); - let expr19_0: Type = I64X2; - let expr20_0 = C::put_in_reg(ctx, pattern2_1); - let expr21_0 = - constructor_vec_bitpermute(ctx, expr20_0, expr18_0); - let expr22_0: u8 = 0i128 as u8; - let expr23_0 = C::zero_reg(ctx); - let expr24_0 = constructor_vec_extract_lane( - ctx, expr19_0, expr21_0, expr22_0, expr23_0, - ); - let expr25_0 = constructor_output_reg(ctx, expr24_0); - return Some(expr25_0); - } - } - } - } - } - } - &Opcode::Ireduce => { - let pattern4_0 = C::value_type(ctx, pattern2_1); - if let Some(pattern5_0) = C::vr128_ty(ctx, pattern4_0) { - // Rule at src/isa/s390x/lower.isle line 860. - let expr0_0: Type = I64X2; - let expr1_0 = C::put_in_reg(ctx, pattern2_1); - let expr2_0: u8 = 1i128 as u8; - let expr3_0 = C::zero_reg(ctx); - let expr4_0 = - constructor_vec_extract_lane(ctx, expr0_0, expr1_0, expr2_0, expr3_0); - let expr5_0 = constructor_output_reg(ctx, expr4_0); - return Some(expr5_0); - } - } - &Opcode::SwidenLow => { - let pattern4_0 = C::value_type(ctx, pattern2_1); - if let Some(pattern5_0) = C::ty_vec128(ctx, pattern4_0) { - // Rule at src/isa/s390x/lower.isle line 922. - let expr0_0 = C::put_in_reg(ctx, pattern2_1); - let expr1_0 = - constructor_vec_unpacks_low_lane_order(ctx, pattern5_0, expr0_0); - let expr2_0 = constructor_output_reg(ctx, expr1_0); - return Some(expr2_0); - } - } - &Opcode::SwidenHigh => { - let pattern4_0 = C::value_type(ctx, pattern2_1); - if let Some(pattern5_0) = C::ty_vec128(ctx, pattern4_0) { - // Rule at src/isa/s390x/lower.isle line 928. - let expr0_0 = C::put_in_reg(ctx, pattern2_1); - let expr1_0 = - constructor_vec_unpacks_high_lane_order(ctx, pattern5_0, expr0_0); - let expr2_0 = constructor_output_reg(ctx, expr1_0); - return Some(expr2_0); - } - } - &Opcode::UwidenLow => { - let pattern4_0 = C::value_type(ctx, pattern2_1); - if let Some(pattern5_0) = C::ty_vec128(ctx, pattern4_0) { - // Rule at src/isa/s390x/lower.isle line 934. - let expr0_0 = C::put_in_reg(ctx, pattern2_1); - let expr1_0 = - constructor_vec_unpacku_low_lane_order(ctx, pattern5_0, expr0_0); - let expr2_0 = constructor_output_reg(ctx, expr1_0); - return Some(expr2_0); - } - } - &Opcode::UwidenHigh => { - let pattern4_0 = C::value_type(ctx, pattern2_1); - if let Some(pattern5_0) = C::ty_vec128(ctx, pattern4_0) { - // Rule at src/isa/s390x/lower.isle line 940. - let expr0_0 = C::put_in_reg(ctx, pattern2_1); - let expr1_0 = - constructor_vec_unpacku_high_lane_order(ctx, pattern5_0, expr0_0); - let expr2_0 = constructor_output_reg(ctx, expr1_0); - return Some(expr2_0); - } - } - &Opcode::Isplit => { - let pattern4_0 = C::value_type(ctx, pattern2_1); - if pattern4_0 == I128 { - // Rule at src/isa/s390x/lower.isle line 57. - let expr0_0 = C::put_in_reg(ctx, pattern2_1); - let expr1_0: Type = I64X2; - let expr2_0: u8 = 0i128 as u8; - let expr3_0 = C::zero_reg(ctx); - let expr4_0 = - constructor_vec_extract_lane(ctx, expr1_0, expr0_0, expr2_0, expr3_0); - let expr5_0: Type = I64X2; - let expr6_0: u8 = 1i128 as u8; - let expr7_0 = C::zero_reg(ctx); - let expr8_0 = - constructor_vec_extract_lane(ctx, expr5_0, expr0_0, expr6_0, expr7_0); - let expr9_0 = C::value_reg(ctx, expr8_0); - let expr10_0 = C::value_reg(ctx, expr4_0); - let expr11_0 = C::output_pair(ctx, expr9_0, expr10_0); - return Some(expr11_0); - } - } - _ => {} - } - } - &InstructionData::CondTrap { - opcode: ref pattern2_0, - arg: pattern2_1, - code: ref pattern2_2, - } => { - match pattern2_0 { - &Opcode::Trapz => { - // Rule at src/isa/s390x/lower.isle line 3789. - let expr0_0 = constructor_value_nonzero(ctx, pattern2_1); - let expr1_0 = constructor_invert_bool(ctx, &expr0_0); - let expr2_0 = constructor_trap_if_bool(ctx, &expr1_0, pattern2_2); - let expr3_0 = constructor_side_effect(ctx, &expr2_0); - return Some(expr3_0); - } - &Opcode::Trapnz => { - // Rule at src/isa/s390x/lower.isle line 3795. - let expr0_0 = constructor_value_nonzero(ctx, pattern2_1); - let expr1_0 = constructor_trap_if_bool(ctx, &expr0_0, pattern2_2); - let expr2_0 = constructor_side_effect(ctx, &expr1_0); - return Some(expr2_0); - } - &Opcode::ResumableTrapnz => { - // Rule at src/isa/s390x/lower.isle line 3801. - let expr0_0 = constructor_value_nonzero(ctx, pattern2_1); - let expr1_0 = constructor_trap_if_bool(ctx, &expr0_0, pattern2_2); - let expr2_0 = constructor_side_effect(ctx, &expr1_0); - return Some(expr2_0); - } - _ => {} - } - } - &InstructionData::MultiAry { - opcode: ref pattern2_0, - args: pattern2_1, - } => { - if let &Opcode::Return = pattern2_0 { - let pattern4_0 = C::value_list_slice(ctx, pattern2_1); - // Rule at src/isa/s390x/lower.isle line 3881. - let expr0_0: usize = 0i128 as usize; - let expr1_0 = C::value_slice_len(ctx, pattern4_0); - let expr2_0 = C::range(ctx, expr0_0, expr1_0); - let expr3_0 = constructor_lower_return(ctx, expr2_0, pattern4_0); - return Some(expr3_0); - } - } - &InstructionData::Call { - opcode: ref pattern2_0, - args: pattern2_1, - func_ref: pattern2_2, - } => { - if let &Opcode::Call = pattern2_0 { - let pattern4_0 = C::value_list_slice(ctx, pattern2_1); - let (pattern5_0, pattern5_1, pattern5_2) = C::func_ref_data(ctx, pattern2_2); - // Rule at src/isa/s390x/lower.isle line 3898. - let expr0_0 = C::abi_sig(ctx, pattern5_0); - let expr1_0 = C::abi_accumulate_outgoing_args_size(ctx, expr0_0); - let expr2_0: usize = 0i128 as usize; - let expr3_0 = C::abi_num_args(ctx, expr0_0); - let expr4_0 = C::range(ctx, expr2_0, expr3_0); - let expr5_0 = constructor_lower_call_args(ctx, expr0_0, expr4_0, pattern4_0); - let expr6_0 = C::defs_init(ctx, expr0_0); - let expr7_0: i64 = 0i128 as i64; - let expr8_0 = SymbolReloc::Absolute { - name: pattern5_1, - offset: expr7_0, - }; - let expr9_0 = constructor_load_symbol_reloc(ctx, &expr8_0); - let expr10_0 = Opcode::Call; - let expr11_0 = - constructor_abi_call_ind(ctx, expr0_0, expr9_0, &expr5_0, &expr6_0, &expr10_0); - let expr12_0 = constructor_side_effect(ctx, &expr11_0); - let expr13_0 = C::abi_first_ret(ctx, pattern5_0, expr0_0); - let expr14_0 = C::abi_num_rets(ctx, expr0_0); - let expr15_0 = C::range(ctx, expr13_0, expr14_0); - let expr16_0 = C::output_builder_new(ctx); - let expr17_0 = - constructor_lower_call_rets(ctx, expr0_0, &expr6_0, expr15_0, &expr16_0); - return Some(expr17_0); - } - } - &InstructionData::CallIndirect { - opcode: ref pattern2_0, - args: pattern2_1, - sig_ref: pattern2_2, - } => { - if let &Opcode::CallIndirect = pattern2_0 { - let pattern4_0 = C::value_list_slice(ctx, pattern2_1); - if let Some((pattern5_0, pattern5_1)) = C::value_slice_unwrap(ctx, pattern4_0) { - // Rule at src/isa/s390x/lower.isle line 3909. - let expr0_0 = C::abi_sig(ctx, pattern2_2); - let expr1_0 = C::put_in_reg(ctx, pattern5_0); - let expr2_0 = C::abi_accumulate_outgoing_args_size(ctx, expr0_0); - let expr3_0: usize = 0i128 as usize; - let expr4_0 = C::abi_num_args(ctx, expr0_0); - let expr5_0 = C::range(ctx, expr3_0, expr4_0); - let expr6_0 = constructor_lower_call_args(ctx, expr0_0, expr5_0, pattern5_1); - let expr7_0 = C::defs_init(ctx, expr0_0); - let expr8_0 = Opcode::CallIndirect; - let expr9_0 = constructor_abi_call_ind( - ctx, expr0_0, expr1_0, &expr6_0, &expr7_0, &expr8_0, - ); - let expr10_0 = constructor_side_effect(ctx, &expr9_0); - let expr11_0 = C::abi_first_ret(ctx, pattern2_2, expr0_0); - let expr12_0 = C::abi_num_rets(ctx, expr0_0); - let expr13_0 = C::range(ctx, expr11_0, expr12_0); - let expr14_0 = C::output_builder_new(ctx); - let expr15_0 = - constructor_lower_call_rets(ctx, expr0_0, &expr7_0, expr13_0, &expr14_0); - return Some(expr15_0); - } - } - } - &InstructionData::FuncAddr { - opcode: ref pattern2_0, - func_ref: pattern2_1, - } => { - if let &Opcode::FuncAddr = pattern2_0 { - let (pattern4_0, pattern4_1, pattern4_2) = C::func_ref_data(ctx, pattern2_1); - // Rule at src/isa/s390x/lower.isle line 2228. - let expr0_0: i64 = 0i128 as i64; - let expr1_0 = SymbolReloc::Absolute { - name: pattern4_1, - offset: expr0_0, - }; - let expr2_0 = constructor_load_symbol_reloc(ctx, &expr1_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - } - &InstructionData::UnaryGlobalValue { - opcode: ref pattern2_0, - global_value: pattern2_1, - } => { - match pattern2_0 { - &Opcode::SymbolValue => { - if let Some((pattern4_0, pattern4_1, pattern4_2)) = - C::symbol_value_data(ctx, pattern2_1) - { - // Rule at src/isa/s390x/lower.isle line 2241. - let expr0_0 = SymbolReloc::Absolute { - name: pattern4_0, - offset: pattern4_2, - }; - let expr1_0 = constructor_load_symbol_reloc(ctx, &expr0_0); - let expr2_0 = constructor_output_reg(ctx, expr1_0); - return Some(expr2_0); - } - } - &Opcode::TlsValue => { - if let Some((pattern4_0, pattern4_1, pattern4_2)) = - C::symbol_value_data(ctx, pattern2_1) - { - if pattern4_2 == 0i128 as i64 { - let mut closure6 = || { - let expr0_0 = C::tls_model_is_elf_gd(ctx)?; - return Some(expr0_0); - }; - if let Some(pattern6_0) = closure6() { - // Rule at src/isa/s390x/lower.isle line 2248. - let expr0_0 = SymbolReloc::TlsGd { name: pattern4_0 }; - let expr1_0 = C::memarg_got(ctx); - let expr2_0 = constructor_load_addr(ctx, &expr1_0); - let expr3_0 = constructor_load_symbol_reloc(ctx, &expr0_0); - let expr4_0 = constructor_lib_call_tls_get_offset( - ctx, expr2_0, expr3_0, &expr0_0, - ); - let expr5_0: Type = I64; - let expr6_0 = constructor_thread_pointer(ctx); - let expr7_0 = constructor_add_reg(ctx, expr5_0, expr4_0, expr6_0); - let expr8_0 = constructor_output_reg(ctx, expr7_0); - return Some(expr8_0); - } - } - } - } - _ => {} - } - } - &InstructionData::UnaryIeee32 { - opcode: ref pattern2_0, - imm: pattern2_1, - } => { - if let &Opcode::F32const = pattern2_0 { - let pattern4_0 = C::u64_from_ieee32(ctx, pattern2_1); - // Rule at src/isa/s390x/lower.isle line 21. - let expr0_0: Type = F32; - let expr1_0 = constructor_imm(ctx, expr0_0, pattern4_0); - let expr2_0 = constructor_output_reg(ctx, expr1_0); - return Some(expr2_0); - } - } - &InstructionData::UnaryIeee64 { - opcode: ref pattern2_0, - imm: pattern2_1, - } => { - if let &Opcode::F64const = pattern2_0 { - let pattern4_0 = C::u64_from_ieee64(ctx, pattern2_1); - // Rule at src/isa/s390x/lower.isle line 27. - let expr0_0: Type = F64; - let expr1_0 = constructor_imm(ctx, expr0_0, pattern4_0); - let expr2_0 = constructor_output_reg(ctx, expr1_0); - return Some(expr2_0); - } - } - &InstructionData::Trap { - opcode: ref pattern2_0, - code: ref pattern2_1, - } => { - match pattern2_0 { - &Opcode::Trap => { - // Rule at src/isa/s390x/lower.isle line 3777. - let expr0_0 = constructor_trap_impl(ctx, pattern2_1); - let expr1_0 = constructor_side_effect(ctx, &expr0_0); - return Some(expr1_0); - } - &Opcode::ResumableTrap => { - // Rule at src/isa/s390x/lower.isle line 3783. - let expr0_0 = constructor_trap_impl(ctx, pattern2_1); - let expr1_0 = constructor_side_effect(ctx, &expr0_0); - return Some(expr1_0); - } - _ => {} - } - } - &InstructionData::Binary { - opcode: ref pattern2_0, - args: ref pattern2_1, - } => { - match pattern2_0 { - &Opcode::Snarrow => { - let (pattern4_0, pattern4_1) = C::unpack_value_array_2(ctx, pattern2_1); - let pattern5_0 = C::value_type(ctx, pattern4_0); - if let Some(pattern6_0) = C::ty_vec128(ctx, pattern5_0) { - // Rule at src/isa/s390x/lower.isle line 903. - let expr0_0 = C::put_in_reg(ctx, pattern4_0); - let expr1_0 = C::put_in_reg(ctx, pattern4_1); - let expr2_0 = - constructor_vec_pack_ssat_lane_order(ctx, pattern6_0, expr0_0, expr1_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - } - &Opcode::Unarrow => { - let (pattern4_0, pattern4_1) = C::unpack_value_array_2(ctx, pattern2_1); - let pattern5_0 = C::value_type(ctx, pattern4_0); - if let Some(pattern6_0) = C::ty_vec128(ctx, pattern5_0) { - // Rule at src/isa/s390x/lower.isle line 915. - let expr0_0: u128 = 0i128 as u128; - let expr1_0 = constructor_vec_imm(ctx, pattern6_0, expr0_0); - let expr2_0 = C::put_in_reg(ctx, pattern4_0); - let expr3_0 = constructor_vec_smax(ctx, pattern6_0, expr2_0, expr1_0); - let expr4_0 = C::put_in_reg(ctx, pattern4_1); - let expr5_0 = constructor_vec_smax(ctx, pattern6_0, expr4_0, expr1_0); - let expr6_0 = - constructor_vec_pack_usat_lane_order(ctx, pattern6_0, expr3_0, expr5_0); - let expr7_0 = constructor_output_reg(ctx, expr6_0); - return Some(expr7_0); - } - } - &Opcode::Uunarrow => { - let (pattern4_0, pattern4_1) = C::unpack_value_array_2(ctx, pattern2_1); - let pattern5_0 = C::value_type(ctx, pattern4_0); - if let Some(pattern6_0) = C::ty_vec128(ctx, pattern5_0) { - // Rule at src/isa/s390x/lower.isle line 909. - let expr0_0 = C::put_in_reg(ctx, pattern4_0); - let expr1_0 = C::put_in_reg(ctx, pattern4_1); - let expr2_0 = - constructor_vec_pack_usat_lane_order(ctx, pattern6_0, expr0_0, expr1_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - } - _ => {} - } - } - &InstructionData::Shuffle { - opcode: ref pattern2_0, - args: ref pattern2_1, - imm: pattern2_2, - } => { - if let &Opcode::Shuffle = pattern2_0 { - let (pattern4_0, pattern4_1) = C::unpack_value_array_2(ctx, pattern2_1); - if let Some(pattern5_0) = C::u128_from_immediate(ctx, pattern2_2) { - let (pattern6_0, pattern6_1) = C::shuffle_mask_from_u128(ctx, pattern5_0); - let (pattern7_0, pattern7_1) = C::u64_pair_split(ctx, pattern6_0); - let (pattern8_0, pattern8_1) = C::u32_pair_split(ctx, pattern7_0); - let (pattern9_0, pattern9_1) = C::u16_pair_split(ctx, pattern8_0); - let (pattern10_0, pattern10_1) = C::u8_pair_split(ctx, pattern9_0); - if pattern10_0 == 0i128 as u8 { - if pattern10_1 == 0i128 as u8 { - let (pattern13_0, pattern13_1) = C::u8_pair_split(ctx, pattern9_1); - if pattern13_0 == 1i128 as u8 { - if pattern13_1 == 1i128 as u8 { - let (pattern16_0, pattern16_1) = - C::u16_pair_split(ctx, pattern8_1); - let (pattern17_0, pattern17_1) = - C::u8_pair_split(ctx, pattern16_0); - if pattern17_0 == 2i128 as u8 { - if pattern17_1 == 2i128 as u8 { - let (pattern20_0, pattern20_1) = - C::u8_pair_split(ctx, pattern16_1); - if pattern20_0 == 3i128 as u8 { - if pattern20_1 == 3i128 as u8 { - let (pattern23_0, pattern23_1) = - C::u32_pair_split(ctx, pattern7_1); - let (pattern24_0, pattern24_1) = - C::u16_pair_split(ctx, pattern23_0); - let (pattern25_0, pattern25_1) = - C::u8_pair_split(ctx, pattern24_0); - if pattern25_0 == 4i128 as u8 { - if pattern25_1 == 4i128 as u8 { - let (pattern28_0, pattern28_1) = - C::u8_pair_split(ctx, pattern24_1); - if pattern28_0 == 5i128 as u8 { - if pattern28_1 == 5i128 as u8 { - let (pattern31_0, pattern31_1) = - C::u16_pair_split( - ctx, - pattern23_1, - ); - let (pattern32_0, pattern32_1) = - C::u8_pair_split( - ctx, - pattern31_0, - ); - if pattern32_0 == 6i128 as u8 { - if pattern32_1 - == 6i128 as u8 - { - let ( - pattern35_0, - pattern35_1, - ) = C::u8_pair_split( - ctx, - pattern31_1, - ); - if pattern35_0 - == 7i128 as u8 - { - if pattern35_1 - == 7i128 as u8 - { - if pattern6_1 - == 65535i128 - as u16 - { - // Rule at src/isa/s390x/lower.isle line 2061. - let expr0_0: Type = I8X16; - let expr1_0 = C::put_in_reg(ctx, pattern4_0); - let expr2_0 = C::put_in_reg(ctx, pattern4_0); - let expr3_0 = constructor_vec_merge_high(ctx, expr0_0, expr1_0, expr2_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - } - } - } - } - } - } - } - } - } - } - } - } - } - } - } - if pattern10_1 == 1i128 as u8 { - let (pattern13_0, pattern13_1) = C::u8_pair_split(ctx, pattern9_1); - if pattern13_0 == 0i128 as u8 { - if pattern13_1 == 1i128 as u8 { - let (pattern16_0, pattern16_1) = - C::u16_pair_split(ctx, pattern8_1); - let (pattern17_0, pattern17_1) = - C::u8_pair_split(ctx, pattern16_0); - if pattern17_0 == 2i128 as u8 { - if pattern17_1 == 3i128 as u8 { - let (pattern20_0, pattern20_1) = - C::u8_pair_split(ctx, pattern16_1); - if pattern20_0 == 2i128 as u8 { - if pattern20_1 == 3i128 as u8 { - let (pattern23_0, pattern23_1) = - C::u32_pair_split(ctx, pattern7_1); - let (pattern24_0, pattern24_1) = - C::u16_pair_split(ctx, pattern23_0); - let (pattern25_0, pattern25_1) = - C::u8_pair_split(ctx, pattern24_0); - if pattern25_0 == 4i128 as u8 { - if pattern25_1 == 5i128 as u8 { - let (pattern28_0, pattern28_1) = - C::u8_pair_split(ctx, pattern24_1); - if pattern28_0 == 4i128 as u8 { - if pattern28_1 == 5i128 as u8 { - let (pattern31_0, pattern31_1) = - C::u16_pair_split( - ctx, - pattern23_1, - ); - let (pattern32_0, pattern32_1) = - C::u8_pair_split( - ctx, - pattern31_0, - ); - if pattern32_0 == 6i128 as u8 { - if pattern32_1 - == 7i128 as u8 - { - let ( - pattern35_0, - pattern35_1, - ) = C::u8_pair_split( - ctx, - pattern31_1, - ); - if pattern35_0 - == 6i128 as u8 - { - if pattern35_1 - == 7i128 as u8 - { - if pattern6_1 - == 65535i128 - as u16 - { - // Rule at src/isa/s390x/lower.isle line 2059. - let expr0_0: Type = I16X8; - let expr1_0 = C::put_in_reg(ctx, pattern4_0); - let expr2_0 = C::put_in_reg(ctx, pattern4_0); - let expr3_0 = constructor_vec_merge_high(ctx, expr0_0, expr1_0, expr2_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - } - } - } - } - } - } - } - } - } - } - } - } - } - } - if pattern13_0 == 2i128 as u8 { - if pattern13_1 == 3i128 as u8 { - let (pattern16_0, pattern16_1) = - C::u16_pair_split(ctx, pattern8_1); - let (pattern17_0, pattern17_1) = - C::u8_pair_split(ctx, pattern16_0); - if pattern17_0 == 0i128 as u8 { - if pattern17_1 == 1i128 as u8 { - let (pattern20_0, pattern20_1) = - C::u8_pair_split(ctx, pattern16_1); - if pattern20_0 == 2i128 as u8 { - if pattern20_1 == 3i128 as u8 { - let (pattern23_0, pattern23_1) = - C::u32_pair_split(ctx, pattern7_1); - let (pattern24_0, pattern24_1) = - C::u16_pair_split(ctx, pattern23_0); - let (pattern25_0, pattern25_1) = - C::u8_pair_split(ctx, pattern24_0); - if pattern25_0 == 4i128 as u8 { - if pattern25_1 == 5i128 as u8 { - let (pattern28_0, pattern28_1) = - C::u8_pair_split(ctx, pattern24_1); - if pattern28_0 == 6i128 as u8 { - if pattern28_1 == 7i128 as u8 { - let (pattern31_0, pattern31_1) = - C::u16_pair_split( - ctx, - pattern23_1, - ); - let (pattern32_0, pattern32_1) = - C::u8_pair_split( - ctx, - pattern31_0, - ); - if pattern32_0 == 4i128 as u8 { - if pattern32_1 - == 5i128 as u8 - { - let ( - pattern35_0, - pattern35_1, - ) = C::u8_pair_split( - ctx, - pattern31_1, - ); - if pattern35_0 - == 6i128 as u8 - { - if pattern35_1 - == 7i128 as u8 - { - if pattern6_1 - == 65535i128 - as u16 - { - // Rule at src/isa/s390x/lower.isle line 2057. - let expr0_0: Type = I32X4; - let expr1_0 = C::put_in_reg(ctx, pattern4_0); - let expr2_0 = C::put_in_reg(ctx, pattern4_0); - let expr3_0 = constructor_vec_merge_high(ctx, expr0_0, expr1_0, expr2_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - } - } - } - } - } - } - } - } - } - } - } - } - if pattern17_0 == 4i128 as u8 { - if pattern17_1 == 5i128 as u8 { - let (pattern20_0, pattern20_1) = - C::u8_pair_split(ctx, pattern16_1); - if pattern20_0 == 6i128 as u8 { - if pattern20_1 == 7i128 as u8 { - let (pattern23_0, pattern23_1) = - C::u32_pair_split(ctx, pattern7_1); - let (pattern24_0, pattern24_1) = - C::u16_pair_split(ctx, pattern23_0); - let (pattern25_0, pattern25_1) = - C::u8_pair_split(ctx, pattern24_0); - if pattern25_0 == 0i128 as u8 { - if pattern25_1 == 1i128 as u8 { - let (pattern28_0, pattern28_1) = - C::u8_pair_split(ctx, pattern24_1); - if pattern28_0 == 2i128 as u8 { - if pattern28_1 == 3i128 as u8 { - let (pattern31_0, pattern31_1) = - C::u16_pair_split( - ctx, - pattern23_1, - ); - let (pattern32_0, pattern32_1) = - C::u8_pair_split( - ctx, - pattern31_0, - ); - if pattern32_0 == 4i128 as u8 { - if pattern32_1 - == 5i128 as u8 - { - let ( - pattern35_0, - pattern35_1, - ) = C::u8_pair_split( - ctx, - pattern31_1, - ); - if pattern35_0 - == 6i128 as u8 - { - if pattern35_1 - == 7i128 as u8 - { - if pattern6_1 - == 65535i128 - as u16 - { - // Rule at src/isa/s390x/lower.isle line 2055. - let expr0_0: Type = I64X2; - let expr1_0 = C::put_in_reg(ctx, pattern4_0); - let expr2_0 = C::put_in_reg(ctx, pattern4_0); - let expr3_0 = constructor_vec_merge_high(ctx, expr0_0, expr1_0, expr2_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - } - } - } - } - } - } - } - } - if pattern25_0 == 8i128 as u8 { - if pattern25_1 == 9i128 as u8 { - let (pattern28_0, pattern28_1) = - C::u8_pair_split(ctx, pattern24_1); - if pattern28_0 == 10i128 as u8 { - if pattern28_1 == 11i128 as u8 { - let (pattern31_0, pattern31_1) = - C::u16_pair_split( - ctx, - pattern23_1, - ); - let (pattern32_0, pattern32_1) = - C::u8_pair_split( - ctx, - pattern31_0, - ); - if pattern32_0 == 12i128 as u8 { - if pattern32_1 - == 13i128 as u8 - { - let ( - pattern35_0, - pattern35_1, - ) = C::u8_pair_split( - ctx, - pattern31_1, - ); - if pattern35_0 - == 14i128 as u8 - { - if pattern35_1 - == 15i128 as u8 - { - if pattern6_1 - == 65535i128 - as u16 - { - // Rule at src/isa/s390x/lower.isle line 2169. - let expr0_0: Type = I8X16; - let expr1_0 = C::put_in_reg(ctx, pattern4_0); - let expr2_0: u8 = 0i128 as u8; - let expr3_0 = C::put_in_reg(ctx, pattern4_0); - let expr4_0: u8 = 1i128 as u8; - let expr5_0 = constructor_vec_permute_dw_imm(ctx, expr0_0, expr1_0, expr2_0, expr3_0, expr4_0); - let expr6_0 = constructor_output_reg(ctx, expr5_0); - return Some(expr6_0); - } - } - } - } - } - } - } - } - } - if pattern25_0 == 16i128 as u8 { - if pattern25_1 == 17i128 as u8 { - let (pattern28_0, pattern28_1) = - C::u8_pair_split(ctx, pattern24_1); - if pattern28_0 == 18i128 as u8 { - if pattern28_1 == 19i128 as u8 { - let (pattern31_0, pattern31_1) = - C::u16_pair_split( - ctx, - pattern23_1, - ); - let (pattern32_0, pattern32_1) = - C::u8_pair_split( - ctx, - pattern31_0, - ); - if pattern32_0 == 20i128 as u8 { - if pattern32_1 - == 21i128 as u8 - { - let ( - pattern35_0, - pattern35_1, - ) = C::u8_pair_split( - ctx, - pattern31_1, - ); - if pattern35_0 - == 22i128 as u8 - { - if pattern35_1 - == 23i128 as u8 - { - if pattern6_1 - == 65535i128 - as u16 - { - // Rule at src/isa/s390x/lower.isle line 2039. - let expr0_0: Type = I64X2; - let expr1_0 = C::put_in_reg(ctx, pattern4_0); - let expr2_0 = C::put_in_reg(ctx, pattern4_1); - let expr3_0 = constructor_vec_merge_high(ctx, expr0_0, expr1_0, expr2_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - } - } - } - } - } - } - } - } - if pattern25_0 == 24i128 as u8 { - if pattern25_1 == 25i128 as u8 { - let (pattern28_0, pattern28_1) = - C::u8_pair_split(ctx, pattern24_1); - if pattern28_0 == 26i128 as u8 { - if pattern28_1 == 27i128 as u8 { - let (pattern31_0, pattern31_1) = - C::u16_pair_split( - ctx, - pattern23_1, - ); - let (pattern32_0, pattern32_1) = - C::u8_pair_split( - ctx, - pattern31_0, - ); - if pattern32_0 == 28i128 as u8 { - if pattern32_1 - == 29i128 as u8 - { - let ( - pattern35_0, - pattern35_1, - ) = C::u8_pair_split( - ctx, - pattern31_1, - ); - if pattern35_0 - == 30i128 as u8 - { - if pattern35_1 - == 31i128 as u8 - { - if pattern6_1 - == 65535i128 - as u16 - { - // Rule at src/isa/s390x/lower.isle line 2161. - let expr0_0: Type = I8X16; - let expr1_0 = C::put_in_reg(ctx, pattern4_0); - let expr2_0: u8 = 0i128 as u8; - let expr3_0 = C::put_in_reg(ctx, pattern4_1); - let expr4_0: u8 = 1i128 as u8; - let expr5_0 = constructor_vec_permute_dw_imm(ctx, expr0_0, expr1_0, expr2_0, expr3_0, expr4_0); - let expr6_0 = constructor_output_reg(ctx, expr5_0); - return Some(expr6_0); - } - } - } - } - } - } - } - } - } - } - } - } - } - if pattern17_0 == 16i128 as u8 { - if pattern17_1 == 17i128 as u8 { - let (pattern20_0, pattern20_1) = - C::u8_pair_split(ctx, pattern16_1); - if pattern20_0 == 18i128 as u8 { - if pattern20_1 == 19i128 as u8 { - let (pattern23_0, pattern23_1) = - C::u32_pair_split(ctx, pattern7_1); - let (pattern24_0, pattern24_1) = - C::u16_pair_split(ctx, pattern23_0); - let (pattern25_0, pattern25_1) = - C::u8_pair_split(ctx, pattern24_0); - if pattern25_0 == 4i128 as u8 { - if pattern25_1 == 5i128 as u8 { - let (pattern28_0, pattern28_1) = - C::u8_pair_split(ctx, pattern24_1); - if pattern28_0 == 6i128 as u8 { - if pattern28_1 == 7i128 as u8 { - let (pattern31_0, pattern31_1) = - C::u16_pair_split( - ctx, - pattern23_1, - ); - let (pattern32_0, pattern32_1) = - C::u8_pair_split( - ctx, - pattern31_0, - ); - if pattern32_0 == 20i128 as u8 { - if pattern32_1 - == 21i128 as u8 - { - let ( - pattern35_0, - pattern35_1, - ) = C::u8_pair_split( - ctx, - pattern31_1, - ); - if pattern35_0 - == 22i128 as u8 - { - if pattern35_1 - == 23i128 as u8 - { - if pattern6_1 - == 65535i128 - as u16 - { - // Rule at src/isa/s390x/lower.isle line 2041. - let expr0_0: Type = I32X4; - let expr1_0 = C::put_in_reg(ctx, pattern4_0); - let expr2_0 = C::put_in_reg(ctx, pattern4_1); - let expr3_0 = constructor_vec_merge_high(ctx, expr0_0, expr1_0, expr2_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - } - } - } - } - } - } - } - } - } - } - } - } - } - } - if pattern13_0 == 16i128 as u8 { - if pattern13_1 == 17i128 as u8 { - let (pattern16_0, pattern16_1) = - C::u16_pair_split(ctx, pattern8_1); - let (pattern17_0, pattern17_1) = - C::u8_pair_split(ctx, pattern16_0); - if pattern17_0 == 2i128 as u8 { - if pattern17_1 == 3i128 as u8 { - let (pattern20_0, pattern20_1) = - C::u8_pair_split(ctx, pattern16_1); - if pattern20_0 == 18i128 as u8 { - if pattern20_1 == 19i128 as u8 { - let (pattern23_0, pattern23_1) = - C::u32_pair_split(ctx, pattern7_1); - let (pattern24_0, pattern24_1) = - C::u16_pair_split(ctx, pattern23_0); - let (pattern25_0, pattern25_1) = - C::u8_pair_split(ctx, pattern24_0); - if pattern25_0 == 4i128 as u8 { - if pattern25_1 == 5i128 as u8 { - let (pattern28_0, pattern28_1) = - C::u8_pair_split(ctx, pattern24_1); - if pattern28_0 == 20i128 as u8 { - if pattern28_1 == 21i128 as u8 { - let (pattern31_0, pattern31_1) = - C::u16_pair_split( - ctx, - pattern23_1, - ); - let (pattern32_0, pattern32_1) = - C::u8_pair_split( - ctx, - pattern31_0, - ); - if pattern32_0 == 6i128 as u8 { - if pattern32_1 - == 7i128 as u8 - { - let ( - pattern35_0, - pattern35_1, - ) = C::u8_pair_split( - ctx, - pattern31_1, - ); - if pattern35_0 - == 22i128 as u8 - { - if pattern35_1 - == 23i128 as u8 - { - if pattern6_1 - == 65535i128 - as u16 - { - // Rule at src/isa/s390x/lower.isle line 2043. - let expr0_0: Type = I16X8; - let expr1_0 = C::put_in_reg(ctx, pattern4_0); - let expr2_0 = C::put_in_reg(ctx, pattern4_1); - let expr3_0 = constructor_vec_merge_high(ctx, expr0_0, expr1_0, expr2_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - } - } - } - } - } - } - } - } - } - } - } - } - } - } - } - if pattern10_1 == 16i128 as u8 { - let (pattern13_0, pattern13_1) = C::u8_pair_split(ctx, pattern9_1); - if pattern13_0 == 1i128 as u8 { - if pattern13_1 == 17i128 as u8 { - let (pattern16_0, pattern16_1) = - C::u16_pair_split(ctx, pattern8_1); - let (pattern17_0, pattern17_1) = - C::u8_pair_split(ctx, pattern16_0); - if pattern17_0 == 2i128 as u8 { - if pattern17_1 == 18i128 as u8 { - let (pattern20_0, pattern20_1) = - C::u8_pair_split(ctx, pattern16_1); - if pattern20_0 == 3i128 as u8 { - if pattern20_1 == 19i128 as u8 { - let (pattern23_0, pattern23_1) = - C::u32_pair_split(ctx, pattern7_1); - let (pattern24_0, pattern24_1) = - C::u16_pair_split(ctx, pattern23_0); - let (pattern25_0, pattern25_1) = - C::u8_pair_split(ctx, pattern24_0); - if pattern25_0 == 4i128 as u8 { - if pattern25_1 == 20i128 as u8 { - let (pattern28_0, pattern28_1) = - C::u8_pair_split(ctx, pattern24_1); - if pattern28_0 == 5i128 as u8 { - if pattern28_1 == 21i128 as u8 { - let (pattern31_0, pattern31_1) = - C::u16_pair_split( - ctx, - pattern23_1, - ); - let (pattern32_0, pattern32_1) = - C::u8_pair_split( - ctx, - pattern31_0, - ); - if pattern32_0 == 6i128 as u8 { - if pattern32_1 - == 22i128 as u8 - { - let ( - pattern35_0, - pattern35_1, - ) = C::u8_pair_split( - ctx, - pattern31_1, - ); - if pattern35_0 - == 7i128 as u8 - { - if pattern35_1 - == 23i128 as u8 - { - if pattern6_1 - == 65535i128 - as u16 - { - // Rule at src/isa/s390x/lower.isle line 2045. - let expr0_0: Type = I8X16; - let expr1_0 = C::put_in_reg(ctx, pattern4_0); - let expr2_0 = C::put_in_reg(ctx, pattern4_1); - let expr3_0 = constructor_vec_merge_high(ctx, expr0_0, expr1_0, expr2_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - } - } - } - } - } - } - } - } - } - } - } - } - } - } - } - } - if pattern10_0 == 1i128 as u8 { - if pattern10_1 == 3i128 as u8 { - let (pattern13_0, pattern13_1) = C::u8_pair_split(ctx, pattern9_1); - if pattern13_0 == 5i128 as u8 { - if pattern13_1 == 7i128 as u8 { - let (pattern16_0, pattern16_1) = - C::u16_pair_split(ctx, pattern8_1); - let (pattern17_0, pattern17_1) = - C::u8_pair_split(ctx, pattern16_0); - if pattern17_0 == 9i128 as u8 { - if pattern17_1 == 11i128 as u8 { - let (pattern20_0, pattern20_1) = - C::u8_pair_split(ctx, pattern16_1); - if pattern20_0 == 13i128 as u8 { - if pattern20_1 == 15i128 as u8 { - let (pattern23_0, pattern23_1) = - C::u32_pair_split(ctx, pattern7_1); - let (pattern24_0, pattern24_1) = - C::u16_pair_split(ctx, pattern23_0); - let (pattern25_0, pattern25_1) = - C::u8_pair_split(ctx, pattern24_0); - if pattern25_0 == 1i128 as u8 { - if pattern25_1 == 3i128 as u8 { - let (pattern28_0, pattern28_1) = - C::u8_pair_split(ctx, pattern24_1); - if pattern28_0 == 5i128 as u8 { - if pattern28_1 == 7i128 as u8 { - let (pattern31_0, pattern31_1) = - C::u16_pair_split( - ctx, - pattern23_1, - ); - let (pattern32_0, pattern32_1) = - C::u8_pair_split( - ctx, - pattern31_0, - ); - if pattern32_0 == 9i128 as u8 { - if pattern32_1 - == 11i128 as u8 - { - let ( - pattern35_0, - pattern35_1, - ) = C::u8_pair_split( - ctx, - pattern31_1, - ); - if pattern35_0 - == 13i128 as u8 - { - if pattern35_1 - == 15i128 as u8 - { - if pattern6_1 - == 65535i128 - as u16 - { - // Rule at src/isa/s390x/lower.isle line 2123. - let expr0_0: Type = I16X8; - let expr1_0 = C::put_in_reg(ctx, pattern4_0); - let expr2_0 = C::put_in_reg(ctx, pattern4_0); - let expr3_0 = constructor_vec_pack(ctx, expr0_0, expr1_0, expr2_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - } - } - } - } - } - } - } - } - if pattern25_0 == 17i128 as u8 { - if pattern25_1 == 19i128 as u8 { - let (pattern28_0, pattern28_1) = - C::u8_pair_split(ctx, pattern24_1); - if pattern28_0 == 21i128 as u8 { - if pattern28_1 == 23i128 as u8 { - let (pattern31_0, pattern31_1) = - C::u16_pair_split( - ctx, - pattern23_1, - ); - let (pattern32_0, pattern32_1) = - C::u8_pair_split( - ctx, - pattern31_0, - ); - if pattern32_0 == 25i128 as u8 { - if pattern32_1 - == 27i128 as u8 - { - let ( - pattern35_0, - pattern35_1, - ) = C::u8_pair_split( - ctx, - pattern31_1, - ); - if pattern35_0 - == 29i128 as u8 - { - if pattern35_1 - == 31i128 as u8 - { - if pattern6_1 - == 65535i128 - as u16 - { - // Rule at src/isa/s390x/lower.isle line 2111. - let expr0_0: Type = I16X8; - let expr1_0 = C::put_in_reg(ctx, pattern4_0); - let expr2_0 = C::put_in_reg(ctx, pattern4_1); - let expr3_0 = constructor_vec_pack(ctx, expr0_0, expr1_0, expr2_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - } - } - } - } - } - } - } - } - } - } - } - } - } - } - } - } - if pattern10_0 == 2i128 as u8 { - if pattern10_1 == 3i128 as u8 { - let (pattern13_0, pattern13_1) = C::u8_pair_split(ctx, pattern9_1); - if pattern13_0 == 6i128 as u8 { - if pattern13_1 == 7i128 as u8 { - let (pattern16_0, pattern16_1) = - C::u16_pair_split(ctx, pattern8_1); - let (pattern17_0, pattern17_1) = - C::u8_pair_split(ctx, pattern16_0); - if pattern17_0 == 10i128 as u8 { - if pattern17_1 == 11i128 as u8 { - let (pattern20_0, pattern20_1) = - C::u8_pair_split(ctx, pattern16_1); - if pattern20_0 == 14i128 as u8 { - if pattern20_1 == 15i128 as u8 { - let (pattern23_0, pattern23_1) = - C::u32_pair_split(ctx, pattern7_1); - let (pattern24_0, pattern24_1) = - C::u16_pair_split(ctx, pattern23_0); - let (pattern25_0, pattern25_1) = - C::u8_pair_split(ctx, pattern24_0); - if pattern25_0 == 2i128 as u8 { - if pattern25_1 == 3i128 as u8 { - let (pattern28_0, pattern28_1) = - C::u8_pair_split(ctx, pattern24_1); - if pattern28_0 == 6i128 as u8 { - if pattern28_1 == 7i128 as u8 { - let (pattern31_0, pattern31_1) = - C::u16_pair_split( - ctx, - pattern23_1, - ); - let (pattern32_0, pattern32_1) = - C::u8_pair_split( - ctx, - pattern31_0, - ); - if pattern32_0 == 10i128 as u8 { - if pattern32_1 - == 11i128 as u8 - { - let ( - pattern35_0, - pattern35_1, - ) = C::u8_pair_split( - ctx, - pattern31_1, - ); - if pattern35_0 - == 14i128 as u8 - { - if pattern35_1 - == 15i128 as u8 - { - if pattern6_1 - == 65535i128 - as u16 - { - // Rule at src/isa/s390x/lower.isle line 2121. - let expr0_0: Type = I32X4; - let expr1_0 = C::put_in_reg(ctx, pattern4_0); - let expr2_0 = C::put_in_reg(ctx, pattern4_0); - let expr3_0 = constructor_vec_pack(ctx, expr0_0, expr1_0, expr2_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - } - } - } - } - } - } - } - } - if pattern25_0 == 18i128 as u8 { - if pattern25_1 == 19i128 as u8 { - let (pattern28_0, pattern28_1) = - C::u8_pair_split(ctx, pattern24_1); - if pattern28_0 == 22i128 as u8 { - if pattern28_1 == 23i128 as u8 { - let (pattern31_0, pattern31_1) = - C::u16_pair_split( - ctx, - pattern23_1, - ); - let (pattern32_0, pattern32_1) = - C::u8_pair_split( - ctx, - pattern31_0, - ); - if pattern32_0 == 26i128 as u8 { - if pattern32_1 - == 27i128 as u8 - { - let ( - pattern35_0, - pattern35_1, - ) = C::u8_pair_split( - ctx, - pattern31_1, - ); - if pattern35_0 - == 30i128 as u8 - { - if pattern35_1 - == 31i128 as u8 - { - if pattern6_1 - == 65535i128 - as u16 - { - // Rule at src/isa/s390x/lower.isle line 2109. - let expr0_0: Type = I32X4; - let expr1_0 = C::put_in_reg(ctx, pattern4_0); - let expr2_0 = C::put_in_reg(ctx, pattern4_1); - let expr3_0 = constructor_vec_pack(ctx, expr0_0, expr1_0, expr2_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - } - } - } - } - } - } - } - } - } - } - } - } - } - } - } - } - if pattern10_0 == 4i128 as u8 { - if pattern10_1 == 5i128 as u8 { - let (pattern13_0, pattern13_1) = C::u8_pair_split(ctx, pattern9_1); - if pattern13_0 == 6i128 as u8 { - if pattern13_1 == 7i128 as u8 { - let (pattern16_0, pattern16_1) = - C::u16_pair_split(ctx, pattern8_1); - let (pattern17_0, pattern17_1) = - C::u8_pair_split(ctx, pattern16_0); - if pattern17_0 == 12i128 as u8 { - if pattern17_1 == 13i128 as u8 { - let (pattern20_0, pattern20_1) = - C::u8_pair_split(ctx, pattern16_1); - if pattern20_0 == 14i128 as u8 { - if pattern20_1 == 15i128 as u8 { - let (pattern23_0, pattern23_1) = - C::u32_pair_split(ctx, pattern7_1); - let (pattern24_0, pattern24_1) = - C::u16_pair_split(ctx, pattern23_0); - let (pattern25_0, pattern25_1) = - C::u8_pair_split(ctx, pattern24_0); - if pattern25_0 == 4i128 as u8 { - if pattern25_1 == 5i128 as u8 { - let (pattern28_0, pattern28_1) = - C::u8_pair_split(ctx, pattern24_1); - if pattern28_0 == 6i128 as u8 { - if pattern28_1 == 7i128 as u8 { - let (pattern31_0, pattern31_1) = - C::u16_pair_split( - ctx, - pattern23_1, - ); - let (pattern32_0, pattern32_1) = - C::u8_pair_split( - ctx, - pattern31_0, - ); - if pattern32_0 == 12i128 as u8 { - if pattern32_1 - == 13i128 as u8 - { - let ( - pattern35_0, - pattern35_1, - ) = C::u8_pair_split( - ctx, - pattern31_1, - ); - if pattern35_0 - == 14i128 as u8 - { - if pattern35_1 - == 15i128 as u8 - { - if pattern6_1 - == 65535i128 - as u16 - { - // Rule at src/isa/s390x/lower.isle line 2119. - let expr0_0: Type = I64X2; - let expr1_0 = C::put_in_reg(ctx, pattern4_0); - let expr2_0 = C::put_in_reg(ctx, pattern4_0); - let expr3_0 = constructor_vec_pack(ctx, expr0_0, expr1_0, expr2_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - } - } - } - } - } - } - } - } - if pattern25_0 == 20i128 as u8 { - if pattern25_1 == 21i128 as u8 { - let (pattern28_0, pattern28_1) = - C::u8_pair_split(ctx, pattern24_1); - if pattern28_0 == 22i128 as u8 { - if pattern28_1 == 23i128 as u8 { - let (pattern31_0, pattern31_1) = - C::u16_pair_split( - ctx, - pattern23_1, - ); - let (pattern32_0, pattern32_1) = - C::u8_pair_split( - ctx, - pattern31_0, - ); - if pattern32_0 == 28i128 as u8 { - if pattern32_1 - == 29i128 as u8 - { - let ( - pattern35_0, - pattern35_1, - ) = C::u8_pair_split( - ctx, - pattern31_1, - ); - if pattern35_0 - == 30i128 as u8 - { - if pattern35_1 - == 31i128 as u8 - { - if pattern6_1 - == 65535i128 - as u16 - { - // Rule at src/isa/s390x/lower.isle line 2107. - let expr0_0: Type = I64X2; - let expr1_0 = C::put_in_reg(ctx, pattern4_0); - let expr2_0 = C::put_in_reg(ctx, pattern4_1); - let expr3_0 = constructor_vec_pack(ctx, expr0_0, expr1_0, expr2_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - } - } - } - } - } - } - } - } - } - } - } - } - } - } - } - } - if pattern10_0 == 8i128 as u8 { - if pattern10_1 == 8i128 as u8 { - let (pattern13_0, pattern13_1) = C::u8_pair_split(ctx, pattern9_1); - if pattern13_0 == 9i128 as u8 { - if pattern13_1 == 9i128 as u8 { - let (pattern16_0, pattern16_1) = - C::u16_pair_split(ctx, pattern8_1); - let (pattern17_0, pattern17_1) = - C::u8_pair_split(ctx, pattern16_0); - if pattern17_0 == 10i128 as u8 { - if pattern17_1 == 10i128 as u8 { - let (pattern20_0, pattern20_1) = - C::u8_pair_split(ctx, pattern16_1); - if pattern20_0 == 11i128 as u8 { - if pattern20_1 == 11i128 as u8 { - let (pattern23_0, pattern23_1) = - C::u32_pair_split(ctx, pattern7_1); - let (pattern24_0, pattern24_1) = - C::u16_pair_split(ctx, pattern23_0); - let (pattern25_0, pattern25_1) = - C::u8_pair_split(ctx, pattern24_0); - if pattern25_0 == 12i128 as u8 { - if pattern25_1 == 12i128 as u8 { - let (pattern28_0, pattern28_1) = - C::u8_pair_split(ctx, pattern24_1); - if pattern28_0 == 13i128 as u8 { - if pattern28_1 == 13i128 as u8 { - let (pattern31_0, pattern31_1) = - C::u16_pair_split( - ctx, - pattern23_1, - ); - let (pattern32_0, pattern32_1) = - C::u8_pair_split( - ctx, - pattern31_0, - ); - if pattern32_0 == 14i128 as u8 { - if pattern32_1 - == 14i128 as u8 - { - let ( - pattern35_0, - pattern35_1, - ) = C::u8_pair_split( - ctx, - pattern31_1, - ); - if pattern35_0 - == 15i128 as u8 - { - if pattern35_1 - == 15i128 as u8 - { - if pattern6_1 - == 65535i128 - as u16 - { - // Rule at src/isa/s390x/lower.isle line 2095. - let expr0_0: Type = I8X16; - let expr1_0 = C::put_in_reg(ctx, pattern4_0); - let expr2_0 = C::put_in_reg(ctx, pattern4_0); - let expr3_0 = constructor_vec_merge_low(ctx, expr0_0, expr1_0, expr2_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - } - } - } - } - } - } - } - } - } - } - } - } - } - } - } - if pattern10_1 == 9i128 as u8 { - let (pattern13_0, pattern13_1) = C::u8_pair_split(ctx, pattern9_1); - if pattern13_0 == 8i128 as u8 { - if pattern13_1 == 9i128 as u8 { - let (pattern16_0, pattern16_1) = - C::u16_pair_split(ctx, pattern8_1); - let (pattern17_0, pattern17_1) = - C::u8_pair_split(ctx, pattern16_0); - if pattern17_0 == 10i128 as u8 { - if pattern17_1 == 11i128 as u8 { - let (pattern20_0, pattern20_1) = - C::u8_pair_split(ctx, pattern16_1); - if pattern20_0 == 10i128 as u8 { - if pattern20_1 == 11i128 as u8 { - let (pattern23_0, pattern23_1) = - C::u32_pair_split(ctx, pattern7_1); - let (pattern24_0, pattern24_1) = - C::u16_pair_split(ctx, pattern23_0); - let (pattern25_0, pattern25_1) = - C::u8_pair_split(ctx, pattern24_0); - if pattern25_0 == 12i128 as u8 { - if pattern25_1 == 13i128 as u8 { - let (pattern28_0, pattern28_1) = - C::u8_pair_split(ctx, pattern24_1); - if pattern28_0 == 12i128 as u8 { - if pattern28_1 == 13i128 as u8 { - let (pattern31_0, pattern31_1) = - C::u16_pair_split( - ctx, - pattern23_1, - ); - let (pattern32_0, pattern32_1) = - C::u8_pair_split( - ctx, - pattern31_0, - ); - if pattern32_0 == 14i128 as u8 { - if pattern32_1 - == 15i128 as u8 - { - let ( - pattern35_0, - pattern35_1, - ) = C::u8_pair_split( - ctx, - pattern31_1, - ); - if pattern35_0 - == 14i128 as u8 - { - if pattern35_1 - == 15i128 as u8 - { - if pattern6_1 - == 65535i128 - as u16 - { - // Rule at src/isa/s390x/lower.isle line 2093. - let expr0_0: Type = I16X8; - let expr1_0 = C::put_in_reg(ctx, pattern4_0); - let expr2_0 = C::put_in_reg(ctx, pattern4_0); - let expr3_0 = constructor_vec_merge_low(ctx, expr0_0, expr1_0, expr2_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - } - } - } - } - } - } - } - } - } - } - } - } - } - } - if pattern13_0 == 10i128 as u8 { - if pattern13_1 == 11i128 as u8 { - let (pattern16_0, pattern16_1) = - C::u16_pair_split(ctx, pattern8_1); - let (pattern17_0, pattern17_1) = - C::u8_pair_split(ctx, pattern16_0); - if pattern17_0 == 8i128 as u8 { - if pattern17_1 == 9i128 as u8 { - let (pattern20_0, pattern20_1) = - C::u8_pair_split(ctx, pattern16_1); - if pattern20_0 == 10i128 as u8 { - if pattern20_1 == 11i128 as u8 { - let (pattern23_0, pattern23_1) = - C::u32_pair_split(ctx, pattern7_1); - let (pattern24_0, pattern24_1) = - C::u16_pair_split(ctx, pattern23_0); - let (pattern25_0, pattern25_1) = - C::u8_pair_split(ctx, pattern24_0); - if pattern25_0 == 12i128 as u8 { - if pattern25_1 == 13i128 as u8 { - let (pattern28_0, pattern28_1) = - C::u8_pair_split(ctx, pattern24_1); - if pattern28_0 == 14i128 as u8 { - if pattern28_1 == 15i128 as u8 { - let (pattern31_0, pattern31_1) = - C::u16_pair_split( - ctx, - pattern23_1, - ); - let (pattern32_0, pattern32_1) = - C::u8_pair_split( - ctx, - pattern31_0, - ); - if pattern32_0 == 12i128 as u8 { - if pattern32_1 - == 13i128 as u8 - { - let ( - pattern35_0, - pattern35_1, - ) = C::u8_pair_split( - ctx, - pattern31_1, - ); - if pattern35_0 - == 14i128 as u8 - { - if pattern35_1 - == 15i128 as u8 - { - if pattern6_1 - == 65535i128 - as u16 - { - // Rule at src/isa/s390x/lower.isle line 2091. - let expr0_0: Type = I32X4; - let expr1_0 = C::put_in_reg(ctx, pattern4_0); - let expr2_0 = C::put_in_reg(ctx, pattern4_0); - let expr3_0 = constructor_vec_merge_low(ctx, expr0_0, expr1_0, expr2_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - } - } - } - } - } - } - } - } - } - } - } - } - if pattern17_0 == 12i128 as u8 { - if pattern17_1 == 13i128 as u8 { - let (pattern20_0, pattern20_1) = - C::u8_pair_split(ctx, pattern16_1); - if pattern20_0 == 14i128 as u8 { - if pattern20_1 == 15i128 as u8 { - let (pattern23_0, pattern23_1) = - C::u32_pair_split(ctx, pattern7_1); - let (pattern24_0, pattern24_1) = - C::u16_pair_split(ctx, pattern23_0); - let (pattern25_0, pattern25_1) = - C::u8_pair_split(ctx, pattern24_0); - if pattern25_0 == 0i128 as u8 { - if pattern25_1 == 1i128 as u8 { - let (pattern28_0, pattern28_1) = - C::u8_pair_split(ctx, pattern24_1); - if pattern28_0 == 2i128 as u8 { - if pattern28_1 == 3i128 as u8 { - let (pattern31_0, pattern31_1) = - C::u16_pair_split( - ctx, - pattern23_1, - ); - let (pattern32_0, pattern32_1) = - C::u8_pair_split( - ctx, - pattern31_0, - ); - if pattern32_0 == 4i128 as u8 { - if pattern32_1 - == 5i128 as u8 - { - let ( - pattern35_0, - pattern35_1, - ) = C::u8_pair_split( - ctx, - pattern31_1, - ); - if pattern35_0 - == 6i128 as u8 - { - if pattern35_1 - == 7i128 as u8 - { - if pattern6_1 - == 65535i128 - as u16 - { - // Rule at src/isa/s390x/lower.isle line 2171. - let expr0_0: Type = I8X16; - let expr1_0 = C::put_in_reg(ctx, pattern4_0); - let expr2_0: u8 = 1i128 as u8; - let expr3_0 = C::put_in_reg(ctx, pattern4_0); - let expr4_0: u8 = 0i128 as u8; - let expr5_0 = constructor_vec_permute_dw_imm(ctx, expr0_0, expr1_0, expr2_0, expr3_0, expr4_0); - let expr6_0 = constructor_output_reg(ctx, expr5_0); - return Some(expr6_0); - } - } - } - } - } - } - } - } - } - if pattern25_0 == 8i128 as u8 { - if pattern25_1 == 9i128 as u8 { - let (pattern28_0, pattern28_1) = - C::u8_pair_split(ctx, pattern24_1); - if pattern28_0 == 10i128 as u8 { - if pattern28_1 == 11i128 as u8 { - let (pattern31_0, pattern31_1) = - C::u16_pair_split( - ctx, - pattern23_1, - ); - let (pattern32_0, pattern32_1) = - C::u8_pair_split( - ctx, - pattern31_0, - ); - if pattern32_0 == 12i128 as u8 { - if pattern32_1 - == 13i128 as u8 - { - let ( - pattern35_0, - pattern35_1, - ) = C::u8_pair_split( - ctx, - pattern31_1, - ); - if pattern35_0 - == 14i128 as u8 - { - if pattern35_1 - == 15i128 as u8 - { - if pattern6_1 - == 65535i128 - as u16 - { - // Rule at src/isa/s390x/lower.isle line 2089. - let expr0_0: Type = I64X2; - let expr1_0 = C::put_in_reg(ctx, pattern4_0); - let expr2_0 = C::put_in_reg(ctx, pattern4_0); - let expr3_0 = constructor_vec_merge_low(ctx, expr0_0, expr1_0, expr2_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - } - } - } - } - } - } - } - } - if pattern25_0 == 16i128 as u8 { - if pattern25_1 == 17i128 as u8 { - let (pattern28_0, pattern28_1) = - C::u8_pair_split(ctx, pattern24_1); - if pattern28_0 == 18i128 as u8 { - if pattern28_1 == 19i128 as u8 { - let (pattern31_0, pattern31_1) = - C::u16_pair_split( - ctx, - pattern23_1, - ); - let (pattern32_0, pattern32_1) = - C::u8_pair_split( - ctx, - pattern31_0, - ); - if pattern32_0 == 20i128 as u8 { - if pattern32_1 - == 21i128 as u8 - { - let ( - pattern35_0, - pattern35_1, - ) = C::u8_pair_split( - ctx, - pattern31_1, - ); - if pattern35_0 - == 22i128 as u8 - { - if pattern35_1 - == 23i128 as u8 - { - if pattern6_1 - == 65535i128 - as u16 - { - // Rule at src/isa/s390x/lower.isle line 2163. - let expr0_0: Type = I8X16; - let expr1_0 = C::put_in_reg(ctx, pattern4_0); - let expr2_0: u8 = 1i128 as u8; - let expr3_0 = C::put_in_reg(ctx, pattern4_1); - let expr4_0: u8 = 0i128 as u8; - let expr5_0 = constructor_vec_permute_dw_imm(ctx, expr0_0, expr1_0, expr2_0, expr3_0, expr4_0); - let expr6_0 = constructor_output_reg(ctx, expr5_0); - return Some(expr6_0); - } - } - } - } - } - } - } - } - } - if pattern25_0 == 24i128 as u8 { - if pattern25_1 == 25i128 as u8 { - let (pattern28_0, pattern28_1) = - C::u8_pair_split(ctx, pattern24_1); - if pattern28_0 == 26i128 as u8 { - if pattern28_1 == 27i128 as u8 { - let (pattern31_0, pattern31_1) = - C::u16_pair_split( - ctx, - pattern23_1, - ); - let (pattern32_0, pattern32_1) = - C::u8_pair_split( - ctx, - pattern31_0, - ); - if pattern32_0 == 28i128 as u8 { - if pattern32_1 - == 29i128 as u8 - { - let ( - pattern35_0, - pattern35_1, - ) = C::u8_pair_split( - ctx, - pattern31_1, - ); - if pattern35_0 - == 30i128 as u8 - { - if pattern35_1 - == 31i128 as u8 - { - if pattern6_1 - == 65535i128 - as u16 - { - // Rule at src/isa/s390x/lower.isle line 2073. - let expr0_0: Type = I64X2; - let expr1_0 = C::put_in_reg(ctx, pattern4_0); - let expr2_0 = C::put_in_reg(ctx, pattern4_1); - let expr3_0 = constructor_vec_merge_low(ctx, expr0_0, expr1_0, expr2_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - } - } - } - } - } - } - } - } - } - } - } - } - if pattern17_0 == 24i128 as u8 { - if pattern17_1 == 25i128 as u8 { - let (pattern20_0, pattern20_1) = - C::u8_pair_split(ctx, pattern16_1); - if pattern20_0 == 26i128 as u8 { - if pattern20_1 == 27i128 as u8 { - let (pattern23_0, pattern23_1) = - C::u32_pair_split(ctx, pattern7_1); - let (pattern24_0, pattern24_1) = - C::u16_pair_split(ctx, pattern23_0); - let (pattern25_0, pattern25_1) = - C::u8_pair_split(ctx, pattern24_0); - if pattern25_0 == 12i128 as u8 { - if pattern25_1 == 13i128 as u8 { - let (pattern28_0, pattern28_1) = - C::u8_pair_split(ctx, pattern24_1); - if pattern28_0 == 14i128 as u8 { - if pattern28_1 == 15i128 as u8 { - let (pattern31_0, pattern31_1) = - C::u16_pair_split( - ctx, - pattern23_1, - ); - let (pattern32_0, pattern32_1) = - C::u8_pair_split( - ctx, - pattern31_0, - ); - if pattern32_0 == 28i128 as u8 { - if pattern32_1 - == 29i128 as u8 - { - let ( - pattern35_0, - pattern35_1, - ) = C::u8_pair_split( - ctx, - pattern31_1, - ); - if pattern35_0 - == 30i128 as u8 - { - if pattern35_1 - == 31i128 as u8 - { - if pattern6_1 - == 65535i128 - as u16 - { - // Rule at src/isa/s390x/lower.isle line 2075. - let expr0_0: Type = I32X4; - let expr1_0 = C::put_in_reg(ctx, pattern4_0); - let expr2_0 = C::put_in_reg(ctx, pattern4_1); - let expr3_0 = constructor_vec_merge_low(ctx, expr0_0, expr1_0, expr2_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - } - } - } - } - } - } - } - } - } - } - } - } - } - } - if pattern13_0 == 24i128 as u8 { - if pattern13_1 == 25i128 as u8 { - let (pattern16_0, pattern16_1) = - C::u16_pair_split(ctx, pattern8_1); - let (pattern17_0, pattern17_1) = - C::u8_pair_split(ctx, pattern16_0); - if pattern17_0 == 10i128 as u8 { - if pattern17_1 == 11i128 as u8 { - let (pattern20_0, pattern20_1) = - C::u8_pair_split(ctx, pattern16_1); - if pattern20_0 == 26i128 as u8 { - if pattern20_1 == 27i128 as u8 { - let (pattern23_0, pattern23_1) = - C::u32_pair_split(ctx, pattern7_1); - let (pattern24_0, pattern24_1) = - C::u16_pair_split(ctx, pattern23_0); - let (pattern25_0, pattern25_1) = - C::u8_pair_split(ctx, pattern24_0); - if pattern25_0 == 12i128 as u8 { - if pattern25_1 == 13i128 as u8 { - let (pattern28_0, pattern28_1) = - C::u8_pair_split(ctx, pattern24_1); - if pattern28_0 == 28i128 as u8 { - if pattern28_1 == 29i128 as u8 { - let (pattern31_0, pattern31_1) = - C::u16_pair_split( - ctx, - pattern23_1, - ); - let (pattern32_0, pattern32_1) = - C::u8_pair_split( - ctx, - pattern31_0, - ); - if pattern32_0 == 14i128 as u8 { - if pattern32_1 - == 15i128 as u8 - { - let ( - pattern35_0, - pattern35_1, - ) = C::u8_pair_split( - ctx, - pattern31_1, - ); - if pattern35_0 - == 30i128 as u8 - { - if pattern35_1 - == 31i128 as u8 - { - if pattern6_1 - == 65535i128 - as u16 - { - // Rule at src/isa/s390x/lower.isle line 2077. - let expr0_0: Type = I16X8; - let expr1_0 = C::put_in_reg(ctx, pattern4_0); - let expr2_0 = C::put_in_reg(ctx, pattern4_1); - let expr3_0 = constructor_vec_merge_low(ctx, expr0_0, expr1_0, expr2_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - } - } - } - } - } - } - } - } - } - } - } - } - } - } - } - if pattern10_1 == 24i128 as u8 { - let (pattern13_0, pattern13_1) = C::u8_pair_split(ctx, pattern9_1); - if pattern13_0 == 9i128 as u8 { - if pattern13_1 == 25i128 as u8 { - let (pattern16_0, pattern16_1) = - C::u16_pair_split(ctx, pattern8_1); - let (pattern17_0, pattern17_1) = - C::u8_pair_split(ctx, pattern16_0); - if pattern17_0 == 10i128 as u8 { - if pattern17_1 == 26i128 as u8 { - let (pattern20_0, pattern20_1) = - C::u8_pair_split(ctx, pattern16_1); - if pattern20_0 == 11i128 as u8 { - if pattern20_1 == 27i128 as u8 { - let (pattern23_0, pattern23_1) = - C::u32_pair_split(ctx, pattern7_1); - let (pattern24_0, pattern24_1) = - C::u16_pair_split(ctx, pattern23_0); - let (pattern25_0, pattern25_1) = - C::u8_pair_split(ctx, pattern24_0); - if pattern25_0 == 12i128 as u8 { - if pattern25_1 == 28i128 as u8 { - let (pattern28_0, pattern28_1) = - C::u8_pair_split(ctx, pattern24_1); - if pattern28_0 == 13i128 as u8 { - if pattern28_1 == 29i128 as u8 { - let (pattern31_0, pattern31_1) = - C::u16_pair_split( - ctx, - pattern23_1, - ); - let (pattern32_0, pattern32_1) = - C::u8_pair_split( - ctx, - pattern31_0, - ); - if pattern32_0 == 14i128 as u8 { - if pattern32_1 - == 30i128 as u8 - { - let ( - pattern35_0, - pattern35_1, - ) = C::u8_pair_split( - ctx, - pattern31_1, - ); - if pattern35_0 - == 15i128 as u8 - { - if pattern35_1 - == 31i128 as u8 - { - if pattern6_1 - == 65535i128 - as u16 - { - // Rule at src/isa/s390x/lower.isle line 2079. - let expr0_0: Type = I8X16; - let expr1_0 = C::put_in_reg(ctx, pattern4_0); - let expr2_0 = C::put_in_reg(ctx, pattern4_1); - let expr3_0 = constructor_vec_merge_low(ctx, expr0_0, expr1_0, expr2_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - } - } - } - } - } - } - } - } - } - } - } - } - } - } - } - } - if pattern10_0 == 16i128 as u8 { - if pattern10_1 == 0i128 as u8 { - let (pattern13_0, pattern13_1) = C::u8_pair_split(ctx, pattern9_1); - if pattern13_0 == 17i128 as u8 { - if pattern13_1 == 1i128 as u8 { - let (pattern16_0, pattern16_1) = - C::u16_pair_split(ctx, pattern8_1); - let (pattern17_0, pattern17_1) = - C::u8_pair_split(ctx, pattern16_0); - if pattern17_0 == 18i128 as u8 { - if pattern17_1 == 2i128 as u8 { - let (pattern20_0, pattern20_1) = - C::u8_pair_split(ctx, pattern16_1); - if pattern20_0 == 19i128 as u8 { - if pattern20_1 == 3i128 as u8 { - let (pattern23_0, pattern23_1) = - C::u32_pair_split(ctx, pattern7_1); - let (pattern24_0, pattern24_1) = - C::u16_pair_split(ctx, pattern23_0); - let (pattern25_0, pattern25_1) = - C::u8_pair_split(ctx, pattern24_0); - if pattern25_0 == 20i128 as u8 { - if pattern25_1 == 4i128 as u8 { - let (pattern28_0, pattern28_1) = - C::u8_pair_split(ctx, pattern24_1); - if pattern28_0 == 21i128 as u8 { - if pattern28_1 == 5i128 as u8 { - let (pattern31_0, pattern31_1) = - C::u16_pair_split( - ctx, - pattern23_1, - ); - let (pattern32_0, pattern32_1) = - C::u8_pair_split( - ctx, - pattern31_0, - ); - if pattern32_0 == 22i128 as u8 { - if pattern32_1 - == 6i128 as u8 - { - let ( - pattern35_0, - pattern35_1, - ) = C::u8_pair_split( - ctx, - pattern31_1, - ); - if pattern35_0 - == 23i128 as u8 - { - if pattern35_1 - == 7i128 as u8 - { - if pattern6_1 - == 65535i128 - as u16 - { - // Rule at src/isa/s390x/lower.isle line 2053. - let expr0_0: Type = I8X16; - let expr1_0 = C::put_in_reg(ctx, pattern4_1); - let expr2_0 = C::put_in_reg(ctx, pattern4_0); - let expr3_0 = constructor_vec_merge_high(ctx, expr0_0, expr1_0, expr2_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - } - } - } - } - } - } - } - } - } - } - } - } - } - } - } - if pattern10_1 == 16i128 as u8 { - let (pattern13_0, pattern13_1) = C::u8_pair_split(ctx, pattern9_1); - if pattern13_0 == 17i128 as u8 { - if pattern13_1 == 17i128 as u8 { - let (pattern16_0, pattern16_1) = - C::u16_pair_split(ctx, pattern8_1); - let (pattern17_0, pattern17_1) = - C::u8_pair_split(ctx, pattern16_0); - if pattern17_0 == 18i128 as u8 { - if pattern17_1 == 18i128 as u8 { - let (pattern20_0, pattern20_1) = - C::u8_pair_split(ctx, pattern16_1); - if pattern20_0 == 19i128 as u8 { - if pattern20_1 == 19i128 as u8 { - let (pattern23_0, pattern23_1) = - C::u32_pair_split(ctx, pattern7_1); - let (pattern24_0, pattern24_1) = - C::u16_pair_split(ctx, pattern23_0); - let (pattern25_0, pattern25_1) = - C::u8_pair_split(ctx, pattern24_0); - if pattern25_0 == 20i128 as u8 { - if pattern25_1 == 20i128 as u8 { - let (pattern28_0, pattern28_1) = - C::u8_pair_split(ctx, pattern24_1); - if pattern28_0 == 21i128 as u8 { - if pattern28_1 == 21i128 as u8 { - let (pattern31_0, pattern31_1) = - C::u16_pair_split( - ctx, - pattern23_1, - ); - let (pattern32_0, pattern32_1) = - C::u8_pair_split( - ctx, - pattern31_0, - ); - if pattern32_0 == 22i128 as u8 { - if pattern32_1 - == 22i128 as u8 - { - let ( - pattern35_0, - pattern35_1, - ) = C::u8_pair_split( - ctx, - pattern31_1, - ); - if pattern35_0 - == 23i128 as u8 - { - if pattern35_1 - == 23i128 as u8 - { - if pattern6_1 - == 65535i128 - as u16 - { - // Rule at src/isa/s390x/lower.isle line 2069. - let expr0_0: Type = I8X16; - let expr1_0 = C::put_in_reg(ctx, pattern4_1); - let expr2_0 = C::put_in_reg(ctx, pattern4_1); - let expr3_0 = constructor_vec_merge_high(ctx, expr0_0, expr1_0, expr2_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - } - } - } - } - } - } - } - } - } - } - } - } - } - } - } - if pattern10_1 == 17i128 as u8 { - let (pattern13_0, pattern13_1) = C::u8_pair_split(ctx, pattern9_1); - if pattern13_0 == 0i128 as u8 { - if pattern13_1 == 1i128 as u8 { - let (pattern16_0, pattern16_1) = - C::u16_pair_split(ctx, pattern8_1); - let (pattern17_0, pattern17_1) = - C::u8_pair_split(ctx, pattern16_0); - if pattern17_0 == 18i128 as u8 { - if pattern17_1 == 19i128 as u8 { - let (pattern20_0, pattern20_1) = - C::u8_pair_split(ctx, pattern16_1); - if pattern20_0 == 2i128 as u8 { - if pattern20_1 == 3i128 as u8 { - let (pattern23_0, pattern23_1) = - C::u32_pair_split(ctx, pattern7_1); - let (pattern24_0, pattern24_1) = - C::u16_pair_split(ctx, pattern23_0); - let (pattern25_0, pattern25_1) = - C::u8_pair_split(ctx, pattern24_0); - if pattern25_0 == 20i128 as u8 { - if pattern25_1 == 21i128 as u8 { - let (pattern28_0, pattern28_1) = - C::u8_pair_split(ctx, pattern24_1); - if pattern28_0 == 4i128 as u8 { - if pattern28_1 == 5i128 as u8 { - let (pattern31_0, pattern31_1) = - C::u16_pair_split( - ctx, - pattern23_1, - ); - let (pattern32_0, pattern32_1) = - C::u8_pair_split( - ctx, - pattern31_0, - ); - if pattern32_0 == 22i128 as u8 { - if pattern32_1 - == 23i128 as u8 - { - let ( - pattern35_0, - pattern35_1, - ) = C::u8_pair_split( - ctx, - pattern31_1, - ); - if pattern35_0 - == 6i128 as u8 - { - if pattern35_1 - == 7i128 as u8 - { - if pattern6_1 - == 65535i128 - as u16 - { - // Rule at src/isa/s390x/lower.isle line 2051. - let expr0_0: Type = I16X8; - let expr1_0 = C::put_in_reg(ctx, pattern4_1); - let expr2_0 = C::put_in_reg(ctx, pattern4_0); - let expr3_0 = constructor_vec_merge_high(ctx, expr0_0, expr1_0, expr2_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - } - } - } - } - } - } - } - } - } - } - } - } - } - } - if pattern13_0 == 16i128 as u8 { - if pattern13_1 == 17i128 as u8 { - let (pattern16_0, pattern16_1) = - C::u16_pair_split(ctx, pattern8_1); - let (pattern17_0, pattern17_1) = - C::u8_pair_split(ctx, pattern16_0); - if pattern17_0 == 18i128 as u8 { - if pattern17_1 == 19i128 as u8 { - let (pattern20_0, pattern20_1) = - C::u8_pair_split(ctx, pattern16_1); - if pattern20_0 == 18i128 as u8 { - if pattern20_1 == 19i128 as u8 { - let (pattern23_0, pattern23_1) = - C::u32_pair_split(ctx, pattern7_1); - let (pattern24_0, pattern24_1) = - C::u16_pair_split(ctx, pattern23_0); - let (pattern25_0, pattern25_1) = - C::u8_pair_split(ctx, pattern24_0); - if pattern25_0 == 20i128 as u8 { - if pattern25_1 == 21i128 as u8 { - let (pattern28_0, pattern28_1) = - C::u8_pair_split(ctx, pattern24_1); - if pattern28_0 == 20i128 as u8 { - if pattern28_1 == 21i128 as u8 { - let (pattern31_0, pattern31_1) = - C::u16_pair_split( - ctx, - pattern23_1, - ); - let (pattern32_0, pattern32_1) = - C::u8_pair_split( - ctx, - pattern31_0, - ); - if pattern32_0 == 22i128 as u8 { - if pattern32_1 - == 23i128 as u8 - { - let ( - pattern35_0, - pattern35_1, - ) = C::u8_pair_split( - ctx, - pattern31_1, - ); - if pattern35_0 - == 22i128 as u8 - { - if pattern35_1 - == 23i128 as u8 - { - if pattern6_1 - == 65535i128 - as u16 - { - // Rule at src/isa/s390x/lower.isle line 2067. - let expr0_0: Type = I16X8; - let expr1_0 = C::put_in_reg(ctx, pattern4_1); - let expr2_0 = C::put_in_reg(ctx, pattern4_1); - let expr3_0 = constructor_vec_merge_high(ctx, expr0_0, expr1_0, expr2_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - } - } - } - } - } - } - } - } - } - } - } - } - } - } - if pattern13_0 == 18i128 as u8 { - if pattern13_1 == 19i128 as u8 { - let (pattern16_0, pattern16_1) = - C::u16_pair_split(ctx, pattern8_1); - let (pattern17_0, pattern17_1) = - C::u8_pair_split(ctx, pattern16_0); - if pattern17_0 == 0i128 as u8 { - if pattern17_1 == 1i128 as u8 { - let (pattern20_0, pattern20_1) = - C::u8_pair_split(ctx, pattern16_1); - if pattern20_0 == 2i128 as u8 { - if pattern20_1 == 3i128 as u8 { - let (pattern23_0, pattern23_1) = - C::u32_pair_split(ctx, pattern7_1); - let (pattern24_0, pattern24_1) = - C::u16_pair_split(ctx, pattern23_0); - let (pattern25_0, pattern25_1) = - C::u8_pair_split(ctx, pattern24_0); - if pattern25_0 == 20i128 as u8 { - if pattern25_1 == 21i128 as u8 { - let (pattern28_0, pattern28_1) = - C::u8_pair_split(ctx, pattern24_1); - if pattern28_0 == 22i128 as u8 { - if pattern28_1 == 23i128 as u8 { - let (pattern31_0, pattern31_1) = - C::u16_pair_split( - ctx, - pattern23_1, - ); - let (pattern32_0, pattern32_1) = - C::u8_pair_split( - ctx, - pattern31_0, - ); - if pattern32_0 == 4i128 as u8 { - if pattern32_1 - == 5i128 as u8 - { - let ( - pattern35_0, - pattern35_1, - ) = C::u8_pair_split( - ctx, - pattern31_1, - ); - if pattern35_0 - == 6i128 as u8 - { - if pattern35_1 - == 7i128 as u8 - { - if pattern6_1 - == 65535i128 - as u16 - { - // Rule at src/isa/s390x/lower.isle line 2049. - let expr0_0: Type = I32X4; - let expr1_0 = C::put_in_reg(ctx, pattern4_1); - let expr2_0 = C::put_in_reg(ctx, pattern4_0); - let expr3_0 = constructor_vec_merge_high(ctx, expr0_0, expr1_0, expr2_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - } - } - } - } - } - } - } - } - } - } - } - } - if pattern17_0 == 16i128 as u8 { - if pattern17_1 == 17i128 as u8 { - let (pattern20_0, pattern20_1) = - C::u8_pair_split(ctx, pattern16_1); - if pattern20_0 == 18i128 as u8 { - if pattern20_1 == 19i128 as u8 { - let (pattern23_0, pattern23_1) = - C::u32_pair_split(ctx, pattern7_1); - let (pattern24_0, pattern24_1) = - C::u16_pair_split(ctx, pattern23_0); - let (pattern25_0, pattern25_1) = - C::u8_pair_split(ctx, pattern24_0); - if pattern25_0 == 20i128 as u8 { - if pattern25_1 == 21i128 as u8 { - let (pattern28_0, pattern28_1) = - C::u8_pair_split(ctx, pattern24_1); - if pattern28_0 == 22i128 as u8 { - if pattern28_1 == 23i128 as u8 { - let (pattern31_0, pattern31_1) = - C::u16_pair_split( - ctx, - pattern23_1, - ); - let (pattern32_0, pattern32_1) = - C::u8_pair_split( - ctx, - pattern31_0, - ); - if pattern32_0 == 20i128 as u8 { - if pattern32_1 - == 21i128 as u8 - { - let ( - pattern35_0, - pattern35_1, - ) = C::u8_pair_split( - ctx, - pattern31_1, - ); - if pattern35_0 - == 22i128 as u8 - { - if pattern35_1 - == 23i128 as u8 - { - if pattern6_1 - == 65535i128 - as u16 - { - // Rule at src/isa/s390x/lower.isle line 2065. - let expr0_0: Type = I32X4; - let expr1_0 = C::put_in_reg(ctx, pattern4_1); - let expr2_0 = C::put_in_reg(ctx, pattern4_1); - let expr3_0 = constructor_vec_merge_high(ctx, expr0_0, expr1_0, expr2_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - } - } - } - } - } - } - } - } - } - } - } - } - if pattern17_0 == 20i128 as u8 { - if pattern17_1 == 21i128 as u8 { - let (pattern20_0, pattern20_1) = - C::u8_pair_split(ctx, pattern16_1); - if pattern20_0 == 22i128 as u8 { - if pattern20_1 == 23i128 as u8 { - let (pattern23_0, pattern23_1) = - C::u32_pair_split(ctx, pattern7_1); - let (pattern24_0, pattern24_1) = - C::u16_pair_split(ctx, pattern23_0); - let (pattern25_0, pattern25_1) = - C::u8_pair_split(ctx, pattern24_0); - if pattern25_0 == 0i128 as u8 { - if pattern25_1 == 1i128 as u8 { - let (pattern28_0, pattern28_1) = - C::u8_pair_split(ctx, pattern24_1); - if pattern28_0 == 2i128 as u8 { - if pattern28_1 == 3i128 as u8 { - let (pattern31_0, pattern31_1) = - C::u16_pair_split( - ctx, - pattern23_1, - ); - let (pattern32_0, pattern32_1) = - C::u8_pair_split( - ctx, - pattern31_0, - ); - if pattern32_0 == 4i128 as u8 { - if pattern32_1 - == 5i128 as u8 - { - let ( - pattern35_0, - pattern35_1, - ) = C::u8_pair_split( - ctx, - pattern31_1, - ); - if pattern35_0 - == 6i128 as u8 - { - if pattern35_1 - == 7i128 as u8 - { - if pattern6_1 - == 65535i128 - as u16 - { - // Rule at src/isa/s390x/lower.isle line 2047. - let expr0_0: Type = I64X2; - let expr1_0 = C::put_in_reg(ctx, pattern4_1); - let expr2_0 = C::put_in_reg(ctx, pattern4_0); - let expr3_0 = constructor_vec_merge_high(ctx, expr0_0, expr1_0, expr2_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - } - } - } - } - } - } - } - } - if pattern25_0 == 8i128 as u8 { - if pattern25_1 == 9i128 as u8 { - let (pattern28_0, pattern28_1) = - C::u8_pair_split(ctx, pattern24_1); - if pattern28_0 == 10i128 as u8 { - if pattern28_1 == 11i128 as u8 { - let (pattern31_0, pattern31_1) = - C::u16_pair_split( - ctx, - pattern23_1, - ); - let (pattern32_0, pattern32_1) = - C::u8_pair_split( - ctx, - pattern31_0, - ); - if pattern32_0 == 12i128 as u8 { - if pattern32_1 - == 13i128 as u8 - { - let ( - pattern35_0, - pattern35_1, - ) = C::u8_pair_split( - ctx, - pattern31_1, - ); - if pattern35_0 - == 14i128 as u8 - { - if pattern35_1 - == 15i128 as u8 - { - if pattern6_1 - == 65535i128 - as u16 - { - // Rule at src/isa/s390x/lower.isle line 2165. - let expr0_0: Type = I8X16; - let expr1_0 = C::put_in_reg(ctx, pattern4_1); - let expr2_0: u8 = 0i128 as u8; - let expr3_0 = C::put_in_reg(ctx, pattern4_0); - let expr4_0: u8 = 1i128 as u8; - let expr5_0 = constructor_vec_permute_dw_imm(ctx, expr0_0, expr1_0, expr2_0, expr3_0, expr4_0); - let expr6_0 = constructor_output_reg(ctx, expr5_0); - return Some(expr6_0); - } - } - } - } - } - } - } - } - } - if pattern25_0 == 16i128 as u8 { - if pattern25_1 == 17i128 as u8 { - let (pattern28_0, pattern28_1) = - C::u8_pair_split(ctx, pattern24_1); - if pattern28_0 == 18i128 as u8 { - if pattern28_1 == 19i128 as u8 { - let (pattern31_0, pattern31_1) = - C::u16_pair_split( - ctx, - pattern23_1, - ); - let (pattern32_0, pattern32_1) = - C::u8_pair_split( - ctx, - pattern31_0, - ); - if pattern32_0 == 20i128 as u8 { - if pattern32_1 - == 21i128 as u8 - { - let ( - pattern35_0, - pattern35_1, - ) = C::u8_pair_split( - ctx, - pattern31_1, - ); - if pattern35_0 - == 22i128 as u8 - { - if pattern35_1 - == 23i128 as u8 - { - if pattern6_1 - == 65535i128 - as u16 - { - // Rule at src/isa/s390x/lower.isle line 2063. - let expr0_0: Type = I64X2; - let expr1_0 = C::put_in_reg(ctx, pattern4_1); - let expr2_0 = C::put_in_reg(ctx, pattern4_1); - let expr3_0 = constructor_vec_merge_high(ctx, expr0_0, expr1_0, expr2_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - } - } - } - } - } - } - } - } - if pattern25_0 == 24i128 as u8 { - if pattern25_1 == 25i128 as u8 { - let (pattern28_0, pattern28_1) = - C::u8_pair_split(ctx, pattern24_1); - if pattern28_0 == 26i128 as u8 { - if pattern28_1 == 27i128 as u8 { - let (pattern31_0, pattern31_1) = - C::u16_pair_split( - ctx, - pattern23_1, - ); - let (pattern32_0, pattern32_1) = - C::u8_pair_split( - ctx, - pattern31_0, - ); - if pattern32_0 == 28i128 as u8 { - if pattern32_1 - == 29i128 as u8 - { - let ( - pattern35_0, - pattern35_1, - ) = C::u8_pair_split( - ctx, - pattern31_1, - ); - if pattern35_0 - == 30i128 as u8 - { - if pattern35_1 - == 31i128 as u8 - { - if pattern6_1 - == 65535i128 - as u16 - { - // Rule at src/isa/s390x/lower.isle line 2173. - let expr0_0: Type = I8X16; - let expr1_0 = C::put_in_reg(ctx, pattern4_1); - let expr2_0: u8 = 0i128 as u8; - let expr3_0 = C::put_in_reg(ctx, pattern4_1); - let expr4_0: u8 = 1i128 as u8; - let expr5_0 = constructor_vec_permute_dw_imm(ctx, expr0_0, expr1_0, expr2_0, expr3_0, expr4_0); - let expr6_0 = constructor_output_reg(ctx, expr5_0); - return Some(expr6_0); - } - } - } - } - } - } - } - } - } - } - } - } - } - } - } - } - } - if pattern10_0 == 17i128 as u8 { - if pattern10_1 == 19i128 as u8 { - let (pattern13_0, pattern13_1) = C::u8_pair_split(ctx, pattern9_1); - if pattern13_0 == 21i128 as u8 { - if pattern13_1 == 23i128 as u8 { - let (pattern16_0, pattern16_1) = - C::u16_pair_split(ctx, pattern8_1); - let (pattern17_0, pattern17_1) = - C::u8_pair_split(ctx, pattern16_0); - if pattern17_0 == 25i128 as u8 { - if pattern17_1 == 27i128 as u8 { - let (pattern20_0, pattern20_1) = - C::u8_pair_split(ctx, pattern16_1); - if pattern20_0 == 29i128 as u8 { - if pattern20_1 == 31i128 as u8 { - let (pattern23_0, pattern23_1) = - C::u32_pair_split(ctx, pattern7_1); - let (pattern24_0, pattern24_1) = - C::u16_pair_split(ctx, pattern23_0); - let (pattern25_0, pattern25_1) = - C::u8_pair_split(ctx, pattern24_0); - if pattern25_0 == 1i128 as u8 { - if pattern25_1 == 3i128 as u8 { - let (pattern28_0, pattern28_1) = - C::u8_pair_split(ctx, pattern24_1); - if pattern28_0 == 5i128 as u8 { - if pattern28_1 == 7i128 as u8 { - let (pattern31_0, pattern31_1) = - C::u16_pair_split( - ctx, - pattern23_1, - ); - let (pattern32_0, pattern32_1) = - C::u8_pair_split( - ctx, - pattern31_0, - ); - if pattern32_0 == 9i128 as u8 { - if pattern32_1 - == 11i128 as u8 - { - let ( - pattern35_0, - pattern35_1, - ) = C::u8_pair_split( - ctx, - pattern31_1, - ); - if pattern35_0 - == 13i128 as u8 - { - if pattern35_1 - == 15i128 as u8 - { - if pattern6_1 - == 65535i128 - as u16 - { - // Rule at src/isa/s390x/lower.isle line 2117. - let expr0_0: Type = I16X8; - let expr1_0 = C::put_in_reg(ctx, pattern4_1); - let expr2_0 = C::put_in_reg(ctx, pattern4_0); - let expr3_0 = constructor_vec_pack(ctx, expr0_0, expr1_0, expr2_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - } - } - } - } - } - } - } - } - if pattern25_0 == 17i128 as u8 { - if pattern25_1 == 19i128 as u8 { - let (pattern28_0, pattern28_1) = - C::u8_pair_split(ctx, pattern24_1); - if pattern28_0 == 21i128 as u8 { - if pattern28_1 == 23i128 as u8 { - let (pattern31_0, pattern31_1) = - C::u16_pair_split( - ctx, - pattern23_1, - ); - let (pattern32_0, pattern32_1) = - C::u8_pair_split( - ctx, - pattern31_0, - ); - if pattern32_0 == 25i128 as u8 { - if pattern32_1 - == 27i128 as u8 - { - let ( - pattern35_0, - pattern35_1, - ) = C::u8_pair_split( - ctx, - pattern31_1, - ); - if pattern35_0 - == 29i128 as u8 - { - if pattern35_1 - == 31i128 as u8 - { - if pattern6_1 - == 65535i128 - as u16 - { - // Rule at src/isa/s390x/lower.isle line 2129. - let expr0_0: Type = I16X8; - let expr1_0 = C::put_in_reg(ctx, pattern4_1); - let expr2_0 = C::put_in_reg(ctx, pattern4_1); - let expr3_0 = constructor_vec_pack(ctx, expr0_0, expr1_0, expr2_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - } - } - } - } - } - } - } - } - } - } - } - } - } - } - } - } - if pattern10_0 == 18i128 as u8 { - if pattern10_1 == 19i128 as u8 { - let (pattern13_0, pattern13_1) = C::u8_pair_split(ctx, pattern9_1); - if pattern13_0 == 22i128 as u8 { - if pattern13_1 == 23i128 as u8 { - let (pattern16_0, pattern16_1) = - C::u16_pair_split(ctx, pattern8_1); - let (pattern17_0, pattern17_1) = - C::u8_pair_split(ctx, pattern16_0); - if pattern17_0 == 26i128 as u8 { - if pattern17_1 == 27i128 as u8 { - let (pattern20_0, pattern20_1) = - C::u8_pair_split(ctx, pattern16_1); - if pattern20_0 == 30i128 as u8 { - if pattern20_1 == 31i128 as u8 { - let (pattern23_0, pattern23_1) = - C::u32_pair_split(ctx, pattern7_1); - let (pattern24_0, pattern24_1) = - C::u16_pair_split(ctx, pattern23_0); - let (pattern25_0, pattern25_1) = - C::u8_pair_split(ctx, pattern24_0); - if pattern25_0 == 2i128 as u8 { - if pattern25_1 == 3i128 as u8 { - let (pattern28_0, pattern28_1) = - C::u8_pair_split(ctx, pattern24_1); - if pattern28_0 == 6i128 as u8 { - if pattern28_1 == 7i128 as u8 { - let (pattern31_0, pattern31_1) = - C::u16_pair_split( - ctx, - pattern23_1, - ); - let (pattern32_0, pattern32_1) = - C::u8_pair_split( - ctx, - pattern31_0, - ); - if pattern32_0 == 10i128 as u8 { - if pattern32_1 - == 11i128 as u8 - { - let ( - pattern35_0, - pattern35_1, - ) = C::u8_pair_split( - ctx, - pattern31_1, - ); - if pattern35_0 - == 14i128 as u8 - { - if pattern35_1 - == 15i128 as u8 - { - if pattern6_1 - == 65535i128 - as u16 - { - // Rule at src/isa/s390x/lower.isle line 2115. - let expr0_0: Type = I32X4; - let expr1_0 = C::put_in_reg(ctx, pattern4_1); - let expr2_0 = C::put_in_reg(ctx, pattern4_0); - let expr3_0 = constructor_vec_pack(ctx, expr0_0, expr1_0, expr2_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - } - } - } - } - } - } - } - } - if pattern25_0 == 18i128 as u8 { - if pattern25_1 == 19i128 as u8 { - let (pattern28_0, pattern28_1) = - C::u8_pair_split(ctx, pattern24_1); - if pattern28_0 == 22i128 as u8 { - if pattern28_1 == 23i128 as u8 { - let (pattern31_0, pattern31_1) = - C::u16_pair_split( - ctx, - pattern23_1, - ); - let (pattern32_0, pattern32_1) = - C::u8_pair_split( - ctx, - pattern31_0, - ); - if pattern32_0 == 26i128 as u8 { - if pattern32_1 - == 27i128 as u8 - { - let ( - pattern35_0, - pattern35_1, - ) = C::u8_pair_split( - ctx, - pattern31_1, - ); - if pattern35_0 - == 30i128 as u8 - { - if pattern35_1 - == 31i128 as u8 - { - if pattern6_1 - == 65535i128 - as u16 - { - // Rule at src/isa/s390x/lower.isle line 2127. - let expr0_0: Type = I32X4; - let expr1_0 = C::put_in_reg(ctx, pattern4_1); - let expr2_0 = C::put_in_reg(ctx, pattern4_1); - let expr3_0 = constructor_vec_pack(ctx, expr0_0, expr1_0, expr2_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - } - } - } - } - } - } - } - } - } - } - } - } - } - } - } - } - if pattern10_0 == 20i128 as u8 { - if pattern10_1 == 21i128 as u8 { - let (pattern13_0, pattern13_1) = C::u8_pair_split(ctx, pattern9_1); - if pattern13_0 == 22i128 as u8 { - if pattern13_1 == 23i128 as u8 { - let (pattern16_0, pattern16_1) = - C::u16_pair_split(ctx, pattern8_1); - let (pattern17_0, pattern17_1) = - C::u8_pair_split(ctx, pattern16_0); - if pattern17_0 == 28i128 as u8 { - if pattern17_1 == 29i128 as u8 { - let (pattern20_0, pattern20_1) = - C::u8_pair_split(ctx, pattern16_1); - if pattern20_0 == 30i128 as u8 { - if pattern20_1 == 31i128 as u8 { - let (pattern23_0, pattern23_1) = - C::u32_pair_split(ctx, pattern7_1); - let (pattern24_0, pattern24_1) = - C::u16_pair_split(ctx, pattern23_0); - let (pattern25_0, pattern25_1) = - C::u8_pair_split(ctx, pattern24_0); - if pattern25_0 == 4i128 as u8 { - if pattern25_1 == 5i128 as u8 { - let (pattern28_0, pattern28_1) = - C::u8_pair_split(ctx, pattern24_1); - if pattern28_0 == 6i128 as u8 { - if pattern28_1 == 7i128 as u8 { - let (pattern31_0, pattern31_1) = - C::u16_pair_split( - ctx, - pattern23_1, - ); - let (pattern32_0, pattern32_1) = - C::u8_pair_split( - ctx, - pattern31_0, - ); - if pattern32_0 == 12i128 as u8 { - if pattern32_1 - == 13i128 as u8 - { - let ( - pattern35_0, - pattern35_1, - ) = C::u8_pair_split( - ctx, - pattern31_1, - ); - if pattern35_0 - == 14i128 as u8 - { - if pattern35_1 - == 15i128 as u8 - { - if pattern6_1 - == 65535i128 - as u16 - { - // Rule at src/isa/s390x/lower.isle line 2113. - let expr0_0: Type = I64X2; - let expr1_0 = C::put_in_reg(ctx, pattern4_1); - let expr2_0 = C::put_in_reg(ctx, pattern4_0); - let expr3_0 = constructor_vec_pack(ctx, expr0_0, expr1_0, expr2_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - } - } - } - } - } - } - } - } - if pattern25_0 == 20i128 as u8 { - if pattern25_1 == 21i128 as u8 { - let (pattern28_0, pattern28_1) = - C::u8_pair_split(ctx, pattern24_1); - if pattern28_0 == 22i128 as u8 { - if pattern28_1 == 23i128 as u8 { - let (pattern31_0, pattern31_1) = - C::u16_pair_split( - ctx, - pattern23_1, - ); - let (pattern32_0, pattern32_1) = - C::u8_pair_split( - ctx, - pattern31_0, - ); - if pattern32_0 == 28i128 as u8 { - if pattern32_1 - == 29i128 as u8 - { - let ( - pattern35_0, - pattern35_1, - ) = C::u8_pair_split( - ctx, - pattern31_1, - ); - if pattern35_0 - == 30i128 as u8 - { - if pattern35_1 - == 31i128 as u8 - { - if pattern6_1 - == 65535i128 - as u16 - { - // Rule at src/isa/s390x/lower.isle line 2125. - let expr0_0: Type = I64X2; - let expr1_0 = C::put_in_reg(ctx, pattern4_1); - let expr2_0 = C::put_in_reg(ctx, pattern4_1); - let expr3_0 = constructor_vec_pack(ctx, expr0_0, expr1_0, expr2_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - } - } - } - } - } - } - } - } - } - } - } - } - } - } - } - } - if pattern10_0 == 24i128 as u8 { - if pattern10_1 == 8i128 as u8 { - let (pattern13_0, pattern13_1) = C::u8_pair_split(ctx, pattern9_1); - if pattern13_0 == 25i128 as u8 { - if pattern13_1 == 9i128 as u8 { - let (pattern16_0, pattern16_1) = - C::u16_pair_split(ctx, pattern8_1); - let (pattern17_0, pattern17_1) = - C::u8_pair_split(ctx, pattern16_0); - if pattern17_0 == 26i128 as u8 { - if pattern17_1 == 10i128 as u8 { - let (pattern20_0, pattern20_1) = - C::u8_pair_split(ctx, pattern16_1); - if pattern20_0 == 27i128 as u8 { - if pattern20_1 == 11i128 as u8 { - let (pattern23_0, pattern23_1) = - C::u32_pair_split(ctx, pattern7_1); - let (pattern24_0, pattern24_1) = - C::u16_pair_split(ctx, pattern23_0); - let (pattern25_0, pattern25_1) = - C::u8_pair_split(ctx, pattern24_0); - if pattern25_0 == 28i128 as u8 { - if pattern25_1 == 12i128 as u8 { - let (pattern28_0, pattern28_1) = - C::u8_pair_split(ctx, pattern24_1); - if pattern28_0 == 29i128 as u8 { - if pattern28_1 == 13i128 as u8 { - let (pattern31_0, pattern31_1) = - C::u16_pair_split( - ctx, - pattern23_1, - ); - let (pattern32_0, pattern32_1) = - C::u8_pair_split( - ctx, - pattern31_0, - ); - if pattern32_0 == 30i128 as u8 { - if pattern32_1 - == 14i128 as u8 - { - let ( - pattern35_0, - pattern35_1, - ) = C::u8_pair_split( - ctx, - pattern31_1, - ); - if pattern35_0 - == 31i128 as u8 - { - if pattern35_1 - == 15i128 as u8 - { - if pattern6_1 - == 65535i128 - as u16 - { - // Rule at src/isa/s390x/lower.isle line 2087. - let expr0_0: Type = I8X16; - let expr1_0 = C::put_in_reg(ctx, pattern4_1); - let expr2_0 = C::put_in_reg(ctx, pattern4_0); - let expr3_0 = constructor_vec_merge_low(ctx, expr0_0, expr1_0, expr2_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - } - } - } - } - } - } - } - } - } - } - } - } - } - } - } - if pattern10_1 == 24i128 as u8 { - let (pattern13_0, pattern13_1) = C::u8_pair_split(ctx, pattern9_1); - if pattern13_0 == 25i128 as u8 { - if pattern13_1 == 25i128 as u8 { - let (pattern16_0, pattern16_1) = - C::u16_pair_split(ctx, pattern8_1); - let (pattern17_0, pattern17_1) = - C::u8_pair_split(ctx, pattern16_0); - if pattern17_0 == 26i128 as u8 { - if pattern17_1 == 26i128 as u8 { - let (pattern20_0, pattern20_1) = - C::u8_pair_split(ctx, pattern16_1); - if pattern20_0 == 27i128 as u8 { - if pattern20_1 == 27i128 as u8 { - let (pattern23_0, pattern23_1) = - C::u32_pair_split(ctx, pattern7_1); - let (pattern24_0, pattern24_1) = - C::u16_pair_split(ctx, pattern23_0); - let (pattern25_0, pattern25_1) = - C::u8_pair_split(ctx, pattern24_0); - if pattern25_0 == 28i128 as u8 { - if pattern25_1 == 28i128 as u8 { - let (pattern28_0, pattern28_1) = - C::u8_pair_split(ctx, pattern24_1); - if pattern28_0 == 29i128 as u8 { - if pattern28_1 == 29i128 as u8 { - let (pattern31_0, pattern31_1) = - C::u16_pair_split( - ctx, - pattern23_1, - ); - let (pattern32_0, pattern32_1) = - C::u8_pair_split( - ctx, - pattern31_0, - ); - if pattern32_0 == 30i128 as u8 { - if pattern32_1 - == 30i128 as u8 - { - let ( - pattern35_0, - pattern35_1, - ) = C::u8_pair_split( - ctx, - pattern31_1, - ); - if pattern35_0 - == 31i128 as u8 - { - if pattern35_1 - == 31i128 as u8 - { - if pattern6_1 - == 65535i128 - as u16 - { - // Rule at src/isa/s390x/lower.isle line 2103. - let expr0_0: Type = I8X16; - let expr1_0 = C::put_in_reg(ctx, pattern4_1); - let expr2_0 = C::put_in_reg(ctx, pattern4_1); - let expr3_0 = constructor_vec_merge_low(ctx, expr0_0, expr1_0, expr2_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - } - } - } - } - } - } - } - } - } - } - } - } - } - } - } - if pattern10_1 == 25i128 as u8 { - let (pattern13_0, pattern13_1) = C::u8_pair_split(ctx, pattern9_1); - if pattern13_0 == 8i128 as u8 { - if pattern13_1 == 9i128 as u8 { - let (pattern16_0, pattern16_1) = - C::u16_pair_split(ctx, pattern8_1); - let (pattern17_0, pattern17_1) = - C::u8_pair_split(ctx, pattern16_0); - if pattern17_0 == 26i128 as u8 { - if pattern17_1 == 27i128 as u8 { - let (pattern20_0, pattern20_1) = - C::u8_pair_split(ctx, pattern16_1); - if pattern20_0 == 10i128 as u8 { - if pattern20_1 == 11i128 as u8 { - let (pattern23_0, pattern23_1) = - C::u32_pair_split(ctx, pattern7_1); - let (pattern24_0, pattern24_1) = - C::u16_pair_split(ctx, pattern23_0); - let (pattern25_0, pattern25_1) = - C::u8_pair_split(ctx, pattern24_0); - if pattern25_0 == 28i128 as u8 { - if pattern25_1 == 29i128 as u8 { - let (pattern28_0, pattern28_1) = - C::u8_pair_split(ctx, pattern24_1); - if pattern28_0 == 12i128 as u8 { - if pattern28_1 == 13i128 as u8 { - let (pattern31_0, pattern31_1) = - C::u16_pair_split( - ctx, - pattern23_1, - ); - let (pattern32_0, pattern32_1) = - C::u8_pair_split( - ctx, - pattern31_0, - ); - if pattern32_0 == 30i128 as u8 { - if pattern32_1 - == 31i128 as u8 - { - let ( - pattern35_0, - pattern35_1, - ) = C::u8_pair_split( - ctx, - pattern31_1, - ); - if pattern35_0 - == 14i128 as u8 - { - if pattern35_1 - == 15i128 as u8 - { - if pattern6_1 - == 65535i128 - as u16 - { - // Rule at src/isa/s390x/lower.isle line 2085. - let expr0_0: Type = I16X8; - let expr1_0 = C::put_in_reg(ctx, pattern4_1); - let expr2_0 = C::put_in_reg(ctx, pattern4_0); - let expr3_0 = constructor_vec_merge_low(ctx, expr0_0, expr1_0, expr2_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - } - } - } - } - } - } - } - } - } - } - } - } - } - } - if pattern13_0 == 24i128 as u8 { - if pattern13_1 == 25i128 as u8 { - let (pattern16_0, pattern16_1) = - C::u16_pair_split(ctx, pattern8_1); - let (pattern17_0, pattern17_1) = - C::u8_pair_split(ctx, pattern16_0); - if pattern17_0 == 26i128 as u8 { - if pattern17_1 == 27i128 as u8 { - let (pattern20_0, pattern20_1) = - C::u8_pair_split(ctx, pattern16_1); - if pattern20_0 == 26i128 as u8 { - if pattern20_1 == 27i128 as u8 { - let (pattern23_0, pattern23_1) = - C::u32_pair_split(ctx, pattern7_1); - let (pattern24_0, pattern24_1) = - C::u16_pair_split(ctx, pattern23_0); - let (pattern25_0, pattern25_1) = - C::u8_pair_split(ctx, pattern24_0); - if pattern25_0 == 28i128 as u8 { - if pattern25_1 == 29i128 as u8 { - let (pattern28_0, pattern28_1) = - C::u8_pair_split(ctx, pattern24_1); - if pattern28_0 == 28i128 as u8 { - if pattern28_1 == 29i128 as u8 { - let (pattern31_0, pattern31_1) = - C::u16_pair_split( - ctx, - pattern23_1, - ); - let (pattern32_0, pattern32_1) = - C::u8_pair_split( - ctx, - pattern31_0, - ); - if pattern32_0 == 30i128 as u8 { - if pattern32_1 - == 31i128 as u8 - { - let ( - pattern35_0, - pattern35_1, - ) = C::u8_pair_split( - ctx, - pattern31_1, - ); - if pattern35_0 - == 30i128 as u8 - { - if pattern35_1 - == 31i128 as u8 - { - if pattern6_1 - == 65535i128 - as u16 - { - // Rule at src/isa/s390x/lower.isle line 2101. - let expr0_0: Type = I16X8; - let expr1_0 = C::put_in_reg(ctx, pattern4_1); - let expr2_0 = C::put_in_reg(ctx, pattern4_1); - let expr3_0 = constructor_vec_merge_low(ctx, expr0_0, expr1_0, expr2_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - } - } - } - } - } - } - } - } - } - } - } - } - } - } - if pattern13_0 == 26i128 as u8 { - if pattern13_1 == 27i128 as u8 { - let (pattern16_0, pattern16_1) = - C::u16_pair_split(ctx, pattern8_1); - let (pattern17_0, pattern17_1) = - C::u8_pair_split(ctx, pattern16_0); - if pattern17_0 == 8i128 as u8 { - if pattern17_1 == 9i128 as u8 { - let (pattern20_0, pattern20_1) = - C::u8_pair_split(ctx, pattern16_1); - if pattern20_0 == 10i128 as u8 { - if pattern20_1 == 11i128 as u8 { - let (pattern23_0, pattern23_1) = - C::u32_pair_split(ctx, pattern7_1); - let (pattern24_0, pattern24_1) = - C::u16_pair_split(ctx, pattern23_0); - let (pattern25_0, pattern25_1) = - C::u8_pair_split(ctx, pattern24_0); - if pattern25_0 == 28i128 as u8 { - if pattern25_1 == 29i128 as u8 { - let (pattern28_0, pattern28_1) = - C::u8_pair_split(ctx, pattern24_1); - if pattern28_0 == 30i128 as u8 { - if pattern28_1 == 31i128 as u8 { - let (pattern31_0, pattern31_1) = - C::u16_pair_split( - ctx, - pattern23_1, - ); - let (pattern32_0, pattern32_1) = - C::u8_pair_split( - ctx, - pattern31_0, - ); - if pattern32_0 == 12i128 as u8 { - if pattern32_1 - == 13i128 as u8 - { - let ( - pattern35_0, - pattern35_1, - ) = C::u8_pair_split( - ctx, - pattern31_1, - ); - if pattern35_0 - == 14i128 as u8 - { - if pattern35_1 - == 15i128 as u8 - { - if pattern6_1 - == 65535i128 - as u16 - { - // Rule at src/isa/s390x/lower.isle line 2083. - let expr0_0: Type = I32X4; - let expr1_0 = C::put_in_reg(ctx, pattern4_1); - let expr2_0 = C::put_in_reg(ctx, pattern4_0); - let expr3_0 = constructor_vec_merge_low(ctx, expr0_0, expr1_0, expr2_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - } - } - } - } - } - } - } - } - } - } - } - } - if pattern17_0 == 24i128 as u8 { - if pattern17_1 == 25i128 as u8 { - let (pattern20_0, pattern20_1) = - C::u8_pair_split(ctx, pattern16_1); - if pattern20_0 == 26i128 as u8 { - if pattern20_1 == 27i128 as u8 { - let (pattern23_0, pattern23_1) = - C::u32_pair_split(ctx, pattern7_1); - let (pattern24_0, pattern24_1) = - C::u16_pair_split(ctx, pattern23_0); - let (pattern25_0, pattern25_1) = - C::u8_pair_split(ctx, pattern24_0); - if pattern25_0 == 28i128 as u8 { - if pattern25_1 == 29i128 as u8 { - let (pattern28_0, pattern28_1) = - C::u8_pair_split(ctx, pattern24_1); - if pattern28_0 == 30i128 as u8 { - if pattern28_1 == 31i128 as u8 { - let (pattern31_0, pattern31_1) = - C::u16_pair_split( - ctx, - pattern23_1, - ); - let (pattern32_0, pattern32_1) = - C::u8_pair_split( - ctx, - pattern31_0, - ); - if pattern32_0 == 28i128 as u8 { - if pattern32_1 - == 29i128 as u8 - { - let ( - pattern35_0, - pattern35_1, - ) = C::u8_pair_split( - ctx, - pattern31_1, - ); - if pattern35_0 - == 30i128 as u8 - { - if pattern35_1 - == 31i128 as u8 - { - if pattern6_1 - == 65535i128 - as u16 - { - // Rule at src/isa/s390x/lower.isle line 2099. - let expr0_0: Type = I32X4; - let expr1_0 = C::put_in_reg(ctx, pattern4_1); - let expr2_0 = C::put_in_reg(ctx, pattern4_1); - let expr3_0 = constructor_vec_merge_low(ctx, expr0_0, expr1_0, expr2_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - } - } - } - } - } - } - } - } - } - } - } - } - if pattern17_0 == 28i128 as u8 { - if pattern17_1 == 29i128 as u8 { - let (pattern20_0, pattern20_1) = - C::u8_pair_split(ctx, pattern16_1); - if pattern20_0 == 30i128 as u8 { - if pattern20_1 == 31i128 as u8 { - let (pattern23_0, pattern23_1) = - C::u32_pair_split(ctx, pattern7_1); - let (pattern24_0, pattern24_1) = - C::u16_pair_split(ctx, pattern23_0); - let (pattern25_0, pattern25_1) = - C::u8_pair_split(ctx, pattern24_0); - if pattern25_0 == 0i128 as u8 { - if pattern25_1 == 1i128 as u8 { - let (pattern28_0, pattern28_1) = - C::u8_pair_split(ctx, pattern24_1); - if pattern28_0 == 2i128 as u8 { - if pattern28_1 == 3i128 as u8 { - let (pattern31_0, pattern31_1) = - C::u16_pair_split( - ctx, - pattern23_1, - ); - let (pattern32_0, pattern32_1) = - C::u8_pair_split( - ctx, - pattern31_0, - ); - if pattern32_0 == 4i128 as u8 { - if pattern32_1 - == 5i128 as u8 - { - let ( - pattern35_0, - pattern35_1, - ) = C::u8_pair_split( - ctx, - pattern31_1, - ); - if pattern35_0 - == 6i128 as u8 - { - if pattern35_1 - == 7i128 as u8 - { - if pattern6_1 - == 65535i128 - as u16 - { - // Rule at src/isa/s390x/lower.isle line 2167. - let expr0_0: Type = I8X16; - let expr1_0 = C::put_in_reg(ctx, pattern4_1); - let expr2_0: u8 = 1i128 as u8; - let expr3_0 = C::put_in_reg(ctx, pattern4_0); - let expr4_0: u8 = 0i128 as u8; - let expr5_0 = constructor_vec_permute_dw_imm(ctx, expr0_0, expr1_0, expr2_0, expr3_0, expr4_0); - let expr6_0 = constructor_output_reg(ctx, expr5_0); - return Some(expr6_0); - } - } - } - } - } - } - } - } - } - if pattern25_0 == 8i128 as u8 { - if pattern25_1 == 9i128 as u8 { - let (pattern28_0, pattern28_1) = - C::u8_pair_split(ctx, pattern24_1); - if pattern28_0 == 10i128 as u8 { - if pattern28_1 == 11i128 as u8 { - let (pattern31_0, pattern31_1) = - C::u16_pair_split( - ctx, - pattern23_1, - ); - let (pattern32_0, pattern32_1) = - C::u8_pair_split( - ctx, - pattern31_0, - ); - if pattern32_0 == 12i128 as u8 { - if pattern32_1 - == 13i128 as u8 - { - let ( - pattern35_0, - pattern35_1, - ) = C::u8_pair_split( - ctx, - pattern31_1, - ); - if pattern35_0 - == 14i128 as u8 - { - if pattern35_1 - == 15i128 as u8 - { - if pattern6_1 - == 65535i128 - as u16 - { - // Rule at src/isa/s390x/lower.isle line 2081. - let expr0_0: Type = I64X2; - let expr1_0 = C::put_in_reg(ctx, pattern4_1); - let expr2_0 = C::put_in_reg(ctx, pattern4_0); - let expr3_0 = constructor_vec_merge_low(ctx, expr0_0, expr1_0, expr2_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - } - } - } - } - } - } - } - } - if pattern25_0 == 16i128 as u8 { - if pattern25_1 == 17i128 as u8 { - let (pattern28_0, pattern28_1) = - C::u8_pair_split(ctx, pattern24_1); - if pattern28_0 == 18i128 as u8 { - if pattern28_1 == 19i128 as u8 { - let (pattern31_0, pattern31_1) = - C::u16_pair_split( - ctx, - pattern23_1, - ); - let (pattern32_0, pattern32_1) = - C::u8_pair_split( - ctx, - pattern31_0, - ); - if pattern32_0 == 20i128 as u8 { - if pattern32_1 - == 21i128 as u8 - { - let ( - pattern35_0, - pattern35_1, - ) = C::u8_pair_split( - ctx, - pattern31_1, - ); - if pattern35_0 - == 22i128 as u8 - { - if pattern35_1 - == 23i128 as u8 - { - if pattern6_1 - == 65535i128 - as u16 - { - // Rule at src/isa/s390x/lower.isle line 2175. - let expr0_0: Type = I8X16; - let expr1_0 = C::put_in_reg(ctx, pattern4_1); - let expr2_0: u8 = 1i128 as u8; - let expr3_0 = C::put_in_reg(ctx, pattern4_1); - let expr4_0: u8 = 0i128 as u8; - let expr5_0 = constructor_vec_permute_dw_imm(ctx, expr0_0, expr1_0, expr2_0, expr3_0, expr4_0); - let expr6_0 = constructor_output_reg(ctx, expr5_0); - return Some(expr6_0); - } - } - } - } - } - } - } - } - } - if pattern25_0 == 24i128 as u8 { - if pattern25_1 == 25i128 as u8 { - let (pattern28_0, pattern28_1) = - C::u8_pair_split(ctx, pattern24_1); - if pattern28_0 == 26i128 as u8 { - if pattern28_1 == 27i128 as u8 { - let (pattern31_0, pattern31_1) = - C::u16_pair_split( - ctx, - pattern23_1, - ); - let (pattern32_0, pattern32_1) = - C::u8_pair_split( - ctx, - pattern31_0, - ); - if pattern32_0 == 28i128 as u8 { - if pattern32_1 - == 29i128 as u8 - { - let ( - pattern35_0, - pattern35_1, - ) = C::u8_pair_split( - ctx, - pattern31_1, - ); - if pattern35_0 - == 30i128 as u8 - { - if pattern35_1 - == 31i128 as u8 - { - if pattern6_1 - == 65535i128 - as u16 - { - // Rule at src/isa/s390x/lower.isle line 2097. - let expr0_0: Type = I64X2; - let expr1_0 = C::put_in_reg(ctx, pattern4_1); - let expr2_0 = C::put_in_reg(ctx, pattern4_1); - let expr3_0 = constructor_vec_merge_low(ctx, expr0_0, expr1_0, expr2_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - } - } - } - } - } - } - } - } - } - } - } - } - } - } - } - } - if pattern10_1 == 0i128 as u8 { - let (pattern12_0, pattern12_1) = C::u8_pair_split(ctx, pattern9_1); - if pattern12_1 == 1i128 as u8 { - let (pattern14_0, pattern14_1) = C::u16_pair_split(ctx, pattern8_1); - let (pattern15_0, pattern15_1) = C::u8_pair_split(ctx, pattern14_0); - if pattern15_1 == 2i128 as u8 { - let (pattern17_0, pattern17_1) = C::u8_pair_split(ctx, pattern14_1); - if pattern17_1 == 3i128 as u8 { - let (pattern19_0, pattern19_1) = - C::u32_pair_split(ctx, pattern7_1); - let (pattern20_0, pattern20_1) = - C::u16_pair_split(ctx, pattern19_0); - let (pattern21_0, pattern21_1) = - C::u8_pair_split(ctx, pattern20_0); - if pattern21_1 == 4i128 as u8 { - let (pattern23_0, pattern23_1) = - C::u8_pair_split(ctx, pattern20_1); - if pattern23_1 == 5i128 as u8 { - let (pattern25_0, pattern25_1) = - C::u16_pair_split(ctx, pattern19_1); - let (pattern26_0, pattern26_1) = - C::u8_pair_split(ctx, pattern25_0); - if pattern26_1 == 6i128 as u8 { - let (pattern28_0, pattern28_1) = - C::u8_pair_split(ctx, pattern25_1); - if pattern28_1 == 7i128 as u8 { - if pattern6_1 == 21845i128 as u16 { - // Rule at src/isa/s390x/lower.isle line 2137. - let expr0_0: Type = I8X16; - let expr1_0 = - C::put_in_reg(ctx, pattern4_0); - let expr2_0 = constructor_vec_unpacku_high( - ctx, expr0_0, expr1_0, - ); - let expr3_0 = - constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - } - } - } - } - } - } - } - } - if pattern10_1 == 8i128 as u8 { - let (pattern12_0, pattern12_1) = C::u8_pair_split(ctx, pattern9_1); - if pattern12_1 == 9i128 as u8 { - let (pattern14_0, pattern14_1) = C::u16_pair_split(ctx, pattern8_1); - let (pattern15_0, pattern15_1) = C::u8_pair_split(ctx, pattern14_0); - if pattern15_1 == 10i128 as u8 { - let (pattern17_0, pattern17_1) = C::u8_pair_split(ctx, pattern14_1); - if pattern17_1 == 11i128 as u8 { - let (pattern19_0, pattern19_1) = - C::u32_pair_split(ctx, pattern7_1); - let (pattern20_0, pattern20_1) = - C::u16_pair_split(ctx, pattern19_0); - let (pattern21_0, pattern21_1) = - C::u8_pair_split(ctx, pattern20_0); - if pattern21_1 == 12i128 as u8 { - let (pattern23_0, pattern23_1) = - C::u8_pair_split(ctx, pattern20_1); - if pattern23_1 == 13i128 as u8 { - let (pattern25_0, pattern25_1) = - C::u16_pair_split(ctx, pattern19_1); - let (pattern26_0, pattern26_1) = - C::u8_pair_split(ctx, pattern25_0); - if pattern26_1 == 14i128 as u8 { - let (pattern28_0, pattern28_1) = - C::u8_pair_split(ctx, pattern25_1); - if pattern28_1 == 15i128 as u8 { - if pattern6_1 == 21845i128 as u16 { - // Rule at src/isa/s390x/lower.isle line 2151. - let expr0_0: Type = I8X16; - let expr1_0 = - C::put_in_reg(ctx, pattern4_0); - let expr2_0 = constructor_vec_unpacku_low( - ctx, expr0_0, expr1_0, - ); - let expr3_0 = - constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - } - } - } - } - } - } - } - } - if pattern10_1 == 16i128 as u8 { - let (pattern12_0, pattern12_1) = C::u8_pair_split(ctx, pattern9_1); - if pattern12_1 == 17i128 as u8 { - let (pattern14_0, pattern14_1) = C::u16_pair_split(ctx, pattern8_1); - let (pattern15_0, pattern15_1) = C::u8_pair_split(ctx, pattern14_0); - if pattern15_1 == 18i128 as u8 { - let (pattern17_0, pattern17_1) = C::u8_pair_split(ctx, pattern14_1); - if pattern17_1 == 19i128 as u8 { - let (pattern19_0, pattern19_1) = - C::u32_pair_split(ctx, pattern7_1); - let (pattern20_0, pattern20_1) = - C::u16_pair_split(ctx, pattern19_0); - let (pattern21_0, pattern21_1) = - C::u8_pair_split(ctx, pattern20_0); - if pattern21_1 == 20i128 as u8 { - let (pattern23_0, pattern23_1) = - C::u8_pair_split(ctx, pattern20_1); - if pattern23_1 == 21i128 as u8 { - let (pattern25_0, pattern25_1) = - C::u16_pair_split(ctx, pattern19_1); - let (pattern26_0, pattern26_1) = - C::u8_pair_split(ctx, pattern25_0); - if pattern26_1 == 22i128 as u8 { - let (pattern28_0, pattern28_1) = - C::u8_pair_split(ctx, pattern25_1); - if pattern28_1 == 23i128 as u8 { - if pattern6_1 == 21845i128 as u16 { - // Rule at src/isa/s390x/lower.isle line 2143. - let expr0_0: Type = I8X16; - let expr1_0 = - C::put_in_reg(ctx, pattern4_1); - let expr2_0 = constructor_vec_unpacku_high( - ctx, expr0_0, expr1_0, - ); - let expr3_0 = - constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - } - } - } - } - } - } - } - } - if pattern10_1 == 24i128 as u8 { - let (pattern12_0, pattern12_1) = C::u8_pair_split(ctx, pattern9_1); - if pattern12_1 == 25i128 as u8 { - let (pattern14_0, pattern14_1) = C::u16_pair_split(ctx, pattern8_1); - let (pattern15_0, pattern15_1) = C::u8_pair_split(ctx, pattern14_0); - if pattern15_1 == 26i128 as u8 { - let (pattern17_0, pattern17_1) = C::u8_pair_split(ctx, pattern14_1); - if pattern17_1 == 27i128 as u8 { - let (pattern19_0, pattern19_1) = - C::u32_pair_split(ctx, pattern7_1); - let (pattern20_0, pattern20_1) = - C::u16_pair_split(ctx, pattern19_0); - let (pattern21_0, pattern21_1) = - C::u8_pair_split(ctx, pattern20_0); - if pattern21_1 == 28i128 as u8 { - let (pattern23_0, pattern23_1) = - C::u8_pair_split(ctx, pattern20_1); - if pattern23_1 == 29i128 as u8 { - let (pattern25_0, pattern25_1) = - C::u16_pair_split(ctx, pattern19_1); - let (pattern26_0, pattern26_1) = - C::u8_pair_split(ctx, pattern25_0); - if pattern26_1 == 30i128 as u8 { - let (pattern28_0, pattern28_1) = - C::u8_pair_split(ctx, pattern25_1); - if pattern28_1 == 31i128 as u8 { - if pattern6_1 == 21845i128 as u16 { - // Rule at src/isa/s390x/lower.isle line 2157. - let expr0_0: Type = I8X16; - let expr1_0 = - C::put_in_reg(ctx, pattern4_1); - let expr2_0 = constructor_vec_unpacku_low( - ctx, expr0_0, expr1_0, - ); - let expr3_0 = - constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - } - } - } - } - } - } - } - } - let (pattern11_0, pattern11_1) = C::u8_pair_split(ctx, pattern9_1); - if pattern11_0 == 0i128 as u8 { - if pattern11_1 == 1i128 as u8 { - let (pattern14_0, pattern14_1) = C::u16_pair_split(ctx, pattern8_1); - let (pattern15_0, pattern15_1) = C::u8_pair_split(ctx, pattern14_0); - let (pattern16_0, pattern16_1) = C::u8_pair_split(ctx, pattern14_1); - if pattern16_0 == 2i128 as u8 { - if pattern16_1 == 3i128 as u8 { - let (pattern19_0, pattern19_1) = - C::u32_pair_split(ctx, pattern7_1); - let (pattern20_0, pattern20_1) = - C::u16_pair_split(ctx, pattern19_0); - let (pattern21_0, pattern21_1) = - C::u8_pair_split(ctx, pattern20_0); - let (pattern22_0, pattern22_1) = - C::u8_pair_split(ctx, pattern20_1); - if pattern22_0 == 4i128 as u8 { - if pattern22_1 == 5i128 as u8 { - let (pattern25_0, pattern25_1) = - C::u16_pair_split(ctx, pattern19_1); - let (pattern26_0, pattern26_1) = - C::u8_pair_split(ctx, pattern25_0); - let (pattern27_0, pattern27_1) = - C::u8_pair_split(ctx, pattern25_1); - if pattern27_0 == 6i128 as u8 { - if pattern27_1 == 7i128 as u8 { - if pattern6_1 == 13107i128 as u16 { - // Rule at src/isa/s390x/lower.isle line 2135. - let expr0_0: Type = I16X8; - let expr1_0 = - C::put_in_reg(ctx, pattern4_0); - let expr2_0 = constructor_vec_unpacku_high( - ctx, expr0_0, expr1_0, - ); - let expr3_0 = - constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - } - } - } - } - } - } - } - } - if pattern11_0 == 8i128 as u8 { - if pattern11_1 == 9i128 as u8 { - let (pattern14_0, pattern14_1) = C::u16_pair_split(ctx, pattern8_1); - let (pattern15_0, pattern15_1) = C::u8_pair_split(ctx, pattern14_0); - let (pattern16_0, pattern16_1) = C::u8_pair_split(ctx, pattern14_1); - if pattern16_0 == 10i128 as u8 { - if pattern16_1 == 11i128 as u8 { - let (pattern19_0, pattern19_1) = - C::u32_pair_split(ctx, pattern7_1); - let (pattern20_0, pattern20_1) = - C::u16_pair_split(ctx, pattern19_0); - let (pattern21_0, pattern21_1) = - C::u8_pair_split(ctx, pattern20_0); - let (pattern22_0, pattern22_1) = - C::u8_pair_split(ctx, pattern20_1); - if pattern22_0 == 12i128 as u8 { - if pattern22_1 == 13i128 as u8 { - let (pattern25_0, pattern25_1) = - C::u16_pair_split(ctx, pattern19_1); - let (pattern26_0, pattern26_1) = - C::u8_pair_split(ctx, pattern25_0); - let (pattern27_0, pattern27_1) = - C::u8_pair_split(ctx, pattern25_1); - if pattern27_0 == 14i128 as u8 { - if pattern27_1 == 15i128 as u8 { - if pattern6_1 == 13107i128 as u16 { - // Rule at src/isa/s390x/lower.isle line 2149. - let expr0_0: Type = I16X8; - let expr1_0 = - C::put_in_reg(ctx, pattern4_0); - let expr2_0 = constructor_vec_unpacku_low( - ctx, expr0_0, expr1_0, - ); - let expr3_0 = - constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - } - } - } - } - } - } - } - } - if pattern11_0 == 16i128 as u8 { - if pattern11_1 == 17i128 as u8 { - let (pattern14_0, pattern14_1) = C::u16_pair_split(ctx, pattern8_1); - let (pattern15_0, pattern15_1) = C::u8_pair_split(ctx, pattern14_0); - let (pattern16_0, pattern16_1) = C::u8_pair_split(ctx, pattern14_1); - if pattern16_0 == 18i128 as u8 { - if pattern16_1 == 19i128 as u8 { - let (pattern19_0, pattern19_1) = - C::u32_pair_split(ctx, pattern7_1); - let (pattern20_0, pattern20_1) = - C::u16_pair_split(ctx, pattern19_0); - let (pattern21_0, pattern21_1) = - C::u8_pair_split(ctx, pattern20_0); - let (pattern22_0, pattern22_1) = - C::u8_pair_split(ctx, pattern20_1); - if pattern22_0 == 20i128 as u8 { - if pattern22_1 == 21i128 as u8 { - let (pattern25_0, pattern25_1) = - C::u16_pair_split(ctx, pattern19_1); - let (pattern26_0, pattern26_1) = - C::u8_pair_split(ctx, pattern25_0); - let (pattern27_0, pattern27_1) = - C::u8_pair_split(ctx, pattern25_1); - if pattern27_0 == 22i128 as u8 { - if pattern27_1 == 23i128 as u8 { - if pattern6_1 == 13107i128 as u16 { - // Rule at src/isa/s390x/lower.isle line 2141. - let expr0_0: Type = I16X8; - let expr1_0 = - C::put_in_reg(ctx, pattern4_1); - let expr2_0 = constructor_vec_unpacku_high( - ctx, expr0_0, expr1_0, - ); - let expr3_0 = - constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - } - } - } - } - } - } - } - } - if pattern11_0 == 24i128 as u8 { - if pattern11_1 == 25i128 as u8 { - let (pattern14_0, pattern14_1) = C::u16_pair_split(ctx, pattern8_1); - let (pattern15_0, pattern15_1) = C::u8_pair_split(ctx, pattern14_0); - let (pattern16_0, pattern16_1) = C::u8_pair_split(ctx, pattern14_1); - if pattern16_0 == 26i128 as u8 { - if pattern16_1 == 27i128 as u8 { - let (pattern19_0, pattern19_1) = - C::u32_pair_split(ctx, pattern7_1); - let (pattern20_0, pattern20_1) = - C::u16_pair_split(ctx, pattern19_0); - let (pattern21_0, pattern21_1) = - C::u8_pair_split(ctx, pattern20_0); - let (pattern22_0, pattern22_1) = - C::u8_pair_split(ctx, pattern20_1); - if pattern22_0 == 28i128 as u8 { - if pattern22_1 == 29i128 as u8 { - let (pattern25_0, pattern25_1) = - C::u16_pair_split(ctx, pattern19_1); - let (pattern26_0, pattern26_1) = - C::u8_pair_split(ctx, pattern25_0); - let (pattern27_0, pattern27_1) = - C::u8_pair_split(ctx, pattern25_1); - if pattern27_0 == 30i128 as u8 { - if pattern27_1 == 31i128 as u8 { - if pattern6_1 == 13107i128 as u16 { - // Rule at src/isa/s390x/lower.isle line 2155. - let expr0_0: Type = I16X8; - let expr1_0 = - C::put_in_reg(ctx, pattern4_1); - let expr2_0 = constructor_vec_unpacku_low( - ctx, expr0_0, expr1_0, - ); - let expr3_0 = - constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - } - } - } - } - } - } - } - } - let (pattern12_0, pattern12_1) = C::u16_pair_split(ctx, pattern8_1); - let (pattern13_0, pattern13_1) = C::u8_pair_split(ctx, pattern12_0); - if pattern13_0 == 0i128 as u8 { - if pattern13_1 == 1i128 as u8 { - let (pattern16_0, pattern16_1) = C::u8_pair_split(ctx, pattern12_1); - if pattern16_0 == 2i128 as u8 { - if pattern16_1 == 3i128 as u8 { - let (pattern19_0, pattern19_1) = - C::u32_pair_split(ctx, pattern7_1); - let (pattern20_0, pattern20_1) = - C::u16_pair_split(ctx, pattern19_0); - let (pattern21_0, pattern21_1) = - C::u8_pair_split(ctx, pattern20_0); - let (pattern22_0, pattern22_1) = - C::u8_pair_split(ctx, pattern20_1); - let (pattern23_0, pattern23_1) = - C::u16_pair_split(ctx, pattern19_1); - let (pattern24_0, pattern24_1) = - C::u8_pair_split(ctx, pattern23_0); - if pattern24_0 == 4i128 as u8 { - if pattern24_1 == 5i128 as u8 { - let (pattern27_0, pattern27_1) = - C::u8_pair_split(ctx, pattern23_1); - if pattern27_0 == 6i128 as u8 { - if pattern27_1 == 7i128 as u8 { - if pattern6_1 == 3855i128 as u16 { - // Rule at src/isa/s390x/lower.isle line 2133. - let expr0_0: Type = I32X4; - let expr1_0 = - C::put_in_reg(ctx, pattern4_0); - let expr2_0 = constructor_vec_unpacku_high( - ctx, expr0_0, expr1_0, - ); - let expr3_0 = - constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - } - } - } - } - } - } - } - } - if pattern13_0 == 8i128 as u8 { - if pattern13_1 == 9i128 as u8 { - let (pattern16_0, pattern16_1) = C::u8_pair_split(ctx, pattern12_1); - if pattern16_0 == 10i128 as u8 { - if pattern16_1 == 11i128 as u8 { - let (pattern19_0, pattern19_1) = - C::u32_pair_split(ctx, pattern7_1); - let (pattern20_0, pattern20_1) = - C::u16_pair_split(ctx, pattern19_0); - let (pattern21_0, pattern21_1) = - C::u8_pair_split(ctx, pattern20_0); - let (pattern22_0, pattern22_1) = - C::u8_pair_split(ctx, pattern20_1); - let (pattern23_0, pattern23_1) = - C::u16_pair_split(ctx, pattern19_1); - let (pattern24_0, pattern24_1) = - C::u8_pair_split(ctx, pattern23_0); - if pattern24_0 == 12i128 as u8 { - if pattern24_1 == 13i128 as u8 { - let (pattern27_0, pattern27_1) = - C::u8_pair_split(ctx, pattern23_1); - if pattern27_0 == 14i128 as u8 { - if pattern27_1 == 15i128 as u8 { - if pattern6_1 == 3855i128 as u16 { - // Rule at src/isa/s390x/lower.isle line 2147. - let expr0_0: Type = I32X4; - let expr1_0 = - C::put_in_reg(ctx, pattern4_0); - let expr2_0 = constructor_vec_unpacku_low( - ctx, expr0_0, expr1_0, - ); - let expr3_0 = - constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - } - } - } - } - } - } - } - } - if pattern13_0 == 16i128 as u8 { - if pattern13_1 == 17i128 as u8 { - let (pattern16_0, pattern16_1) = C::u8_pair_split(ctx, pattern12_1); - if pattern16_0 == 18i128 as u8 { - if pattern16_1 == 19i128 as u8 { - let (pattern19_0, pattern19_1) = - C::u32_pair_split(ctx, pattern7_1); - let (pattern20_0, pattern20_1) = - C::u16_pair_split(ctx, pattern19_0); - let (pattern21_0, pattern21_1) = - C::u8_pair_split(ctx, pattern20_0); - let (pattern22_0, pattern22_1) = - C::u8_pair_split(ctx, pattern20_1); - let (pattern23_0, pattern23_1) = - C::u16_pair_split(ctx, pattern19_1); - let (pattern24_0, pattern24_1) = - C::u8_pair_split(ctx, pattern23_0); - if pattern24_0 == 20i128 as u8 { - if pattern24_1 == 21i128 as u8 { - let (pattern27_0, pattern27_1) = - C::u8_pair_split(ctx, pattern23_1); - if pattern27_0 == 22i128 as u8 { - if pattern27_1 == 23i128 as u8 { - if pattern6_1 == 3855i128 as u16 { - // Rule at src/isa/s390x/lower.isle line 2139. - let expr0_0: Type = I32X4; - let expr1_0 = - C::put_in_reg(ctx, pattern4_1); - let expr2_0 = constructor_vec_unpacku_high( - ctx, expr0_0, expr1_0, - ); - let expr3_0 = - constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - } - } - } - } - } - } - } - } - if pattern13_0 == 24i128 as u8 { - if pattern13_1 == 25i128 as u8 { - let (pattern16_0, pattern16_1) = C::u8_pair_split(ctx, pattern12_1); - if pattern16_0 == 26i128 as u8 { - if pattern16_1 == 27i128 as u8 { - let (pattern19_0, pattern19_1) = - C::u32_pair_split(ctx, pattern7_1); - let (pattern20_0, pattern20_1) = - C::u16_pair_split(ctx, pattern19_0); - let (pattern21_0, pattern21_1) = - C::u8_pair_split(ctx, pattern20_0); - let (pattern22_0, pattern22_1) = - C::u8_pair_split(ctx, pattern20_1); - let (pattern23_0, pattern23_1) = - C::u16_pair_split(ctx, pattern19_1); - let (pattern24_0, pattern24_1) = - C::u8_pair_split(ctx, pattern23_0); - if pattern24_0 == 28i128 as u8 { - if pattern24_1 == 29i128 as u8 { - let (pattern27_0, pattern27_1) = - C::u8_pair_split(ctx, pattern23_1); - if pattern27_0 == 30i128 as u8 { - if pattern27_1 == 31i128 as u8 { - if pattern6_1 == 3855i128 as u16 { - // Rule at src/isa/s390x/lower.isle line 2153. - let expr0_0: Type = I32X4; - let expr1_0 = - C::put_in_reg(ctx, pattern4_1); - let expr2_0 = constructor_vec_unpacku_low( - ctx, expr0_0, expr1_0, - ); - let expr3_0 = - constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - } - } - } - } - } - } - } - } - } - } - } - &InstructionData::StoreNoOffset { - opcode: ref pattern2_0, - args: ref pattern2_1, - flags: pattern2_2, - } => { - if let &Opcode::AtomicStore = pattern2_0 { - let (pattern4_0, pattern4_1) = C::unpack_value_array_2(ctx, pattern2_1); - let pattern5_0 = C::value_type(ctx, pattern4_0); - if pattern5_0 == I8 { - // Rule at src/isa/s390x/lower.isle line 3218. - let expr0_0 = C::zero_offset(ctx); - let expr1_0 = - constructor_istore8_impl(ctx, pattern2_2, pattern4_0, pattern4_1, expr0_0); - let expr2_0 = constructor_atomic_store_impl(ctx, &expr1_0); - return Some(expr2_0); - } - if pattern5_0 == I16 { - // Rule at src/isa/s390x/lower.isle line 3222. - let expr0_0 = C::zero_offset(ctx); - let expr1_0 = - constructor_istore16_impl(ctx, pattern2_2, pattern4_0, pattern4_1, expr0_0); - let expr2_0 = constructor_atomic_store_impl(ctx, &expr1_0); - return Some(expr2_0); - } - if pattern5_0 == I32 { - // Rule at src/isa/s390x/lower.isle line 3226. - let expr0_0 = C::zero_offset(ctx); - let expr1_0 = - constructor_istore32_impl(ctx, pattern2_2, pattern4_0, pattern4_1, expr0_0); - let expr2_0 = constructor_atomic_store_impl(ctx, &expr1_0); - return Some(expr2_0); - } - if pattern5_0 == I64 { - // Rule at src/isa/s390x/lower.isle line 3230. - let expr0_0 = C::zero_offset(ctx); - let expr1_0 = - constructor_istore64_impl(ctx, pattern2_2, pattern4_0, pattern4_1, expr0_0); - let expr2_0 = constructor_atomic_store_impl(ctx, &expr1_0); - return Some(expr2_0); - } - } - } - &InstructionData::Store { - opcode: ref pattern2_0, - args: ref pattern2_1, - flags: pattern2_2, - offset: pattern2_3, - } => { - match pattern2_0 { - &Opcode::Store => { - let (pattern4_0, pattern4_1) = C::unpack_value_array_2(ctx, pattern2_1); - let pattern5_0 = C::value_type(ctx, pattern4_0); - if pattern5_0 == I8 { - // Rule at src/isa/s390x/lower.isle line 2612. - let expr0_0 = constructor_istore8_impl( - ctx, pattern2_2, pattern4_0, pattern4_1, pattern2_3, - ); - let expr1_0 = constructor_side_effect(ctx, &expr0_0); - return Some(expr1_0); - } - if pattern5_0 == I16 { - // Rule at src/isa/s390x/lower.isle line 2616. - let expr0_0 = constructor_istore16_impl( - ctx, pattern2_2, pattern4_0, pattern4_1, pattern2_3, - ); - let expr1_0 = constructor_side_effect(ctx, &expr0_0); - return Some(expr1_0); - } - if pattern5_0 == I32 { - // Rule at src/isa/s390x/lower.isle line 2620. - let expr0_0 = constructor_istore32_impl( - ctx, pattern2_2, pattern4_0, pattern4_1, pattern2_3, - ); - let expr1_0 = constructor_side_effect(ctx, &expr0_0); - return Some(expr1_0); - } - if pattern5_0 == I64 { - // Rule at src/isa/s390x/lower.isle line 2624. - let expr0_0 = constructor_istore64_impl( - ctx, pattern2_2, pattern4_0, pattern4_1, pattern2_3, - ); - let expr1_0 = constructor_side_effect(ctx, &expr0_0); - return Some(expr1_0); - } - if pattern5_0 == R64 { - // Rule at src/isa/s390x/lower.isle line 2628. - let expr0_0 = constructor_istore64_impl( - ctx, pattern2_2, pattern4_0, pattern4_1, pattern2_3, - ); - let expr1_0 = constructor_side_effect(ctx, &expr0_0); - return Some(expr1_0); - } - if pattern5_0 == F32 { - if let Some(()) = C::littleendian(ctx, pattern2_2) { - // Rule at src/isa/s390x/lower.isle line 2638. - let expr0_0: Type = F32X4; - let expr1_0 = C::put_in_reg(ctx, pattern4_0); - let expr2_0 = - constructor_lower_address(ctx, pattern2_2, pattern4_1, pattern2_3); - let expr3_0: u8 = 0i128 as u8; - let expr4_0 = constructor_vec_store_lane_little( - ctx, expr0_0, expr1_0, &expr2_0, expr3_0, - ); - let expr5_0 = constructor_side_effect(ctx, &expr4_0); - return Some(expr5_0); - } - } - if pattern5_0 == F64 { - if let Some(()) = C::littleendian(ctx, pattern2_2) { - // Rule at src/isa/s390x/lower.isle line 2650. - let expr0_0: Type = F64X2; - let expr1_0 = C::put_in_reg(ctx, pattern4_0); - let expr2_0 = - constructor_lower_address(ctx, pattern2_2, pattern4_1, pattern2_3); - let expr3_0: u8 = 0i128 as u8; - let expr4_0 = constructor_vec_store_lane_little( - ctx, expr0_0, expr1_0, &expr2_0, expr3_0, - ); - let expr5_0 = constructor_side_effect(ctx, &expr4_0); - return Some(expr5_0); - } - } - } - &Opcode::Istore8 => { - let (pattern4_0, pattern4_1) = C::unpack_value_array_2(ctx, pattern2_1); - // Rule at src/isa/s390x/lower.isle line 2768. - let expr0_0 = constructor_istore8_impl( - ctx, pattern2_2, pattern4_0, pattern4_1, pattern2_3, - ); - let expr1_0 = constructor_side_effect(ctx, &expr0_0); - return Some(expr1_0); - } - &Opcode::Istore16 => { - let (pattern4_0, pattern4_1) = C::unpack_value_array_2(ctx, pattern2_1); - // Rule at src/isa/s390x/lower.isle line 2786. - let expr0_0 = constructor_istore16_impl( - ctx, pattern2_2, pattern4_0, pattern4_1, pattern2_3, - ); - let expr1_0 = constructor_side_effect(ctx, &expr0_0); - return Some(expr1_0); - } - &Opcode::Istore32 => { - let (pattern4_0, pattern4_1) = C::unpack_value_array_2(ctx, pattern2_1); - // Rule at src/isa/s390x/lower.isle line 2812. - let expr0_0 = constructor_istore32_impl( - ctx, pattern2_2, pattern4_0, pattern4_1, pattern2_3, - ); - let expr1_0 = constructor_side_effect(ctx, &expr0_0); - return Some(expr1_0); - } - _ => {} - } - } - &InstructionData::TernaryImm8 { - opcode: ref pattern2_0, - args: ref pattern2_1, - imm: pattern2_2, - } => { - if let &Opcode::Insertlane = pattern2_0 { - let (pattern4_0, pattern4_1) = C::unpack_value_array_2(ctx, pattern2_1); - let pattern5_0 = C::value_type(ctx, pattern4_0); - let pattern6_0 = C::value_type(ctx, pattern4_1); - if let Some(pattern7_0) = C::ty_scalar_float(ctx, pattern6_0) { - let pattern8_0 = C::u8_from_uimm8(ctx, pattern2_2); - // Rule at src/isa/s390x/lower.isle line 1752. - let expr0_0 = C::put_in_reg(ctx, pattern4_0); - let expr1_0 = C::be_lane_idx(ctx, pattern5_0, pattern8_0); - let expr2_0 = C::put_in_reg(ctx, pattern4_1); - let expr3_0: u8 = 0i128 as u8; - let expr4_0 = constructor_vec_move_lane_and_insert( - ctx, pattern5_0, expr0_0, expr1_0, expr2_0, expr3_0, - ); - let expr5_0 = constructor_output_reg(ctx, expr4_0); - return Some(expr5_0); - } - } - } - _ => {} - } - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::first_result(ctx, pattern0_0) { - let pattern2_0 = C::value_type(ctx, pattern1_0); - if pattern2_0 == I16 { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Load { - opcode: ref pattern5_0, - arg: pattern5_1, - flags: pattern5_2, - offset: pattern5_3, - } = &pattern4_0 - { - if let &Opcode::Load = pattern5_0 { - if let Some(()) = C::littleendian(ctx, pattern5_2) { - // Rule at src/isa/s390x/lower.isle line 2282. - let expr0_0 = - constructor_lower_address(ctx, pattern5_2, pattern5_1, pattern5_3); - let expr1_0 = constructor_loadrev16(ctx, &expr0_0); - let expr2_0 = constructor_output_reg(ctx, expr1_0); - return Some(expr2_0); - } - } - } - } - if pattern2_0 == I32 { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Load { - opcode: ref pattern5_0, - arg: pattern5_1, - flags: pattern5_2, - offset: pattern5_3, - } = &pattern4_0 - { - if let &Opcode::Load = pattern5_0 { - if let Some(()) = C::littleendian(ctx, pattern5_2) { - // Rule at src/isa/s390x/lower.isle line 2290. - let expr0_0 = - constructor_lower_address(ctx, pattern5_2, pattern5_1, pattern5_3); - let expr1_0 = constructor_loadrev32(ctx, &expr0_0); - let expr2_0 = constructor_output_reg(ctx, expr1_0); - return Some(expr2_0); - } - } - } - } - if pattern2_0 == I64 { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Load { - opcode: ref pattern5_0, - arg: pattern5_1, - flags: pattern5_2, - offset: pattern5_3, - } = &pattern4_0 - { - if let &Opcode::Load = pattern5_0 { - if let Some(()) = C::littleendian(ctx, pattern5_2) { - // Rule at src/isa/s390x/lower.isle line 2298. - let expr0_0 = - constructor_lower_address(ctx, pattern5_2, pattern5_1, pattern5_3); - let expr1_0 = constructor_loadrev64(ctx, &expr0_0); - let expr2_0 = constructor_output_reg(ctx, expr1_0); - return Some(expr2_0); - } - } - } - } - if pattern2_0 == R64 { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Load { - opcode: ref pattern5_0, - arg: pattern5_1, - flags: pattern5_2, - offset: pattern5_3, - } = &pattern4_0 - { - if let &Opcode::Load = pattern5_0 { - if let Some(()) = C::littleendian(ctx, pattern5_2) { - // Rule at src/isa/s390x/lower.isle line 2306. - let expr0_0 = - constructor_lower_address(ctx, pattern5_2, pattern5_1, pattern5_3); - let expr1_0 = constructor_loadrev64(ctx, &expr0_0); - let expr2_0 = constructor_output_reg(ctx, expr1_0); - return Some(expr2_0); - } - } - } - } - if pattern2_0 == F32 { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Load { - opcode: ref pattern5_0, - arg: pattern5_1, - flags: pattern5_2, - offset: pattern5_3, - } = &pattern4_0 - { - if let &Opcode::Load = pattern5_0 { - if let Some(()) = C::littleendian(ctx, pattern5_2) { - // Rule at src/isa/s390x/lower.isle line 2314. - let expr0_0: Type = F32X4; - let expr1_0 = - constructor_lower_address(ctx, pattern5_2, pattern5_1, pattern5_3); - let expr2_0: u8 = 0i128 as u8; - let expr3_0 = - constructor_vec_load_lane_little_undef(ctx, expr0_0, &expr1_0, expr2_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - } - } - } - if pattern2_0 == F64 { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Load { - opcode: ref pattern5_0, - arg: pattern5_1, - flags: pattern5_2, - offset: pattern5_3, - } = &pattern4_0 - { - if let &Opcode::Load = pattern5_0 { - if let Some(()) = C::littleendian(ctx, pattern5_2) { - // Rule at src/isa/s390x/lower.isle line 2322. - let expr0_0: Type = F64X2; - let expr1_0 = - constructor_lower_address(ctx, pattern5_2, pattern5_1, pattern5_3); - let expr2_0: u8 = 0i128 as u8; - let expr3_0 = - constructor_vec_load_lane_little_undef(ctx, expr0_0, &expr1_0, expr2_0); - let expr4_0 = constructor_output_reg(ctx, expr3_0); - return Some(expr4_0); - } - } - } - } - if let Some(()) = C::mie2_enabled(ctx, pattern2_0) { - if let Some(pattern4_0) = C::fits_in_64(ctx, pattern2_0) { - let pattern5_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Unary { - opcode: ref pattern6_0, - arg: pattern6_1, - } = &pattern5_0 - { - if let &Opcode::Popcnt = pattern6_0 { - // Rule at src/isa/s390x/lower.isle line 1279. - let expr0_0 = constructor_put_in_reg_zext64(ctx, pattern6_1); - let expr1_0 = constructor_popcnt_reg(ctx, expr0_0); - let expr2_0 = constructor_output_reg(ctx, expr1_0); - return Some(expr2_0); - } - } - } - } - if let Some(pattern3_0) = C::fits_in_64(ctx, pattern2_0) { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - match &pattern4_0 { - &InstructionData::Unary { - opcode: ref pattern5_0, - arg: pattern5_1, - } => { - match pattern5_0 { - &Opcode::FcvtToUintSat => { - let pattern7_0 = C::value_type(ctx, pattern5_1); - // Rule at src/isa/s390x/lower.isle line 1618. - let expr0_0 = C::put_in_reg(ctx, pattern5_1); - let expr1_0 = constructor_fcvt_flt_ty(ctx, pattern3_0, pattern7_0); - let expr2_0 = constructor_fcvt_int_ty(ctx, pattern3_0, pattern7_0); - let expr3_0 = - constructor_fpromote_reg(ctx, expr1_0, pattern7_0, expr0_0); - let expr4_0 = FpuRoundMode::ToZero; - let expr5_0 = - constructor_fcvt_to_uint_reg(ctx, expr1_0, &expr4_0, expr3_0); - let expr6_0 = - constructor_uint_sat_reg(ctx, pattern3_0, expr2_0, expr5_0); - let expr7_0 = constructor_output_reg(ctx, expr6_0); - return Some(expr7_0); - } - &Opcode::FcvtToSintSat => { - let pattern7_0 = C::value_type(ctx, pattern5_1); - // Rule at src/isa/s390x/lower.isle line 1651. - let expr0_0 = C::put_in_reg(ctx, pattern5_1); - let expr1_0 = constructor_fcvt_flt_ty(ctx, pattern3_0, pattern7_0); - let expr2_0 = constructor_fcvt_int_ty(ctx, pattern3_0, pattern7_0); - let expr3_0 = - constructor_fpromote_reg(ctx, expr1_0, pattern7_0, expr0_0); - let expr4_0 = FpuRoundMode::ToZero; - let expr5_0 = - constructor_fcvt_to_sint_reg(ctx, expr1_0, &expr4_0, expr3_0); - let expr6_0 = constructor_fcmp_reg(ctx, pattern7_0, expr0_0, expr0_0); - let expr7_0 = FloatCC::Unordered; - let expr8_0 = C::floatcc_as_cond(ctx, &expr7_0); - let expr9_0: i16 = 0i128 as i16; - let expr10_0 = - constructor_cmov_imm(ctx, expr2_0, &expr8_0, expr9_0, expr5_0); - let expr11_0 = constructor_with_flags_reg(ctx, &expr6_0, &expr10_0); - let expr12_0 = - constructor_sint_sat_reg(ctx, pattern3_0, expr2_0, expr11_0); - let expr13_0 = constructor_output_reg(ctx, expr12_0); - return Some(expr13_0); - } - _ => {} - } - } - &InstructionData::Binary { - opcode: ref pattern5_0, - args: ref pattern5_1, - } => { - match pattern5_0 { - &Opcode::Band => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/s390x/lower.isle line 963. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = C::put_in_reg(ctx, pattern7_1); - let expr2_0 = constructor_and_reg(ctx, pattern3_0, expr0_0, expr1_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::Bor => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/s390x/lower.isle line 989. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = C::put_in_reg(ctx, pattern7_1); - let expr2_0 = constructor_or_reg(ctx, pattern3_0, expr0_0, expr1_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::Bxor => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/s390x/lower.isle line 1016. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = C::put_in_reg(ctx, pattern7_1); - let expr2_0 = constructor_xor_reg(ctx, pattern3_0, expr0_0, expr1_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - _ => {} - } - } - &InstructionData::FloatCompare { - opcode: ref pattern5_0, - args: ref pattern5_1, - cond: ref pattern5_2, - } => { - if let &Opcode::Fcmp = pattern5_0 { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/s390x/lower.isle line 3418. - let expr0_0 = constructor_fcmp_val(ctx, pattern5_2, pattern7_0, pattern7_1); - let expr1_0 = constructor_lower_bool(ctx, pattern3_0, &expr0_0); - let expr2_0 = constructor_output_reg(ctx, expr1_0); - return Some(expr2_0); - } - } - &InstructionData::IntCompare { - opcode: ref pattern5_0, - args: ref pattern5_1, - cond: ref pattern5_2, - } => { - if let &Opcode::Icmp = pattern5_0 { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/s390x/lower.isle line 3270. - let expr0_0: bool = true; - let expr1_0 = - constructor_icmp_val(ctx, expr0_0, pattern5_2, pattern7_0, pattern7_1); - let expr2_0 = constructor_lower_bool(ctx, pattern3_0, &expr1_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - } - _ => {} - } - } - if let Some(pattern3_0) = C::ty_32_or_64(ctx, pattern2_0) { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::AtomicRmw { - opcode: ref pattern5_0, - args: ref pattern5_1, - flags: pattern5_2, - op: ref pattern5_3, - } = &pattern4_0 - { - if let &Opcode::AtomicRmw = pattern5_0 { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/s390x/lower.isle line 2905. - let expr0_0 = C::put_in_reg(ctx, pattern7_1); - let expr1_0 = C::put_in_reg(ctx, pattern7_0); - let expr2_0 = C::inst_builder_new(ctx); - let expr3_0 = constructor_casloop_val_reg(ctx); - let expr4_0 = C::writable_reg_to_reg(ctx, expr3_0); - let expr5_0 = constructor_casloop_tmp_reg(ctx); - let expr6_0 = constructor_atomic_rmw_body( - ctx, &expr2_0, pattern3_0, pattern5_2, pattern5_3, expr5_0, expr4_0, - expr0_0, - ); - let expr7_0 = constructor_casloop( - ctx, &expr2_0, pattern3_0, pattern5_2, expr1_0, expr6_0, - ); - let expr8_0 = constructor_output_reg(ctx, expr7_0); - return Some(expr8_0); - } - } - } - if let Some(pattern3_0) = C::ty_8_or_16(ctx, pattern2_0) { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Binary { - opcode: ref pattern5_0, - args: ref pattern5_1, - } = &pattern4_0 - { - match pattern5_0 { - &Opcode::Umulhi => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/s390x/lower.isle line 354. - let expr0_0 = constructor_put_in_reg_zext32(ctx, pattern7_0); - let expr1_0 = constructor_put_in_reg_zext32(ctx, pattern7_1); - let expr2_0: Type = I32; - let expr3_0 = constructor_mul_reg(ctx, expr2_0, expr0_0, expr1_0); - let expr4_0: Type = I32; - let expr5_0 = C::ty_bits(ctx, pattern3_0); - let expr6_0 = constructor_lshr_imm(ctx, expr4_0, expr3_0, expr5_0); - let expr7_0 = constructor_output_reg(ctx, expr6_0); - return Some(expr7_0); - } - &Opcode::Smulhi => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/s390x/lower.isle line 392. - let expr0_0 = constructor_put_in_reg_sext32(ctx, pattern7_0); - let expr1_0 = constructor_put_in_reg_sext32(ctx, pattern7_1); - let expr2_0: Type = I32; - let expr3_0 = constructor_mul_reg(ctx, expr2_0, expr0_0, expr1_0); - let expr4_0: Type = I32; - let expr5_0 = C::ty_bits(ctx, pattern3_0); - let expr6_0 = constructor_ashr_imm(ctx, expr4_0, expr3_0, expr5_0); - let expr7_0 = constructor_output_reg(ctx, expr6_0); - return Some(expr7_0); - } - _ => {} - } - } - } - } - let pattern1_0 = C::inst_data(ctx, pattern0_0); - match &pattern1_0 { - &InstructionData::Shuffle { - opcode: ref pattern2_0, - args: ref pattern2_1, - imm: pattern2_2, - } => { - if let &Opcode::Shuffle = pattern2_0 { - let (pattern4_0, pattern4_1) = C::unpack_value_array_2(ctx, pattern2_1); - if let Some(pattern5_0) = C::u128_from_immediate(ctx, pattern2_2) { - let (pattern6_0, pattern6_1) = C::shuffle_mask_from_u128(ctx, pattern5_0); - if pattern6_1 == 65535i128 as u16 { - // Rule at src/isa/s390x/lower.isle line 2035. - let expr0_0: Type = I8X16; - let expr1_0 = C::put_in_reg(ctx, pattern4_0); - let expr2_0 = C::put_in_reg(ctx, pattern4_1); - let expr3_0: Type = I8X16; - let expr4_0 = constructor_vec_imm(ctx, expr3_0, pattern6_0); - let expr5_0 = - constructor_vec_permute(ctx, expr0_0, expr1_0, expr2_0, expr4_0); - let expr6_0 = constructor_output_reg(ctx, expr5_0); - return Some(expr6_0); - } - } - } - } - &InstructionData::Store { - opcode: ref pattern2_0, - args: ref pattern2_1, - flags: pattern2_2, - offset: pattern2_3, - } => { - if let &Opcode::Store = pattern2_0 { - let (pattern4_0, pattern4_1) = C::unpack_value_array_2(ctx, pattern2_1); - let pattern5_0 = C::value_type(ctx, pattern4_0); - if pattern5_0 == F32 { - if let Some(()) = C::bigendian(ctx, pattern2_2) { - // Rule at src/isa/s390x/lower.isle line 2632. - let expr0_0: Type = F32X4; - let expr1_0 = C::put_in_reg(ctx, pattern4_0); - let expr2_0 = - constructor_lower_address(ctx, pattern2_2, pattern4_1, pattern2_3); - let expr3_0: u8 = 0i128 as u8; - let expr4_0 = - constructor_vec_store_lane(ctx, expr0_0, expr1_0, &expr2_0, expr3_0); - let expr5_0 = constructor_side_effect(ctx, &expr4_0); - return Some(expr5_0); - } - } - if pattern5_0 == F64 { - if let Some(()) = C::bigendian(ctx, pattern2_2) { - // Rule at src/isa/s390x/lower.isle line 2644. - let expr0_0: Type = F64X2; - let expr1_0 = C::put_in_reg(ctx, pattern4_0); - let expr2_0 = - constructor_lower_address(ctx, pattern2_2, pattern4_1, pattern2_3); - let expr3_0: u8 = 0i128 as u8; - let expr4_0 = - constructor_vec_store_lane(ctx, expr0_0, expr1_0, &expr2_0, expr3_0); - let expr5_0 = constructor_side_effect(ctx, &expr4_0); - return Some(expr5_0); - } - } - } - } - _ => {} - } - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::first_result(ctx, pattern0_0) { - let pattern2_0 = C::value_type(ctx, pattern1_0); - if let Some(pattern3_0) = C::ty_8_or_16(ctx, pattern2_0) { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::AtomicRmw { - opcode: ref pattern5_0, - args: ref pattern5_1, - flags: pattern5_2, - op: ref pattern5_3, - } = &pattern4_0 - { - if let &Opcode::AtomicRmw = pattern5_0 { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/s390x/lower.isle line 2917. - let expr0_0 = C::put_in_reg(ctx, pattern7_1); - let expr1_0 = C::put_in_reg(ctx, pattern7_0); - let expr2_0 = constructor_casloop_bitshift(ctx, expr1_0); - let expr3_0 = constructor_casloop_aligned_addr(ctx, expr1_0); - let expr4_0 = C::inst_builder_new(ctx); - let expr5_0 = constructor_casloop_val_reg(ctx); - let expr6_0 = C::writable_reg_to_reg(ctx, expr5_0); - let expr7_0 = constructor_casloop_rotate_in( - ctx, &expr4_0, pattern3_0, pattern5_2, expr2_0, expr6_0, - ); - let expr8_0 = constructor_casloop_tmp_reg(ctx); - let expr9_0 = constructor_atomic_rmw_body( - ctx, &expr4_0, pattern3_0, pattern5_2, pattern5_3, expr8_0, expr7_0, - expr0_0, - ); - let expr10_0 = constructor_casloop_rotate_out( - ctx, &expr4_0, pattern3_0, pattern5_2, expr2_0, expr9_0, - ); - let expr11_0 = constructor_casloop_subword( - ctx, &expr4_0, pattern3_0, pattern5_2, expr3_0, expr2_0, expr10_0, - ); - let expr12_0 = constructor_output_reg(ctx, expr11_0); - return Some(expr12_0); - } - } - } - } - let pattern1_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Shuffle { - opcode: ref pattern2_0, - args: ref pattern2_1, - imm: pattern2_2, - } = &pattern1_0 - { - if let &Opcode::Shuffle = pattern2_0 { - let (pattern4_0, pattern4_1) = C::unpack_value_array_2(ctx, pattern2_1); - if let Some(pattern5_0) = C::u128_from_immediate(ctx, pattern2_2) { - let (pattern6_0, pattern6_1) = C::shuffle_mask_from_u128(ctx, pattern5_0); - // Rule at src/isa/s390x/lower.isle line 2030. - let expr0_0: Type = I8X16; - let expr1_0: Type = I8X16; - let expr2_0 = constructor_vec_imm_byte_mask(ctx, expr1_0, pattern6_1); - let expr3_0: Type = I8X16; - let expr4_0 = C::put_in_reg(ctx, pattern4_0); - let expr5_0 = C::put_in_reg(ctx, pattern4_1); - let expr6_0: Type = I8X16; - let expr7_0 = constructor_vec_imm(ctx, expr6_0, pattern6_0); - let expr8_0 = constructor_vec_permute(ctx, expr3_0, expr4_0, expr5_0, expr7_0); - let expr9_0 = constructor_vec_and(ctx, expr0_0, expr2_0, expr8_0); - let expr10_0 = constructor_output_reg(ctx, expr9_0); - return Some(expr10_0); - } - } - } - return None; -} - -// Generated as internal constructor for term lower_branch. -pub fn constructor_lower_branch( - ctx: &mut C, - arg0: Inst, - arg1: &VecMachLabel, -) -> Option { - let pattern0_0 = arg0; - let pattern1_0 = C::inst_data(ctx, pattern0_0); - match &pattern1_0 { - &InstructionData::BranchTable { - opcode: ref pattern2_0, - arg: pattern2_1, - destination: pattern2_2, - table: pattern2_3, - } => { - if let &Opcode::BrTable = pattern2_0 { - let pattern4_0 = arg1; - // Rule at src/isa/s390x/lower.isle line 3725. - let expr0_0 = constructor_put_in_reg_zext64(ctx, pattern2_1); - let expr1_0: Type = I64; - let expr2_0 = C::vec_length_minus1(ctx, pattern4_0); - let expr3_0 = constructor_icmpu_uimm32(ctx, expr1_0, expr0_0, expr2_0); - let expr4_0 = IntCC::UnsignedGreaterThanOrEqual; - let expr5_0 = C::intcc_as_cond(ctx, &expr4_0); - let expr6_0 = constructor_bool(ctx, &expr3_0, &expr5_0); - let expr7_0: u8 = 0i128 as u8; - let expr8_0 = C::vec_element(ctx, pattern4_0, expr7_0); - let expr9_0 = constructor_oneway_cond_br_bool(ctx, &expr6_0, expr8_0); - let expr10_0 = constructor_emit_side_effect(ctx, &expr9_0); - let expr11_0: Type = I64; - let expr12_0: u8 = 2i128 as u8; - let expr13_0 = constructor_lshl_imm(ctx, expr11_0, expr0_0, expr12_0); - let expr14_0 = constructor_jt_sequence(ctx, expr13_0, pattern4_0); - let expr15_0 = constructor_emit_side_effect(ctx, &expr14_0); - return Some(expr15_0); - } - } - &InstructionData::Branch { - opcode: ref pattern2_0, - args: pattern2_1, - destination: pattern2_2, - } => { - match pattern2_0 { - &Opcode::Brz => { - let pattern4_0 = C::value_list_slice(ctx, pattern2_1); - if let Some((pattern5_0, pattern5_1)) = C::value_slice_unwrap(ctx, pattern4_0) { - let pattern6_0 = arg1; - // Rule at src/isa/s390x/lower.isle line 3758. - let expr0_0 = constructor_value_nonzero(ctx, pattern5_0); - let expr1_0 = constructor_invert_bool(ctx, &expr0_0); - let expr2_0: u8 = 0i128 as u8; - let expr3_0 = C::vec_element(ctx, pattern6_0, expr2_0); - let expr4_0: u8 = 1i128 as u8; - let expr5_0 = C::vec_element(ctx, pattern6_0, expr4_0); - let expr6_0 = constructor_cond_br_bool(ctx, &expr1_0, expr3_0, expr5_0); - let expr7_0 = constructor_emit_side_effect(ctx, &expr6_0); - return Some(expr7_0); - } - } - &Opcode::Brnz => { - let pattern4_0 = C::value_list_slice(ctx, pattern2_1); - if let Some((pattern5_0, pattern5_1)) = C::value_slice_unwrap(ctx, pattern4_0) { - let pattern6_0 = arg1; - // Rule at src/isa/s390x/lower.isle line 3769. - let expr0_0 = constructor_value_nonzero(ctx, pattern5_0); - let expr1_0: u8 = 0i128 as u8; - let expr2_0 = C::vec_element(ctx, pattern6_0, expr1_0); - let expr3_0: u8 = 1i128 as u8; - let expr4_0 = C::vec_element(ctx, pattern6_0, expr3_0); - let expr5_0 = constructor_cond_br_bool(ctx, &expr0_0, expr2_0, expr4_0); - let expr6_0 = constructor_emit_side_effect(ctx, &expr5_0); - return Some(expr6_0); - } - } - _ => {} - } - } - &InstructionData::Jump { - opcode: ref pattern2_0, - args: pattern2_1, - destination: pattern2_2, - } => { - if let &Opcode::Jump = pattern2_0 { - let pattern4_0 = C::value_list_slice(ctx, pattern2_1); - let pattern5_0 = arg1; - // Rule at src/isa/s390x/lower.isle line 3717. - let expr0_0: u8 = 0i128 as u8; - let expr1_0 = C::vec_element(ctx, pattern5_0, expr0_0); - let expr2_0 = constructor_jump_impl(ctx, expr1_0); - let expr3_0 = constructor_emit_side_effect(ctx, &expr2_0); - return Some(expr3_0); - } - } - _ => {} - } - return None; -} - -// Generated as internal constructor for term vec_mul_impl. -pub fn constructor_vec_mul_impl(ctx: &mut C, arg0: Type, arg1: Reg, arg2: Reg) -> Reg { - let pattern0_0 = arg0; - if pattern0_0 == I128 { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - // Rule at src/isa/s390x/lower.isle line 337. - let expr0_0: Type = I64X2; - let expr1_0: u8 = 0i128 as u8; - let expr2_0 = C::zero_reg(ctx); - let expr3_0 = constructor_vec_extract_lane(ctx, expr0_0, pattern2_0, expr1_0, expr2_0); - let expr4_0: Type = I64X2; - let expr5_0: u8 = 1i128 as u8; - let expr6_0 = C::zero_reg(ctx); - let expr7_0 = constructor_vec_extract_lane(ctx, expr4_0, pattern2_0, expr5_0, expr6_0); - let expr8_0: Type = I64X2; - let expr9_0: u8 = 0i128 as u8; - let expr10_0 = C::zero_reg(ctx); - let expr11_0 = constructor_vec_extract_lane(ctx, expr8_0, pattern3_0, expr9_0, expr10_0); - let expr12_0: Type = I64X2; - let expr13_0: u8 = 1i128 as u8; - let expr14_0 = C::zero_reg(ctx); - let expr15_0 = constructor_vec_extract_lane(ctx, expr12_0, pattern3_0, expr13_0, expr14_0); - let expr16_0 = constructor_umul_wide(ctx, expr7_0, expr15_0); - let expr17_0: Type = I64; - let expr18_0 = C::regpair_lo(ctx, expr16_0); - let expr19_0 = constructor_copy_reg(ctx, expr17_0, expr18_0); - let expr20_0: Type = I64; - let expr21_0 = C::regpair_hi(ctx, expr16_0); - let expr22_0 = constructor_copy_reg(ctx, expr20_0, expr21_0); - let expr23_0: Type = I64; - let expr24_0 = constructor_mul_reg(ctx, expr23_0, expr7_0, expr11_0); - let expr25_0: Type = I64; - let expr26_0 = constructor_mul_reg(ctx, expr25_0, expr3_0, expr15_0); - let expr27_0: Type = I64; - let expr28_0: Type = I64; - let expr29_0 = constructor_add_reg(ctx, expr28_0, expr24_0, expr22_0); - let expr30_0 = constructor_add_reg(ctx, expr27_0, expr26_0, expr29_0); - let expr31_0: Type = I64X2; - let expr32_0 = constructor_mov_to_vec128(ctx, expr31_0, expr30_0, expr19_0); - return expr32_0; - } - if pattern0_0 == I8X16 { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - // Rule at src/isa/s390x/lower.isle line 324. - let expr0_0: Type = I8X16; - let expr1_0 = constructor_vec_mul(ctx, expr0_0, pattern2_0, pattern3_0); - return expr1_0; - } - if pattern0_0 == I16X8 { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - // Rule at src/isa/s390x/lower.isle line 325. - let expr0_0: Type = I16X8; - let expr1_0 = constructor_vec_mul(ctx, expr0_0, pattern2_0, pattern3_0); - return expr1_0; - } - if pattern0_0 == I32X4 { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - // Rule at src/isa/s390x/lower.isle line 326. - let expr0_0: Type = I32X4; - let expr1_0 = constructor_vec_mul(ctx, expr0_0, pattern2_0, pattern3_0); - return expr1_0; - } - if pattern0_0 == I64X2 { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - // Rule at src/isa/s390x/lower.isle line 329. - let expr0_0: Type = I64X2; - let expr1_0: Type = I64; - let expr2_0: Type = I64X2; - let expr3_0: u8 = 0i128 as u8; - let expr4_0 = C::zero_reg(ctx); - let expr5_0 = constructor_vec_extract_lane(ctx, expr2_0, pattern2_0, expr3_0, expr4_0); - let expr6_0: Type = I64X2; - let expr7_0: u8 = 0i128 as u8; - let expr8_0 = C::zero_reg(ctx); - let expr9_0 = constructor_vec_extract_lane(ctx, expr6_0, pattern3_0, expr7_0, expr8_0); - let expr10_0 = constructor_mul_reg(ctx, expr1_0, expr5_0, expr9_0); - let expr11_0: Type = I64; - let expr12_0: Type = I64X2; - let expr13_0: u8 = 1i128 as u8; - let expr14_0 = C::zero_reg(ctx); - let expr15_0 = constructor_vec_extract_lane(ctx, expr12_0, pattern2_0, expr13_0, expr14_0); - let expr16_0: Type = I64X2; - let expr17_0: u8 = 1i128 as u8; - let expr18_0 = C::zero_reg(ctx); - let expr19_0 = constructor_vec_extract_lane(ctx, expr16_0, pattern3_0, expr17_0, expr18_0); - let expr20_0 = constructor_mul_reg(ctx, expr11_0, expr15_0, expr19_0); - let expr21_0 = constructor_mov_to_vec128(ctx, expr0_0, expr10_0, expr20_0); - return expr21_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "vec_mul_impl", "src/isa/s390x/lower.isle line 319" - ); -} - -// Generated as internal constructor for term sqmul_impl. -pub fn constructor_sqmul_impl(ctx: &mut C, arg0: Type, arg1: Reg, arg2: Reg) -> Reg { - let pattern0_0 = arg0; - if pattern0_0 == I32X4 { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - // Rule at src/isa/s390x/lower.isle line 450. - let expr0_0: Type = I32X4; - let expr1_0: Type = I32X4; - let expr2_0: Type = I32X4; - let expr3_0 = constructor_vec_mul_impl(ctx, expr2_0, pattern2_0, pattern3_0); - let expr4_0: Type = I32X4; - let expr5_0: u8 = 17i128 as u8; - let expr6_0: u8 = 17i128 as u8; - let expr7_0 = constructor_vec_imm_bit_mask(ctx, expr4_0, expr5_0, expr6_0); - let expr8_0 = constructor_vec_add(ctx, expr1_0, expr3_0, expr7_0); - let expr9_0: u8 = 15i128 as u8; - let expr10_0 = constructor_vec_ashr_imm(ctx, expr0_0, expr8_0, expr9_0); - return expr10_0; - } - if pattern0_0 == I64X2 { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - // Rule at src/isa/s390x/lower.isle line 454. - let expr0_0: Type = I64X2; - let expr1_0: Type = I64X2; - let expr2_0: Type = I64X2; - let expr3_0 = constructor_vec_mul_impl(ctx, expr2_0, pattern2_0, pattern3_0); - let expr4_0: Type = I64X2; - let expr5_0: u8 = 33i128 as u8; - let expr6_0: u8 = 33i128 as u8; - let expr7_0 = constructor_vec_imm_bit_mask(ctx, expr4_0, expr5_0, expr6_0); - let expr8_0 = constructor_vec_add(ctx, expr1_0, expr3_0, expr7_0); - let expr9_0: u8 = 31i128 as u8; - let expr10_0 = constructor_vec_ashr_imm(ctx, expr0_0, expr8_0, expr9_0); - return expr10_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "sqmul_impl", "src/isa/s390x/lower.isle line 449" - ); -} - -// Generated as internal constructor for term zero_divisor_check_needed. -pub fn constructor_zero_divisor_check_needed(ctx: &mut C, arg0: Value) -> bool { - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::i64_from_value(ctx, pattern0_0) { - let mut closure2 = || { - let expr0_0 = constructor_i64_nonzero(ctx, pattern1_0)?; - return Some(expr0_0); - }; - if let Some(pattern2_0) = closure2() { - // Rule at src/isa/s390x/lower.isle line 518. - let expr0_0: bool = false; - return expr0_0; - } - } - let pattern0_0 = arg0; - let pattern1_0 = C::value_type(ctx, pattern0_0); - if let Some(()) = C::allow_div_traps(ctx, pattern1_0) { - // Rule at src/isa/s390x/lower.isle line 521. - let expr0_0: bool = false; - return expr0_0; - } - let pattern0_0 = arg0; - // Rule at src/isa/s390x/lower.isle line 522. - let expr0_0: bool = true; - return expr0_0; -} - -// Generated as internal constructor for term maybe_trap_if_zero_divisor. -pub fn constructor_maybe_trap_if_zero_divisor( - ctx: &mut C, - arg0: bool, - arg1: Type, - arg2: Reg, -) -> Reg { - let pattern0_0 = arg0; - if pattern0_0 == true { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - // Rule at src/isa/s390x/lower.isle line 528. - let expr0_0: i16 = 0i128 as i16; - let expr1_0 = IntCC::Equal; - let expr2_0 = C::intcc_as_cond(ctx, &expr1_0); - let expr3_0 = C::trap_code_division_by_zero(ctx); - let expr4_0 = constructor_icmps_simm16_and_trap( - ctx, pattern2_0, pattern3_0, expr0_0, &expr2_0, &expr3_0, - ); - return expr4_0; - } - if pattern0_0 == false { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - // Rule at src/isa/s390x/lower.isle line 527. - let expr0_0 = C::invalid_reg(ctx); - return expr0_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "maybe_trap_if_zero_divisor", "src/isa/s390x/lower.isle line 526" - ); -} - -// Generated as internal constructor for term div_overflow_check_needed. -pub fn constructor_div_overflow_check_needed(ctx: &mut C, arg0: Value) -> bool { - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::i64_from_value(ctx, pattern0_0) { - let mut closure2 = || { - let expr0_0 = constructor_i64_not_neg1(ctx, pattern1_0)?; - return Some(expr0_0); - }; - if let Some(pattern2_0) = closure2() { - // Rule at src/isa/s390x/lower.isle line 600. - let expr0_0: bool = false; - return expr0_0; - } - } - let pattern0_0 = arg0; - // Rule at src/isa/s390x/lower.isle line 603. - let expr0_0: bool = true; - return expr0_0; -} - -// Generated as internal constructor for term maybe_trap_if_sdiv_overflow. -pub fn constructor_maybe_trap_if_sdiv_overflow( - ctx: &mut C, - arg0: bool, - arg1: Type, - arg2: Type, - arg3: Reg, - arg4: Reg, -) -> Reg { - let pattern0_0 = arg0; - if pattern0_0 == true { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - let pattern4_0 = arg3; - let pattern5_0 = arg4; - // Rule at src/isa/s390x/lower.isle line 616. - let expr0_0 = constructor_int_max(ctx, pattern3_0); - let expr1_0 = constructor_imm(ctx, pattern2_0, expr0_0); - let expr2_0 = constructor_xor_reg(ctx, pattern2_0, expr1_0, pattern4_0); - let expr3_0 = constructor_and_reg(ctx, pattern2_0, expr2_0, pattern5_0); - let expr4_0: i16 = -1i128 as i16; - let expr5_0 = IntCC::Equal; - let expr6_0 = C::intcc_as_cond(ctx, &expr5_0); - let expr7_0 = C::trap_code_integer_overflow(ctx); - let expr8_0 = constructor_icmps_simm16_and_trap( - ctx, pattern2_0, expr3_0, expr4_0, &expr6_0, &expr7_0, - ); - return expr8_0; - } - if pattern0_0 == false { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - let pattern4_0 = arg3; - let pattern5_0 = arg4; - // Rule at src/isa/s390x/lower.isle line 615. - let expr0_0 = C::invalid_reg(ctx); - return expr0_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "maybe_trap_if_sdiv_overflow", "src/isa/s390x/lower.isle line 614" - ); -} - -// Generated as internal constructor for term int_max. -pub fn constructor_int_max(ctx: &mut C, arg0: Type) -> u64 { - let pattern0_0 = arg0; - if pattern0_0 == I8 { - // Rule at src/isa/s390x/lower.isle line 623. - let expr0_0: u64 = 127i128 as u64; - return expr0_0; - } - if pattern0_0 == I16 { - // Rule at src/isa/s390x/lower.isle line 624. - let expr0_0: u64 = 32767i128 as u64; - return expr0_0; - } - if pattern0_0 == I32 { - // Rule at src/isa/s390x/lower.isle line 625. - let expr0_0: u64 = 2147483647i128 as u64; - return expr0_0; - } - if pattern0_0 == I64 { - // Rule at src/isa/s390x/lower.isle line 626. - let expr0_0: u64 = 9223372036854775807i128 as u64; - return expr0_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "int_max", "src/isa/s390x/lower.isle line 622" - ); -} - -// Generated as internal constructor for term maybe_avoid_srem_overflow. -pub fn constructor_maybe_avoid_srem_overflow( - ctx: &mut C, - arg0: bool, - arg1: Type, - arg2: Reg, - arg3: Reg, -) -> Reg { - let pattern0_0 = arg0; - if pattern0_0 == true { - let pattern2_0 = arg1; - if pattern2_0 == I32 { - let pattern4_0 = arg2; - let pattern5_0 = arg3; - // Rule at src/isa/s390x/lower.isle line 644. - return pattern4_0; - } - if pattern2_0 == I64 { - let pattern4_0 = arg2; - let pattern5_0 = arg3; - // Rule at src/isa/s390x/lower.isle line 645. - let expr0_0: Type = I64; - let expr1_0: i16 = -1i128 as i16; - let expr2_0 = constructor_icmps_simm16(ctx, expr0_0, pattern5_0, expr1_0); - let expr3_0: Type = I64; - let expr4_0 = IntCC::Equal; - let expr5_0 = C::intcc_as_cond(ctx, &expr4_0); - let expr6_0: i16 = 0i128 as i16; - let expr7_0 = constructor_cmov_imm(ctx, expr3_0, &expr5_0, expr6_0, pattern4_0); - let expr8_0 = constructor_with_flags_reg(ctx, &expr2_0, &expr7_0); - return expr8_0; - } - } - if pattern0_0 == false { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - let pattern4_0 = arg3; - // Rule at src/isa/s390x/lower.isle line 643. - return pattern3_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "maybe_avoid_srem_overflow", "src/isa/s390x/lower.isle line 642" - ); -} - -// Generated as internal constructor for term bitrev_bits. -pub fn constructor_bitrev_bits( - ctx: &mut C, - arg0: u8, - arg1: u64, - arg2: Type, - arg3: Reg, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - if let Some(pattern3_0) = C::fits_in_64(ctx, pattern2_0) { - let pattern4_0 = arg3; - // Rule at src/isa/s390x/lower.isle line 1124. - let expr0_0 = constructor_imm(ctx, pattern3_0, pattern1_0); - let expr1_0 = constructor_ty_ext32(ctx, pattern3_0); - let expr2_0 = constructor_lshl_imm(ctx, expr1_0, pattern4_0, pattern0_0); - let expr3_0 = constructor_ty_ext32(ctx, pattern3_0); - let expr4_0 = constructor_lshr_imm(ctx, expr3_0, pattern4_0, pattern0_0); - let expr5_0 = constructor_and_reg(ctx, pattern3_0, expr2_0, expr0_0); - let expr6_0 = constructor_not_reg(ctx, pattern3_0, expr0_0); - let expr7_0 = constructor_and_reg(ctx, pattern3_0, expr4_0, expr6_0); - let expr8_0 = constructor_or_reg(ctx, pattern3_0, expr5_0, expr7_0); - return expr8_0; - } - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - if let Some(pattern3_0) = C::vr128_ty(ctx, pattern2_0) { - let pattern4_0 = arg3; - // Rule at src/isa/s390x/lower.isle line 1132. - let expr0_0: Type = I64X2; - let expr1_0 = constructor_vec_imm_splat(ctx, expr0_0, pattern1_0); - let expr2_0: Type = I8X16; - let expr3_0 = C::u8_as_u64(ctx, pattern0_0); - let expr4_0 = constructor_vec_imm_splat(ctx, expr2_0, expr3_0); - let expr5_0 = constructor_vec_lshl_by_bit(ctx, pattern4_0, expr4_0); - let expr6_0 = constructor_vec_lshr_by_bit(ctx, pattern4_0, expr4_0); - let expr7_0 = constructor_vec_select(ctx, pattern3_0, expr5_0, expr6_0, expr1_0); - return expr7_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "bitrev_bits", "src/isa/s390x/lower.isle line 1123" - ); -} - -// Generated as internal constructor for term bitrev_bytes. -pub fn constructor_bitrev_bytes(ctx: &mut C, arg0: Type, arg1: Reg) -> Reg { - let pattern0_0 = arg0; - if pattern0_0 == I8 { - let pattern2_0 = arg1; - // Rule at src/isa/s390x/lower.isle line 1140. - return pattern2_0; - } - if pattern0_0 == I16 { - let pattern2_0 = arg1; - // Rule at src/isa/s390x/lower.isle line 1141. - let expr0_0: Type = I32; - let expr1_0: Type = I32; - let expr2_0 = constructor_bswap_reg(ctx, expr1_0, pattern2_0); - let expr3_0: u8 = 16i128 as u8; - let expr4_0 = constructor_lshr_imm(ctx, expr0_0, expr2_0, expr3_0); - return expr4_0; - } - if pattern0_0 == I32 { - let pattern2_0 = arg1; - // Rule at src/isa/s390x/lower.isle line 1142. - let expr0_0: Type = I32; - let expr1_0 = constructor_bswap_reg(ctx, expr0_0, pattern2_0); - return expr1_0; - } - if pattern0_0 == I64 { - let pattern2_0 = arg1; - // Rule at src/isa/s390x/lower.isle line 1143. - let expr0_0: Type = I64; - let expr1_0 = constructor_bswap_reg(ctx, expr0_0, pattern2_0); - return expr1_0; - } - if pattern0_0 == I128 { - let pattern2_0 = arg1; - // Rule at src/isa/s390x/lower.isle line 1144. - let expr0_0: Type = I128; - let expr1_0: Type = I8X16; - let expr2_0: u8 = 15i128 as u8; - let expr3_0: u8 = 14i128 as u8; - let expr4_0: u8 = 13i128 as u8; - let expr5_0: u8 = 12i128 as u8; - let expr6_0: u8 = 11i128 as u8; - let expr7_0: u8 = 10i128 as u8; - let expr8_0: u8 = 9i128 as u8; - let expr9_0: u8 = 8i128 as u8; - let expr10_0: u8 = 7i128 as u8; - let expr11_0: u8 = 6i128 as u8; - let expr12_0: u8 = 5i128 as u8; - let expr13_0: u8 = 4i128 as u8; - let expr14_0: u8 = 3i128 as u8; - let expr15_0: u8 = 2i128 as u8; - let expr16_0: u8 = 1i128 as u8; - let expr17_0: u8 = 0i128 as u8; - let expr18_0 = constructor_imm8x16( - ctx, expr2_0, expr3_0, expr4_0, expr5_0, expr6_0, expr7_0, expr8_0, expr9_0, expr10_0, - expr11_0, expr12_0, expr13_0, expr14_0, expr15_0, expr16_0, expr17_0, - ); - let expr19_0 = constructor_vec_imm(ctx, expr1_0, expr18_0); - let expr20_0 = constructor_vec_permute(ctx, expr0_0, pattern2_0, pattern2_0, expr19_0); - return expr20_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "bitrev_bytes", "src/isa/s390x/lower.isle line 1139" - ); -} - -// Generated as internal constructor for term clz_offset. -pub fn constructor_clz_offset(ctx: &mut C, arg0: Type, arg1: Reg) -> Reg { - let pattern0_0 = arg0; - if pattern0_0 == I8 { - let pattern2_0 = arg1; - // Rule at src/isa/s390x/lower.isle line 1161. - let expr0_0: Type = I8; - let expr1_0: i16 = -56i128 as i16; - let expr2_0 = constructor_add_simm16(ctx, expr0_0, pattern2_0, expr1_0); - return expr2_0; - } - if pattern0_0 == I16 { - let pattern2_0 = arg1; - // Rule at src/isa/s390x/lower.isle line 1162. - let expr0_0: Type = I16; - let expr1_0: i16 = -48i128 as i16; - let expr2_0 = constructor_add_simm16(ctx, expr0_0, pattern2_0, expr1_0); - return expr2_0; - } - if pattern0_0 == I32 { - let pattern2_0 = arg1; - // Rule at src/isa/s390x/lower.isle line 1163. - let expr0_0: Type = I32; - let expr1_0: i16 = -32i128 as i16; - let expr2_0 = constructor_add_simm16(ctx, expr0_0, pattern2_0, expr1_0); - return expr2_0; - } - if pattern0_0 == I64 { - let pattern2_0 = arg1; - // Rule at src/isa/s390x/lower.isle line 1164. - let expr0_0: Type = I64; - let expr1_0 = constructor_copy_reg(ctx, expr0_0, pattern2_0); - return expr1_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "clz_offset", "src/isa/s390x/lower.isle line 1160" - ); -} - -// Generated as internal constructor for term cls_offset. -pub fn constructor_cls_offset(ctx: &mut C, arg0: Type, arg1: Reg) -> Reg { - let pattern0_0 = arg0; - if pattern0_0 == I8 { - let pattern2_0 = arg1; - // Rule at src/isa/s390x/lower.isle line 1192. - let expr0_0: Type = I8; - let expr1_0: i16 = -57i128 as i16; - let expr2_0 = constructor_add_simm16(ctx, expr0_0, pattern2_0, expr1_0); - return expr2_0; - } - if pattern0_0 == I16 { - let pattern2_0 = arg1; - // Rule at src/isa/s390x/lower.isle line 1193. - let expr0_0: Type = I16; - let expr1_0: i16 = -49i128 as i16; - let expr2_0 = constructor_add_simm16(ctx, expr0_0, pattern2_0, expr1_0); - return expr2_0; - } - if pattern0_0 == I32 { - let pattern2_0 = arg1; - // Rule at src/isa/s390x/lower.isle line 1194. - let expr0_0: Type = I32; - let expr1_0: i16 = -33i128 as i16; - let expr2_0 = constructor_add_simm16(ctx, expr0_0, pattern2_0, expr1_0); - return expr2_0; - } - if pattern0_0 == I64 { - let pattern2_0 = arg1; - // Rule at src/isa/s390x/lower.isle line 1195. - let expr0_0: Type = I64; - let expr1_0: i16 = -1i128 as i16; - let expr2_0 = constructor_add_simm16(ctx, expr0_0, pattern2_0, expr1_0); - return expr2_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "cls_offset", "src/isa/s390x/lower.isle line 1191" - ); -} - -// Generated as internal constructor for term ctz_guardbit. -pub fn constructor_ctz_guardbit(ctx: &mut C, arg0: Type) -> UImm16Shifted { - let pattern0_0 = arg0; - if pattern0_0 == I8 { - // Rule at src/isa/s390x/lower.isle line 1246. - let expr0_0: u16 = 256i128 as u16; - let expr1_0: u8 = 0i128 as u8; - let expr2_0 = C::uimm16shifted(ctx, expr0_0, expr1_0); - return expr2_0; - } - if pattern0_0 == I16 { - // Rule at src/isa/s390x/lower.isle line 1247. - let expr0_0: u16 = 1i128 as u16; - let expr1_0: u8 = 16i128 as u8; - let expr2_0 = C::uimm16shifted(ctx, expr0_0, expr1_0); - return expr2_0; - } - if pattern0_0 == I32 { - // Rule at src/isa/s390x/lower.isle line 1248. - let expr0_0: u16 = 1i128 as u16; - let expr1_0: u8 = 32i128 as u8; - let expr2_0 = C::uimm16shifted(ctx, expr0_0, expr1_0); - return expr2_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "ctz_guardbit", "src/isa/s390x/lower.isle line 1245" - ); -} - -// Generated as internal constructor for term vec_move_lane_and_insert. -pub fn constructor_vec_move_lane_and_insert( - ctx: &mut C, - arg0: Type, - arg1: Reg, - arg2: u8, - arg3: Reg, - arg4: u8, -) -> Reg { - let pattern0_0 = arg0; - if let Some((pattern1_0, pattern1_1)) = C::multi_lane(ctx, pattern0_0) { - if pattern1_0 == 64i128 as u32 { - let pattern3_0 = arg1; - let pattern4_0 = arg2; - if pattern4_0 == 0i128 as u8 { - let pattern6_0 = arg3; - let pattern7_0 = arg4; - // Rule at src/isa/s390x/lower.isle line 1784. - let expr0_0: u8 = 1i128 as u8; - let expr1_0 = constructor_vec_permute_dw_imm( - ctx, pattern0_0, pattern6_0, pattern7_0, pattern3_0, expr0_0, - ); - return expr1_0; - } - if pattern4_0 == 1i128 as u8 { - let pattern6_0 = arg3; - let pattern7_0 = arg4; - // Rule at src/isa/s390x/lower.isle line 1786. - let expr0_0: u8 = 0i128 as u8; - let expr1_0 = constructor_vec_permute_dw_imm( - ctx, pattern0_0, pattern3_0, expr0_0, pattern6_0, pattern7_0, - ); - return expr1_0; - } - } - } - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - let pattern4_0 = arg4; - if pattern4_0 == pattern2_0 { - // Rule at src/isa/s390x/lower.isle line 1790. - let expr0_0 = C::lane_byte_mask(ctx, pattern0_0, pattern2_0); - let expr1_0 = constructor_vec_imm_byte_mask(ctx, pattern0_0, expr0_0); - let expr2_0 = constructor_vec_select(ctx, pattern0_0, pattern3_0, pattern1_0, expr1_0); - return expr2_0; - } - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - let pattern4_0 = arg4; - // Rule at src/isa/s390x/lower.isle line 1795. - let expr0_0 = constructor_vec_replicate_lane(ctx, pattern0_0, pattern3_0, pattern4_0); - let expr1_0 = C::lane_byte_mask(ctx, pattern0_0, pattern2_0); - let expr2_0 = constructor_vec_imm_byte_mask(ctx, pattern0_0, expr1_0); - let expr3_0 = constructor_vec_select(ctx, pattern0_0, expr0_0, pattern1_0, expr2_0); - return expr3_0; -} - -// Generated as internal constructor for term vec_load_lane_little. -pub fn constructor_vec_load_lane_little( - ctx: &mut C, - arg0: Type, - arg1: Reg, - arg2: &MemArg, - arg3: u8, -) -> Reg { - let pattern0_0 = arg0; - if let Some(()) = C::vxrs_ext2_enabled(ctx, pattern0_0) { - if let Some((pattern2_0, pattern2_1)) = C::multi_lane(ctx, pattern0_0) { - if pattern2_0 == 16i128 as u32 { - let pattern4_0 = arg1; - let pattern5_0 = arg2; - let pattern6_0 = arg3; - // Rule at src/isa/s390x/lower.isle line 1808. - let expr0_0 = constructor_vec_load_lane_rev( - ctx, pattern0_0, pattern4_0, pattern5_0, pattern6_0, - ); - return expr0_0; - } - if pattern2_0 == 32i128 as u32 { - let pattern4_0 = arg1; - let pattern5_0 = arg2; - let pattern6_0 = arg3; - // Rule at src/isa/s390x/lower.isle line 1811. - let expr0_0 = constructor_vec_load_lane_rev( - ctx, pattern0_0, pattern4_0, pattern5_0, pattern6_0, - ); - return expr0_0; - } - if pattern2_0 == 64i128 as u32 { - let pattern4_0 = arg1; - let pattern5_0 = arg2; - let pattern6_0 = arg3; - // Rule at src/isa/s390x/lower.isle line 1814. - let expr0_0 = constructor_vec_load_lane_rev( - ctx, pattern0_0, pattern4_0, pattern5_0, pattern6_0, - ); - return expr0_0; - } - } - } - let pattern0_0 = arg0; - if let Some(()) = C::vxrs_ext2_disabled(ctx, pattern0_0) { - if let Some((pattern2_0, pattern2_1)) = C::multi_lane(ctx, pattern0_0) { - if pattern2_0 == 16i128 as u32 { - let pattern4_0 = arg1; - let pattern5_0 = arg2; - let pattern6_0 = arg3; - // Rule at src/isa/s390x/lower.isle line 1819. - let expr0_0 = constructor_loadrev16(ctx, pattern5_0); - let expr1_0 = C::zero_reg(ctx); - let expr2_0 = constructor_vec_insert_lane( - ctx, pattern0_0, pattern4_0, expr0_0, pattern6_0, expr1_0, - ); - return expr2_0; - } - if pattern2_0 == 32i128 as u32 { - let pattern4_0 = arg1; - let pattern5_0 = arg2; - let pattern6_0 = arg3; - // Rule at src/isa/s390x/lower.isle line 1822. - let expr0_0 = constructor_loadrev32(ctx, pattern5_0); - let expr1_0 = C::zero_reg(ctx); - let expr2_0 = constructor_vec_insert_lane( - ctx, pattern0_0, pattern4_0, expr0_0, pattern6_0, expr1_0, - ); - return expr2_0; - } - if pattern2_0 == 64i128 as u32 { - let pattern4_0 = arg1; - let pattern5_0 = arg2; - let pattern6_0 = arg3; - // Rule at src/isa/s390x/lower.isle line 1825. - let expr0_0 = constructor_loadrev64(ctx, pattern5_0); - let expr1_0 = C::zero_reg(ctx); - let expr2_0 = constructor_vec_insert_lane( - ctx, pattern0_0, pattern4_0, expr0_0, pattern6_0, expr1_0, - ); - return expr2_0; - } - } - } - if let Some((pattern1_0, pattern1_1)) = C::multi_lane(ctx, pattern0_0) { - if pattern1_0 == 8i128 as u32 { - let pattern3_0 = arg1; - let pattern4_0 = arg2; - let pattern5_0 = arg3; - // Rule at src/isa/s390x/lower.isle line 1804. - let expr0_0 = - constructor_vec_load_lane(ctx, pattern0_0, pattern3_0, pattern4_0, pattern5_0); - return expr0_0; - } - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "vec_load_lane_little", "src/isa/s390x/lower.isle line 1801" - ); -} - -// Generated as internal constructor for term vec_load_lane_little_undef. -pub fn constructor_vec_load_lane_little_undef( - ctx: &mut C, - arg0: Type, - arg1: &MemArg, - arg2: u8, -) -> Reg { - let pattern0_0 = arg0; - if let Some(()) = C::vxrs_ext2_enabled(ctx, pattern0_0) { - if let Some((pattern2_0, pattern2_1)) = C::multi_lane(ctx, pattern0_0) { - if pattern2_0 == 16i128 as u32 { - let pattern4_0 = arg1; - let pattern5_0 = arg2; - // Rule at src/isa/s390x/lower.isle line 1837. - let expr0_0 = - constructor_vec_load_lane_rev_undef(ctx, pattern0_0, pattern4_0, pattern5_0); - return expr0_0; - } - if pattern2_0 == 32i128 as u32 { - let pattern4_0 = arg1; - let pattern5_0 = arg2; - // Rule at src/isa/s390x/lower.isle line 1840. - let expr0_0 = - constructor_vec_load_lane_rev_undef(ctx, pattern0_0, pattern4_0, pattern5_0); - return expr0_0; - } - if pattern2_0 == 64i128 as u32 { - let pattern4_0 = arg1; - let pattern5_0 = arg2; - // Rule at src/isa/s390x/lower.isle line 1843. - let expr0_0 = - constructor_vec_load_lane_rev_undef(ctx, pattern0_0, pattern4_0, pattern5_0); - return expr0_0; - } - } - } - let pattern0_0 = arg0; - if let Some(()) = C::vxrs_ext2_disabled(ctx, pattern0_0) { - if let Some((pattern2_0, pattern2_1)) = C::multi_lane(ctx, pattern0_0) { - if pattern2_0 == 16i128 as u32 { - let pattern4_0 = arg1; - let pattern5_0 = arg2; - // Rule at src/isa/s390x/lower.isle line 1848. - let expr0_0 = constructor_loadrev16(ctx, pattern4_0); - let expr1_0 = C::zero_reg(ctx); - let expr2_0 = constructor_vec_insert_lane_undef( - ctx, pattern0_0, expr0_0, pattern5_0, expr1_0, - ); - return expr2_0; - } - if pattern2_0 == 32i128 as u32 { - let pattern4_0 = arg1; - let pattern5_0 = arg2; - // Rule at src/isa/s390x/lower.isle line 1851. - let expr0_0 = constructor_loadrev32(ctx, pattern4_0); - let expr1_0 = C::zero_reg(ctx); - let expr2_0 = constructor_vec_insert_lane_undef( - ctx, pattern0_0, expr0_0, pattern5_0, expr1_0, - ); - return expr2_0; - } - if pattern2_0 == 64i128 as u32 { - let pattern4_0 = arg1; - let pattern5_0 = arg2; - // Rule at src/isa/s390x/lower.isle line 1854. - let expr0_0 = constructor_loadrev64(ctx, pattern4_0); - let expr1_0 = C::zero_reg(ctx); - let expr2_0 = constructor_vec_insert_lane_undef( - ctx, pattern0_0, expr0_0, pattern5_0, expr1_0, - ); - return expr2_0; - } - } - } - if let Some((pattern1_0, pattern1_1)) = C::multi_lane(ctx, pattern0_0) { - if pattern1_0 == 8i128 as u32 { - let pattern3_0 = arg1; - let pattern4_0 = arg2; - // Rule at src/isa/s390x/lower.isle line 1833. - let expr0_0 = constructor_vec_load_lane_undef(ctx, pattern0_0, pattern3_0, pattern4_0); - return expr0_0; - } - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "vec_load_lane_little_undef", "src/isa/s390x/lower.isle line 1830" - ); -} - -// Generated as internal constructor for term vec_store_lane_little. -pub fn constructor_vec_store_lane_little( - ctx: &mut C, - arg0: Type, - arg1: Reg, - arg2: &MemArg, - arg3: u8, -) -> SideEffectNoResult { - let pattern0_0 = arg0; - if let Some(()) = C::vxrs_ext2_enabled(ctx, pattern0_0) { - if let Some((pattern2_0, pattern2_1)) = C::multi_lane(ctx, pattern0_0) { - if pattern2_0 == 16i128 as u32 { - let pattern4_0 = arg1; - let pattern5_0 = arg2; - let pattern6_0 = arg3; - // Rule at src/isa/s390x/lower.isle line 1895. - let expr0_0 = constructor_vec_store_lane_rev( - ctx, pattern0_0, pattern4_0, pattern5_0, pattern6_0, - ); - return expr0_0; - } - if pattern2_0 == 32i128 as u32 { - let pattern4_0 = arg1; - let pattern5_0 = arg2; - let pattern6_0 = arg3; - // Rule at src/isa/s390x/lower.isle line 1898. - let expr0_0 = constructor_vec_store_lane_rev( - ctx, pattern0_0, pattern4_0, pattern5_0, pattern6_0, - ); - return expr0_0; - } - if pattern2_0 == 64i128 as u32 { - let pattern4_0 = arg1; - let pattern5_0 = arg2; - let pattern6_0 = arg3; - // Rule at src/isa/s390x/lower.isle line 1901. - let expr0_0 = constructor_vec_store_lane_rev( - ctx, pattern0_0, pattern4_0, pattern5_0, pattern6_0, - ); - return expr0_0; - } - } - } - let pattern0_0 = arg0; - if let Some(()) = C::vxrs_ext2_disabled(ctx, pattern0_0) { - if let Some((pattern2_0, pattern2_1)) = C::multi_lane(ctx, pattern0_0) { - if pattern2_0 == 16i128 as u32 { - let pattern4_0 = arg1; - let pattern5_0 = arg2; - let pattern6_0 = arg3; - // Rule at src/isa/s390x/lower.isle line 1906. - let expr0_0 = C::zero_reg(ctx); - let expr1_0 = - constructor_vec_extract_lane(ctx, pattern0_0, pattern4_0, pattern6_0, expr0_0); - let expr2_0 = constructor_storerev16(ctx, expr1_0, pattern5_0); - return expr2_0; - } - if pattern2_0 == 32i128 as u32 { - let pattern4_0 = arg1; - let pattern5_0 = arg2; - let pattern6_0 = arg3; - // Rule at src/isa/s390x/lower.isle line 1909. - let expr0_0 = C::zero_reg(ctx); - let expr1_0 = - constructor_vec_extract_lane(ctx, pattern0_0, pattern4_0, pattern6_0, expr0_0); - let expr2_0 = constructor_storerev32(ctx, expr1_0, pattern5_0); - return expr2_0; - } - if pattern2_0 == 64i128 as u32 { - let pattern4_0 = arg1; - let pattern5_0 = arg2; - let pattern6_0 = arg3; - // Rule at src/isa/s390x/lower.isle line 1912. - let expr0_0 = C::zero_reg(ctx); - let expr1_0 = - constructor_vec_extract_lane(ctx, pattern0_0, pattern4_0, pattern6_0, expr0_0); - let expr2_0 = constructor_storerev64(ctx, expr1_0, pattern5_0); - return expr2_0; - } - } - } - if let Some((pattern1_0, pattern1_1)) = C::multi_lane(ctx, pattern0_0) { - if pattern1_0 == 8i128 as u32 { - let pattern3_0 = arg1; - let pattern4_0 = arg2; - let pattern5_0 = arg3; - // Rule at src/isa/s390x/lower.isle line 1891. - let expr0_0 = - constructor_vec_store_lane(ctx, pattern0_0, pattern3_0, pattern4_0, pattern5_0); - return expr0_0; - } - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "vec_store_lane_little", "src/isa/s390x/lower.isle line 1888" - ); -} - -// Generated as internal constructor for term vec_load_replicate_little. -pub fn constructor_vec_load_replicate_little( - ctx: &mut C, - arg0: Type, - arg1: &MemArg, -) -> Reg { - let pattern0_0 = arg0; - if let Some(()) = C::vxrs_ext2_enabled(ctx, pattern0_0) { - if let Some((pattern2_0, pattern2_1)) = C::multi_lane(ctx, pattern0_0) { - if pattern2_0 == 16i128 as u32 { - let pattern4_0 = arg1; - // Rule at src/isa/s390x/lower.isle line 1954. - let expr0_0 = constructor_vec_load_replicate_rev(ctx, pattern0_0, pattern4_0); - return expr0_0; - } - if pattern2_0 == 32i128 as u32 { - let pattern4_0 = arg1; - // Rule at src/isa/s390x/lower.isle line 1957. - let expr0_0 = constructor_vec_load_replicate_rev(ctx, pattern0_0, pattern4_0); - return expr0_0; - } - if pattern2_0 == 64i128 as u32 { - let pattern4_0 = arg1; - // Rule at src/isa/s390x/lower.isle line 1960. - let expr0_0 = constructor_vec_load_replicate_rev(ctx, pattern0_0, pattern4_0); - return expr0_0; - } - } - } - let pattern0_0 = arg0; - if let Some(()) = C::vxrs_ext2_disabled(ctx, pattern0_0) { - if let Some((pattern2_0, pattern2_1)) = C::multi_lane(ctx, pattern0_0) { - if pattern2_0 == 16i128 as u32 { - let pattern4_0 = arg1; - // Rule at src/isa/s390x/lower.isle line 1965. - let expr0_0: u8 = 0i128 as u8; - let expr1_0 = - constructor_vec_load_lane_little_undef(ctx, pattern0_0, pattern4_0, expr0_0); - let expr2_0: u8 = 0i128 as u8; - let expr3_0 = constructor_vec_replicate_lane(ctx, pattern0_0, expr1_0, expr2_0); - return expr3_0; - } - if pattern2_0 == 32i128 as u32 { - let pattern4_0 = arg1; - // Rule at src/isa/s390x/lower.isle line 1968. - let expr0_0: u8 = 0i128 as u8; - let expr1_0 = - constructor_vec_load_lane_little_undef(ctx, pattern0_0, pattern4_0, expr0_0); - let expr2_0: u8 = 0i128 as u8; - let expr3_0 = constructor_vec_replicate_lane(ctx, pattern0_0, expr1_0, expr2_0); - return expr3_0; - } - if pattern2_0 == 64i128 as u32 { - let pattern4_0 = arg1; - // Rule at src/isa/s390x/lower.isle line 1971. - let expr0_0: u8 = 0i128 as u8; - let expr1_0 = - constructor_vec_load_lane_little_undef(ctx, pattern0_0, pattern4_0, expr0_0); - let expr2_0: u8 = 0i128 as u8; - let expr3_0 = constructor_vec_replicate_lane(ctx, pattern0_0, expr1_0, expr2_0); - return expr3_0; - } - } - } - if let Some((pattern1_0, pattern1_1)) = C::multi_lane(ctx, pattern0_0) { - if pattern1_0 == 8i128 as u32 { - let pattern3_0 = arg1; - // Rule at src/isa/s390x/lower.isle line 1950. - let expr0_0 = constructor_vec_load_replicate(ctx, pattern0_0, pattern3_0); - return expr0_0; - } - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "vec_load_replicate_little", "src/isa/s390x/lower.isle line 1947" - ); -} - -// Generated as internal constructor for term vec_move_lane_and_zero. -pub fn constructor_vec_move_lane_and_zero( - ctx: &mut C, - arg0: Type, - arg1: u8, - arg2: Reg, - arg3: u8, -) -> Reg { - let pattern0_0 = arg0; - if let Some((pattern1_0, pattern1_1)) = C::multi_lane(ctx, pattern0_0) { - if pattern1_0 == 64i128 as u32 { - let pattern3_0 = arg1; - if pattern3_0 == 0i128 as u8 { - let pattern5_0 = arg2; - let pattern6_0 = arg3; - // Rule at src/isa/s390x/lower.isle line 2011. - let expr0_0: u128 = 0i128 as u128; - let expr1_0 = constructor_vec_imm(ctx, pattern0_0, expr0_0); - let expr2_0: u8 = 0i128 as u8; - let expr3_0 = constructor_vec_permute_dw_imm( - ctx, pattern0_0, pattern5_0, pattern6_0, expr1_0, expr2_0, - ); - return expr3_0; - } - if pattern3_0 == 1i128 as u8 { - let pattern5_0 = arg2; - let pattern6_0 = arg3; - // Rule at src/isa/s390x/lower.isle line 2013. - let expr0_0: u128 = 0i128 as u128; - let expr1_0 = constructor_vec_imm(ctx, pattern0_0, expr0_0); - let expr2_0: u8 = 0i128 as u8; - let expr3_0 = constructor_vec_permute_dw_imm( - ctx, pattern0_0, expr1_0, expr2_0, pattern5_0, pattern6_0, - ); - return expr3_0; - } - } - } - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - if pattern3_0 == pattern1_0 { - // Rule at src/isa/s390x/lower.isle line 2017. - let expr0_0 = C::lane_byte_mask(ctx, pattern0_0, pattern1_0); - let expr1_0 = constructor_vec_imm_byte_mask(ctx, pattern0_0, expr0_0); - let expr2_0 = constructor_vec_and(ctx, pattern0_0, pattern2_0, expr1_0); - return expr2_0; - } - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - // Rule at src/isa/s390x/lower.isle line 2022. - let expr0_0 = constructor_vec_replicate_lane(ctx, pattern0_0, pattern2_0, pattern3_0); - let expr1_0 = C::lane_byte_mask(ctx, pattern0_0, pattern1_0); - let expr2_0 = constructor_vec_imm_byte_mask(ctx, pattern0_0, expr1_0); - let expr3_0 = constructor_vec_and(ctx, pattern0_0, expr0_0, expr2_0); - return expr3_0; -} - -// Generated as internal constructor for term lib_call_tls_get_offset. -pub fn constructor_lib_call_tls_get_offset( - ctx: &mut C, - arg0: Reg, - arg1: Reg, - arg2: &SymbolReloc, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/s390x/lower.isle line 2258. - let expr0_0: Type = I64; - let expr1_0 = C::temp_writable_reg(ctx, expr0_0); - let expr2_0 = C::lib_call_info_tls_get_offset(ctx, expr1_0, pattern0_0, pattern1_0, pattern2_0); - let expr3_0 = C::lib_accumulate_outgoing_args_size(ctx, &expr2_0); - let expr4_0 = constructor_lib_call(ctx, &expr2_0); - let expr5_0 = constructor_side_effect(ctx, &expr4_0); - let expr6_0 = C::writable_reg_to_reg(ctx, expr1_0); - return expr6_0; -} - -// Generated as internal constructor for term thread_pointer. -pub fn constructor_thread_pointer(ctx: &mut C) -> Reg { - // Rule at src/isa/s390x/lower.isle line 2267. - let expr0_0: Type = I64; - let expr1_0: u8 = 0i128 as u8; - let expr2_0 = constructor_load_ar(ctx, expr1_0); - let expr3_0: u8 = 32i128 as u8; - let expr4_0 = constructor_lshl_imm(ctx, expr0_0, expr2_0, expr3_0); - let expr5_0: u8 = 1i128 as u8; - let expr6_0 = constructor_insert_ar(ctx, expr4_0, expr5_0); - return expr6_0; -} - -// Generated as internal constructor for term vec_load_full_rev. -pub fn constructor_vec_load_full_rev( - ctx: &mut C, - arg0: Type, - arg1: MemFlags, - arg2: Value, - arg3: Offset32, -) -> Reg { - let pattern0_0 = arg0; - if let Some(()) = C::vxrs_ext2_enabled(ctx, pattern0_0) { - if let Some(pattern2_0) = C::vr128_ty(ctx, pattern0_0) { - let pattern3_0 = arg1; - let pattern4_0 = arg2; - let pattern5_0 = arg3; - // Rule at src/isa/s390x/lower.isle line 2350. - let expr0_0 = constructor_lower_address(ctx, pattern3_0, pattern4_0, pattern5_0); - let expr1_0 = constructor_vec_loadrev(ctx, pattern2_0, &expr0_0); - return expr1_0; - } - } - let pattern0_0 = arg0; - if let Some(()) = C::vxrs_ext2_disabled(ctx, pattern0_0) { - if let Some(pattern2_0) = C::vr128_ty(ctx, pattern0_0) { - let pattern3_0 = arg1; - let pattern4_0 = arg2; - let pattern5_0 = arg3; - // Rule at src/isa/s390x/lower.isle line 2354. - let expr0_0: u8 = 0i128 as u8; - let expr1_0 = - constructor_lower_address_bias(ctx, pattern3_0, pattern4_0, pattern5_0, expr0_0); - let expr2_0: u8 = 8i128 as u8; - let expr3_0 = - constructor_lower_address_bias(ctx, pattern3_0, pattern4_0, pattern5_0, expr2_0); - let expr4_0 = constructor_loadrev64(ctx, &expr1_0); - let expr5_0 = constructor_loadrev64(ctx, &expr3_0); - let expr6_0 = constructor_mov_to_vec128(ctx, pattern2_0, expr5_0, expr4_0); - return expr6_0; - } - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "vec_load_full_rev", "src/isa/s390x/lower.isle line 2347" - ); -} - -// Generated as internal constructor for term vec_load_byte_rev. -pub fn constructor_vec_load_byte_rev( - ctx: &mut C, - arg0: Type, - arg1: MemFlags, - arg2: Value, - arg3: Offset32, -) -> Reg { - let pattern0_0 = arg0; - if let Some(()) = C::vxrs_ext2_enabled(ctx, pattern0_0) { - if let Some((pattern2_0, pattern2_1)) = C::multi_lane(ctx, pattern0_0) { - if pattern2_0 == 16i128 as u32 { - if pattern2_1 == 8i128 as u32 { - let pattern5_0 = arg1; - let pattern6_0 = arg2; - let pattern7_0 = arg3; - // Rule at src/isa/s390x/lower.isle line 2380. - let expr0_0 = - constructor_lower_address(ctx, pattern5_0, pattern6_0, pattern7_0); - let expr1_0 = constructor_vec_load_byte16rev(ctx, pattern0_0, &expr0_0); - return expr1_0; - } - } - if pattern2_0 == 32i128 as u32 { - if pattern2_1 == 4i128 as u32 { - let pattern5_0 = arg1; - let pattern6_0 = arg2; - let pattern7_0 = arg3; - // Rule at src/isa/s390x/lower.isle line 2377. - let expr0_0 = - constructor_lower_address(ctx, pattern5_0, pattern6_0, pattern7_0); - let expr1_0 = constructor_vec_load_byte32rev(ctx, pattern0_0, &expr0_0); - return expr1_0; - } - } - if pattern2_0 == 64i128 as u32 { - if pattern2_1 == 2i128 as u32 { - let pattern5_0 = arg1; - let pattern6_0 = arg2; - let pattern7_0 = arg3; - // Rule at src/isa/s390x/lower.isle line 2374. - let expr0_0 = - constructor_lower_address(ctx, pattern5_0, pattern6_0, pattern7_0); - let expr1_0 = constructor_vec_load_byte64rev(ctx, pattern0_0, &expr0_0); - return expr1_0; - } - } - } - } - let pattern0_0 = arg0; - if let Some(()) = C::vxrs_ext2_disabled(ctx, pattern0_0) { - if let Some((pattern2_0, pattern2_1)) = C::multi_lane(ctx, pattern0_0) { - if pattern2_0 == 16i128 as u32 { - if pattern2_1 == 8i128 as u32 { - let pattern5_0 = arg1; - let pattern6_0 = arg2; - let pattern7_0 = arg3; - // Rule at src/isa/s390x/lower.isle line 2391. - let expr0_0 = constructor_vec_load_full_rev( - ctx, pattern0_0, pattern5_0, pattern6_0, pattern7_0, - ); - let expr1_0 = constructor_vec_elt_rev(ctx, pattern0_0, expr0_0); - return expr1_0; - } - } - if pattern2_0 == 32i128 as u32 { - if pattern2_1 == 4i128 as u32 { - let pattern5_0 = arg1; - let pattern6_0 = arg2; - let pattern7_0 = arg3; - // Rule at src/isa/s390x/lower.isle line 2388. - let expr0_0 = constructor_vec_load_full_rev( - ctx, pattern0_0, pattern5_0, pattern6_0, pattern7_0, - ); - let expr1_0 = constructor_vec_elt_rev(ctx, pattern0_0, expr0_0); - return expr1_0; - } - } - if pattern2_0 == 64i128 as u32 { - if pattern2_1 == 2i128 as u32 { - let pattern5_0 = arg1; - let pattern6_0 = arg2; - let pattern7_0 = arg3; - // Rule at src/isa/s390x/lower.isle line 2385. - let expr0_0 = constructor_vec_load_full_rev( - ctx, pattern0_0, pattern5_0, pattern6_0, pattern7_0, - ); - let expr1_0 = constructor_vec_elt_rev(ctx, pattern0_0, expr0_0); - return expr1_0; - } - } - } - } - if let Some((pattern1_0, pattern1_1)) = C::multi_lane(ctx, pattern0_0) { - if pattern1_0 == 8i128 as u32 { - if pattern1_1 == 16i128 as u32 { - let pattern4_0 = arg1; - let pattern5_0 = arg2; - let pattern6_0 = arg3; - // Rule at src/isa/s390x/lower.isle line 2370. - let expr0_0 = constructor_lower_address(ctx, pattern4_0, pattern5_0, pattern6_0); - let expr1_0 = constructor_vec_load(ctx, pattern0_0, &expr0_0); - return expr1_0; - } - } - } - let pattern0_0 = arg0; - if pattern0_0 == I128 { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - let pattern4_0 = arg3; - // Rule at src/isa/s390x/lower.isle line 2366. - let expr0_0: Type = I128; - let expr1_0 = - constructor_vec_load_full_rev(ctx, expr0_0, pattern2_0, pattern3_0, pattern4_0); - return expr1_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "vec_load_byte_rev", "src/isa/s390x/lower.isle line 2363" - ); -} - -// Generated as internal constructor for term vec_load_elt_rev. -pub fn constructor_vec_load_elt_rev( - ctx: &mut C, - arg0: Type, - arg1: MemFlags, - arg2: Value, - arg3: Offset32, -) -> Reg { - let pattern0_0 = arg0; - if let Some(()) = C::vxrs_ext2_enabled(ctx, pattern0_0) { - if let Some((pattern2_0, pattern2_1)) = C::multi_lane(ctx, pattern0_0) { - if pattern2_0 == 16i128 as u32 { - if pattern2_1 == 8i128 as u32 { - let pattern5_0 = arg1; - let pattern6_0 = arg2; - let pattern7_0 = arg3; - // Rule at src/isa/s390x/lower.isle line 2415. - let expr0_0 = - constructor_lower_address(ctx, pattern5_0, pattern6_0, pattern7_0); - let expr1_0 = constructor_vec_load_elt16rev(ctx, pattern0_0, &expr0_0); - return expr1_0; - } - } - if pattern2_0 == 32i128 as u32 { - if pattern2_1 == 4i128 as u32 { - let pattern5_0 = arg1; - let pattern6_0 = arg2; - let pattern7_0 = arg3; - // Rule at src/isa/s390x/lower.isle line 2412. - let expr0_0 = - constructor_lower_address(ctx, pattern5_0, pattern6_0, pattern7_0); - let expr1_0 = constructor_vec_load_elt32rev(ctx, pattern0_0, &expr0_0); - return expr1_0; - } - } - if pattern2_0 == 64i128 as u32 { - if pattern2_1 == 2i128 as u32 { - let pattern5_0 = arg1; - let pattern6_0 = arg2; - let pattern7_0 = arg3; - // Rule at src/isa/s390x/lower.isle line 2409. - let expr0_0 = - constructor_lower_address(ctx, pattern5_0, pattern6_0, pattern7_0); - let expr1_0 = constructor_vec_load_elt64rev(ctx, pattern0_0, &expr0_0); - return expr1_0; - } - } - } - } - let pattern0_0 = arg0; - if let Some(()) = C::vxrs_ext2_disabled(ctx, pattern0_0) { - if let Some((pattern2_0, pattern2_1)) = C::multi_lane(ctx, pattern0_0) { - if pattern2_0 == 16i128 as u32 { - if pattern2_1 == 8i128 as u32 { - let pattern5_0 = arg1; - let pattern6_0 = arg2; - let pattern7_0 = arg3; - // Rule at src/isa/s390x/lower.isle line 2426. - let expr0_0 = - constructor_lower_address(ctx, pattern5_0, pattern6_0, pattern7_0); - let expr1_0 = constructor_vec_load(ctx, pattern0_0, &expr0_0); - let expr2_0 = constructor_vec_elt_rev(ctx, pattern0_0, expr1_0); - return expr2_0; - } - } - if pattern2_0 == 32i128 as u32 { - if pattern2_1 == 4i128 as u32 { - let pattern5_0 = arg1; - let pattern6_0 = arg2; - let pattern7_0 = arg3; - // Rule at src/isa/s390x/lower.isle line 2423. - let expr0_0 = - constructor_lower_address(ctx, pattern5_0, pattern6_0, pattern7_0); - let expr1_0 = constructor_vec_load(ctx, pattern0_0, &expr0_0); - let expr2_0 = constructor_vec_elt_rev(ctx, pattern0_0, expr1_0); - return expr2_0; - } - } - if pattern2_0 == 64i128 as u32 { - if pattern2_1 == 2i128 as u32 { - let pattern5_0 = arg1; - let pattern6_0 = arg2; - let pattern7_0 = arg3; - // Rule at src/isa/s390x/lower.isle line 2420. - let expr0_0 = - constructor_lower_address(ctx, pattern5_0, pattern6_0, pattern7_0); - let expr1_0 = constructor_vec_load(ctx, pattern0_0, &expr0_0); - let expr2_0 = constructor_vec_elt_rev(ctx, pattern0_0, expr1_0); - return expr2_0; - } - } - } - } - if let Some((pattern1_0, pattern1_1)) = C::multi_lane(ctx, pattern0_0) { - if pattern1_0 == 8i128 as u32 { - if pattern1_1 == 16i128 as u32 { - let pattern4_0 = arg1; - let pattern5_0 = arg2; - let pattern6_0 = arg3; - // Rule at src/isa/s390x/lower.isle line 2405. - let expr0_0 = constructor_vec_load_full_rev( - ctx, pattern0_0, pattern4_0, pattern5_0, pattern6_0, - ); - return expr0_0; - } - } - } - let pattern0_0 = arg0; - if pattern0_0 == I128 { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - let pattern4_0 = arg3; - // Rule at src/isa/s390x/lower.isle line 2401. - let expr0_0: Type = I128; - let expr1_0 = constructor_lower_address(ctx, pattern2_0, pattern3_0, pattern4_0); - let expr2_0 = constructor_vec_load(ctx, expr0_0, &expr1_0); - return expr2_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "vec_load_elt_rev", "src/isa/s390x/lower.isle line 2397" - ); -} - -// Generated as internal constructor for term load_v64. -pub fn constructor_load_v64( - ctx: &mut C, - arg0: Type, - arg1: MemFlags, - arg2: Value, - arg3: Offset32, -) -> Reg { - let pattern0_0 = arg0; - if let Some((pattern1_0, pattern1_1)) = C::multi_lane(ctx, pattern0_0) { - if pattern1_0 == 8i128 as u32 { - if pattern1_1 == 16i128 as u32 { - let pattern4_0 = arg1; - let pattern5_0 = arg2; - let pattern6_0 = arg3; - let mut closure7 = || { - let expr0_0 = C::lane_order(ctx); - return Some(expr0_0); - }; - if let Some(pattern7_0) = closure7() { - if let &LaneOrder::LittleEndian = &pattern7_0 { - // Rule at src/isa/s390x/lower.isle line 2577. - let expr0_0: Type = I64X2; - let expr1_0 = - constructor_lower_address(ctx, pattern4_0, pattern5_0, pattern6_0); - let expr2_0: u8 = 0i128 as u8; - let expr3_0 = - constructor_vec_load_lane_little_undef(ctx, expr0_0, &expr1_0, expr2_0); - return expr3_0; - } - } - } - } - if pattern1_0 == 16i128 as u32 { - if pattern1_1 == 8i128 as u32 { - let pattern4_0 = arg1; - if let Some(()) = C::bigendian(ctx, pattern4_0) { - let pattern6_0 = arg2; - let pattern7_0 = arg3; - let mut closure8 = || { - let expr0_0 = C::lane_order(ctx); - return Some(expr0_0); - }; - if let Some(pattern8_0) = closure8() { - if let &LaneOrder::LittleEndian = &pattern8_0 { - // Rule at src/isa/s390x/lower.isle line 2588. - let expr0_0: Type = I16X8; - let expr1_0: Type = I64X2; - let expr2_0 = - constructor_lower_address(ctx, pattern4_0, pattern6_0, pattern7_0); - let expr3_0: u8 = 0i128 as u8; - let expr4_0 = constructor_vec_load_lane_little_undef( - ctx, expr1_0, &expr2_0, expr3_0, - ); - let expr5_0: u8 = 8i128 as u8; - let expr6_0 = constructor_vec_rot_imm(ctx, expr0_0, expr4_0, expr5_0); - return expr6_0; - } - } - } - } - } - if pattern1_0 == 32i128 as u32 { - if pattern1_1 == 4i128 as u32 { - let pattern4_0 = arg1; - if let Some(()) = C::bigendian(ctx, pattern4_0) { - let pattern6_0 = arg2; - let pattern7_0 = arg3; - let mut closure8 = || { - let expr0_0 = C::lane_order(ctx); - return Some(expr0_0); - }; - if let Some(pattern8_0) = closure8() { - if let &LaneOrder::LittleEndian = &pattern8_0 { - // Rule at src/isa/s390x/lower.isle line 2600. - let expr0_0: Type = I64X2; - let expr1_0: Type = I64X2; - let expr2_0 = - constructor_lower_address(ctx, pattern4_0, pattern6_0, pattern7_0); - let expr3_0: u8 = 0i128 as u8; - let expr4_0 = - constructor_vec_load_lane_undef(ctx, expr1_0, &expr2_0, expr3_0); - let expr5_0: u8 = 32i128 as u8; - let expr6_0 = constructor_vec_rot_imm(ctx, expr0_0, expr4_0, expr5_0); - return expr6_0; - } - } - } - } - } - } - let pattern0_0 = arg0; - if let Some((pattern1_0, pattern1_1)) = C::multi_lane(ctx, pattern0_0) { - if pattern1_0 == 8i128 as u32 { - if pattern1_1 == 16i128 as u32 { - let pattern4_0 = arg1; - let pattern5_0 = arg2; - let pattern6_0 = arg3; - let mut closure7 = || { - let expr0_0 = C::lane_order(ctx); - return Some(expr0_0); - }; - if let Some(pattern7_0) = closure7() { - if let &LaneOrder::BigEndian = &pattern7_0 { - // Rule at src/isa/s390x/lower.isle line 2572. - let expr0_0: Type = I64X2; - let expr1_0 = - constructor_lower_address(ctx, pattern4_0, pattern5_0, pattern6_0); - let expr2_0: u8 = 0i128 as u8; - let expr3_0 = - constructor_vec_load_lane_undef(ctx, expr0_0, &expr1_0, expr2_0); - return expr3_0; - } - } - } - } - if pattern1_0 == 16i128 as u32 { - if pattern1_1 == 8i128 as u32 { - let pattern4_0 = arg1; - if let Some(()) = C::littleendian(ctx, pattern4_0) { - let pattern6_0 = arg2; - let pattern7_0 = arg3; - let mut closure8 = || { - let expr0_0 = C::lane_order(ctx); - return Some(expr0_0); - }; - if let Some(pattern8_0) = closure8() { - if let &LaneOrder::BigEndian = &pattern8_0 { - // Rule at src/isa/s390x/lower.isle line 2582. - let expr0_0: Type = I16X8; - let expr1_0: Type = I64X2; - let expr2_0 = - constructor_lower_address(ctx, pattern4_0, pattern6_0, pattern7_0); - let expr3_0: u8 = 0i128 as u8; - let expr4_0 = - constructor_vec_load_lane_undef(ctx, expr1_0, &expr2_0, expr3_0); - let expr5_0: u8 = 8i128 as u8; - let expr6_0 = constructor_vec_rot_imm(ctx, expr0_0, expr4_0, expr5_0); - return expr6_0; - } - } - } - } - } - if pattern1_0 == 32i128 as u32 { - if pattern1_1 == 4i128 as u32 { - let pattern4_0 = arg1; - if let Some(()) = C::littleendian(ctx, pattern4_0) { - let pattern6_0 = arg2; - let pattern7_0 = arg3; - let mut closure8 = || { - let expr0_0 = C::lane_order(ctx); - return Some(expr0_0); - }; - if let Some(pattern8_0) = closure8() { - if let &LaneOrder::BigEndian = &pattern8_0 { - // Rule at src/isa/s390x/lower.isle line 2594. - let expr0_0: Type = I64X2; - let expr1_0: Type = I64X2; - let expr2_0 = - constructor_lower_address(ctx, pattern4_0, pattern6_0, pattern7_0); - let expr3_0: u8 = 0i128 as u8; - let expr4_0 = constructor_vec_load_lane_little_undef( - ctx, expr1_0, &expr2_0, expr3_0, - ); - let expr5_0: u8 = 32i128 as u8; - let expr6_0 = constructor_vec_rot_imm(ctx, expr0_0, expr4_0, expr5_0); - return expr6_0; - } - } - } - } - } - } - let pattern0_0 = arg0; - let pattern1_0 = arg1; - if let Some(()) = C::bigendian(ctx, pattern1_0) { - let pattern3_0 = arg2; - let pattern4_0 = arg3; - let mut closure5 = || { - let expr0_0 = C::lane_order(ctx); - return Some(expr0_0); - }; - if let Some(pattern5_0) = closure5() { - if let &LaneOrder::BigEndian = &pattern5_0 { - // Rule at src/isa/s390x/lower.isle line 2562. - let expr0_0: Type = I64X2; - let expr1_0 = constructor_lower_address(ctx, pattern1_0, pattern3_0, pattern4_0); - let expr2_0: u8 = 0i128 as u8; - let expr3_0 = constructor_vec_load_lane_undef(ctx, expr0_0, &expr1_0, expr2_0); - return expr3_0; - } - } - } - let pattern0_0 = arg0; - let pattern1_0 = arg1; - if let Some(()) = C::littleendian(ctx, pattern1_0) { - let pattern3_0 = arg2; - let pattern4_0 = arg3; - let mut closure5 = || { - let expr0_0 = C::lane_order(ctx); - return Some(expr0_0); - }; - if let Some(pattern5_0) = closure5() { - if let &LaneOrder::LittleEndian = &pattern5_0 { - // Rule at src/isa/s390x/lower.isle line 2567. - let expr0_0: Type = I64X2; - let expr1_0 = constructor_lower_address(ctx, pattern1_0, pattern3_0, pattern4_0); - let expr2_0: u8 = 0i128 as u8; - let expr3_0 = - constructor_vec_load_lane_little_undef(ctx, expr0_0, &expr1_0, expr2_0); - return expr3_0; - } - } - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "load_v64", "src/isa/s390x/lower.isle line 2559" - ); -} - -// Generated as internal constructor for term vec_store_full_rev. -pub fn constructor_vec_store_full_rev( - ctx: &mut C, - arg0: Type, - arg1: Reg, - arg2: MemFlags, - arg3: Value, - arg4: Offset32, -) -> SideEffectNoResult { - let pattern0_0 = arg0; - if let Some(()) = C::vxrs_ext2_enabled(ctx, pattern0_0) { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - let pattern4_0 = arg3; - let pattern5_0 = arg4; - // Rule at src/isa/s390x/lower.isle line 2684. - let expr0_0 = constructor_lower_address(ctx, pattern3_0, pattern4_0, pattern5_0); - let expr1_0 = constructor_vec_storerev(ctx, pattern2_0, &expr0_0); - return expr1_0; - } - let pattern0_0 = arg0; - if let Some(()) = C::vxrs_ext2_disabled(ctx, pattern0_0) { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - let pattern4_0 = arg3; - let pattern5_0 = arg4; - // Rule at src/isa/s390x/lower.isle line 2688. - let expr0_0: u8 = 0i128 as u8; - let expr1_0 = - constructor_lower_address_bias(ctx, pattern3_0, pattern4_0, pattern5_0, expr0_0); - let expr2_0: u8 = 8i128 as u8; - let expr3_0 = - constructor_lower_address_bias(ctx, pattern3_0, pattern4_0, pattern5_0, expr2_0); - let expr4_0: Type = I64X2; - let expr5_0: u8 = 1i128 as u8; - let expr6_0 = C::zero_reg(ctx); - let expr7_0 = constructor_vec_extract_lane(ctx, expr4_0, pattern2_0, expr5_0, expr6_0); - let expr8_0: Type = I64X2; - let expr9_0: u8 = 0i128 as u8; - let expr10_0 = C::zero_reg(ctx); - let expr11_0 = constructor_vec_extract_lane(ctx, expr8_0, pattern2_0, expr9_0, expr10_0); - let expr12_0 = constructor_storerev64(ctx, expr7_0, &expr1_0); - let expr13_0 = constructor_storerev64(ctx, expr11_0, &expr3_0); - let expr14_0 = constructor_side_effect_concat(ctx, &expr12_0, &expr13_0); - return expr14_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "vec_store_full_rev", "src/isa/s390x/lower.isle line 2681" - ); -} - -// Generated as internal constructor for term vec_store_byte_rev. -pub fn constructor_vec_store_byte_rev( - ctx: &mut C, - arg0: Type, - arg1: Reg, - arg2: MemFlags, - arg3: Value, - arg4: Offset32, -) -> SideEffectNoResult { - let pattern0_0 = arg0; - if let Some(()) = C::vxrs_ext2_enabled(ctx, pattern0_0) { - if let Some((pattern2_0, pattern2_1)) = C::multi_lane(ctx, pattern0_0) { - if pattern2_0 == 16i128 as u32 { - if pattern2_1 == 8i128 as u32 { - let pattern5_0 = arg1; - let pattern6_0 = arg2; - let pattern7_0 = arg3; - let pattern8_0 = arg4; - // Rule at src/isa/s390x/lower.isle line 2715. - let expr0_0 = - constructor_lower_address(ctx, pattern6_0, pattern7_0, pattern8_0); - let expr1_0 = constructor_vec_store_byte16rev(ctx, pattern5_0, &expr0_0); - return expr1_0; - } - } - if pattern2_0 == 32i128 as u32 { - if pattern2_1 == 4i128 as u32 { - let pattern5_0 = arg1; - let pattern6_0 = arg2; - let pattern7_0 = arg3; - let pattern8_0 = arg4; - // Rule at src/isa/s390x/lower.isle line 2712. - let expr0_0 = - constructor_lower_address(ctx, pattern6_0, pattern7_0, pattern8_0); - let expr1_0 = constructor_vec_store_byte32rev(ctx, pattern5_0, &expr0_0); - return expr1_0; - } - } - if pattern2_0 == 64i128 as u32 { - if pattern2_1 == 2i128 as u32 { - let pattern5_0 = arg1; - let pattern6_0 = arg2; - let pattern7_0 = arg3; - let pattern8_0 = arg4; - // Rule at src/isa/s390x/lower.isle line 2709. - let expr0_0 = - constructor_lower_address(ctx, pattern6_0, pattern7_0, pattern8_0); - let expr1_0 = constructor_vec_store_byte64rev(ctx, pattern5_0, &expr0_0); - return expr1_0; - } - } - } - } - let pattern0_0 = arg0; - if let Some(()) = C::vxrs_ext2_disabled(ctx, pattern0_0) { - if let Some((pattern2_0, pattern2_1)) = C::multi_lane(ctx, pattern0_0) { - if pattern2_0 == 16i128 as u32 { - if pattern2_1 == 8i128 as u32 { - let pattern5_0 = arg1; - let pattern6_0 = arg2; - let pattern7_0 = arg3; - let pattern8_0 = arg4; - // Rule at src/isa/s390x/lower.isle line 2726. - let expr0_0 = constructor_vec_elt_rev(ctx, pattern0_0, pattern5_0); - let expr1_0 = constructor_vec_store_full_rev( - ctx, pattern0_0, expr0_0, pattern6_0, pattern7_0, pattern8_0, - ); - return expr1_0; - } - } - if pattern2_0 == 32i128 as u32 { - if pattern2_1 == 4i128 as u32 { - let pattern5_0 = arg1; - let pattern6_0 = arg2; - let pattern7_0 = arg3; - let pattern8_0 = arg4; - // Rule at src/isa/s390x/lower.isle line 2723. - let expr0_0 = constructor_vec_elt_rev(ctx, pattern0_0, pattern5_0); - let expr1_0 = constructor_vec_store_full_rev( - ctx, pattern0_0, expr0_0, pattern6_0, pattern7_0, pattern8_0, - ); - return expr1_0; - } - } - if pattern2_0 == 64i128 as u32 { - if pattern2_1 == 2i128 as u32 { - let pattern5_0 = arg1; - let pattern6_0 = arg2; - let pattern7_0 = arg3; - let pattern8_0 = arg4; - // Rule at src/isa/s390x/lower.isle line 2720. - let expr0_0 = constructor_vec_elt_rev(ctx, pattern0_0, pattern5_0); - let expr1_0 = constructor_vec_store_full_rev( - ctx, pattern0_0, expr0_0, pattern6_0, pattern7_0, pattern8_0, - ); - return expr1_0; - } - } - } - } - if let Some((pattern1_0, pattern1_1)) = C::multi_lane(ctx, pattern0_0) { - if pattern1_0 == 8i128 as u32 { - if pattern1_1 == 16i128 as u32 { - let pattern4_0 = arg1; - let pattern5_0 = arg2; - let pattern6_0 = arg3; - let pattern7_0 = arg4; - // Rule at src/isa/s390x/lower.isle line 2705. - let expr0_0 = constructor_lower_address(ctx, pattern5_0, pattern6_0, pattern7_0); - let expr1_0 = constructor_vec_store(ctx, pattern4_0, &expr0_0); - return expr1_0; - } - } - } - let pattern0_0 = arg0; - if pattern0_0 == I128 { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - let pattern4_0 = arg3; - let pattern5_0 = arg4; - // Rule at src/isa/s390x/lower.isle line 2701. - let expr0_0: Type = I128; - let expr1_0 = constructor_vec_store_full_rev( - ctx, expr0_0, pattern2_0, pattern3_0, pattern4_0, pattern5_0, - ); - return expr1_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "vec_store_byte_rev", "src/isa/s390x/lower.isle line 2698" - ); -} - -// Generated as internal constructor for term vec_store_elt_rev. -pub fn constructor_vec_store_elt_rev( - ctx: &mut C, - arg0: Type, - arg1: Reg, - arg2: MemFlags, - arg3: Value, - arg4: Offset32, -) -> SideEffectNoResult { - let pattern0_0 = arg0; - if let Some(()) = C::vxrs_ext2_enabled(ctx, pattern0_0) { - if let Some((pattern2_0, pattern2_1)) = C::multi_lane(ctx, pattern0_0) { - if pattern2_0 == 16i128 as u32 { - if pattern2_1 == 8i128 as u32 { - let pattern5_0 = arg1; - let pattern6_0 = arg2; - let pattern7_0 = arg3; - let pattern8_0 = arg4; - // Rule at src/isa/s390x/lower.isle line 2749. - let expr0_0 = - constructor_lower_address(ctx, pattern6_0, pattern7_0, pattern8_0); - let expr1_0 = constructor_vec_store_elt16rev(ctx, pattern5_0, &expr0_0); - return expr1_0; - } - } - if pattern2_0 == 32i128 as u32 { - if pattern2_1 == 4i128 as u32 { - let pattern5_0 = arg1; - let pattern6_0 = arg2; - let pattern7_0 = arg3; - let pattern8_0 = arg4; - // Rule at src/isa/s390x/lower.isle line 2746. - let expr0_0 = - constructor_lower_address(ctx, pattern6_0, pattern7_0, pattern8_0); - let expr1_0 = constructor_vec_store_elt32rev(ctx, pattern5_0, &expr0_0); - return expr1_0; - } - } - if pattern2_0 == 64i128 as u32 { - if pattern2_1 == 2i128 as u32 { - let pattern5_0 = arg1; - let pattern6_0 = arg2; - let pattern7_0 = arg3; - let pattern8_0 = arg4; - // Rule at src/isa/s390x/lower.isle line 2743. - let expr0_0 = - constructor_lower_address(ctx, pattern6_0, pattern7_0, pattern8_0); - let expr1_0 = constructor_vec_store_elt64rev(ctx, pattern5_0, &expr0_0); - return expr1_0; - } - } - } - } - let pattern0_0 = arg0; - if let Some(()) = C::vxrs_ext2_disabled(ctx, pattern0_0) { - if let Some((pattern2_0, pattern2_1)) = C::multi_lane(ctx, pattern0_0) { - if pattern2_0 == 16i128 as u32 { - if pattern2_1 == 8i128 as u32 { - let pattern5_0 = arg1; - let pattern6_0 = arg2; - let pattern7_0 = arg3; - let pattern8_0 = arg4; - // Rule at src/isa/s390x/lower.isle line 2760. - let expr0_0 = constructor_vec_elt_rev(ctx, pattern0_0, pattern5_0); - let expr1_0 = - constructor_lower_address(ctx, pattern6_0, pattern7_0, pattern8_0); - let expr2_0 = constructor_vec_store(ctx, expr0_0, &expr1_0); - return expr2_0; - } - } - if pattern2_0 == 32i128 as u32 { - if pattern2_1 == 4i128 as u32 { - let pattern5_0 = arg1; - let pattern6_0 = arg2; - let pattern7_0 = arg3; - let pattern8_0 = arg4; - // Rule at src/isa/s390x/lower.isle line 2757. - let expr0_0 = constructor_vec_elt_rev(ctx, pattern0_0, pattern5_0); - let expr1_0 = - constructor_lower_address(ctx, pattern6_0, pattern7_0, pattern8_0); - let expr2_0 = constructor_vec_store(ctx, expr0_0, &expr1_0); - return expr2_0; - } - } - if pattern2_0 == 64i128 as u32 { - if pattern2_1 == 2i128 as u32 { - let pattern5_0 = arg1; - let pattern6_0 = arg2; - let pattern7_0 = arg3; - let pattern8_0 = arg4; - // Rule at src/isa/s390x/lower.isle line 2754. - let expr0_0 = constructor_vec_elt_rev(ctx, pattern0_0, pattern5_0); - let expr1_0 = - constructor_lower_address(ctx, pattern6_0, pattern7_0, pattern8_0); - let expr2_0 = constructor_vec_store(ctx, expr0_0, &expr1_0); - return expr2_0; - } - } - } - } - if let Some((pattern1_0, pattern1_1)) = C::multi_lane(ctx, pattern0_0) { - if pattern1_0 == 8i128 as u32 { - if pattern1_1 == 16i128 as u32 { - let pattern4_0 = arg1; - let pattern5_0 = arg2; - let pattern6_0 = arg3; - let pattern7_0 = arg4; - // Rule at src/isa/s390x/lower.isle line 2739. - let expr0_0 = constructor_vec_store_full_rev( - ctx, pattern0_0, pattern4_0, pattern5_0, pattern6_0, pattern7_0, - ); - return expr0_0; - } - } - } - let pattern0_0 = arg0; - if pattern0_0 == I128 { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - let pattern4_0 = arg3; - let pattern5_0 = arg4; - // Rule at src/isa/s390x/lower.isle line 2735. - let expr0_0 = constructor_lower_address(ctx, pattern3_0, pattern4_0, pattern5_0); - let expr1_0 = constructor_vec_store(ctx, pattern2_0, &expr0_0); - return expr1_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "vec_store_elt_rev", "src/isa/s390x/lower.isle line 2732" - ); -} - -// Generated as internal constructor for term istore8_impl. -pub fn constructor_istore8_impl( - ctx: &mut C, - arg0: MemFlags, - arg1: Value, - arg2: Value, - arg3: Offset32, -) -> SideEffectNoResult { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - if let Some(pattern2_0) = C::u8_from_value(ctx, pattern1_0) { - let pattern3_0 = arg2; - let pattern4_0 = arg3; - // Rule at src/isa/s390x/lower.isle line 2779. - let expr0_0 = constructor_lower_address(ctx, pattern0_0, pattern3_0, pattern4_0); - let expr1_0 = constructor_store8_imm(ctx, pattern2_0, &expr0_0); - return expr1_0; - } - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - // Rule at src/isa/s390x/lower.isle line 2775. - let expr0_0 = C::put_in_reg(ctx, pattern1_0); - let expr1_0 = constructor_lower_address(ctx, pattern0_0, pattern2_0, pattern3_0); - let expr2_0 = constructor_store8(ctx, expr0_0, &expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term istore16_impl. -pub fn constructor_istore16_impl( - ctx: &mut C, - arg0: MemFlags, - arg1: Value, - arg2: Value, - arg3: Offset32, -) -> SideEffectNoResult { - let pattern0_0 = arg0; - if let Some(()) = C::bigendian(ctx, pattern0_0) { - let pattern2_0 = arg1; - if let Some(pattern3_0) = C::i16_from_value(ctx, pattern2_0) { - let pattern4_0 = arg2; - let pattern5_0 = arg3; - // Rule at src/isa/s390x/lower.isle line 2801. - let expr0_0 = constructor_lower_address(ctx, pattern0_0, pattern4_0, pattern5_0); - let expr1_0 = constructor_store16_imm(ctx, pattern3_0, &expr0_0); - return expr1_0; - } - } - let pattern0_0 = arg0; - if let Some(()) = C::bigendian(ctx, pattern0_0) { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - let pattern4_0 = arg3; - // Rule at src/isa/s390x/lower.isle line 2793. - let expr0_0 = C::put_in_reg(ctx, pattern2_0); - let expr1_0 = constructor_lower_address(ctx, pattern0_0, pattern3_0, pattern4_0); - let expr2_0 = constructor_store16(ctx, expr0_0, &expr1_0); - return expr2_0; - } - let pattern0_0 = arg0; - if let Some(()) = C::littleendian(ctx, pattern0_0) { - let pattern2_0 = arg1; - if let Some(pattern3_0) = C::i16_from_swapped_value(ctx, pattern2_0) { - let pattern4_0 = arg2; - let pattern5_0 = arg3; - // Rule at src/isa/s390x/lower.isle line 2805. - let expr0_0 = constructor_lower_address(ctx, pattern0_0, pattern4_0, pattern5_0); - let expr1_0 = constructor_store16_imm(ctx, pattern3_0, &expr0_0); - return expr1_0; - } - } - let pattern0_0 = arg0; - if let Some(()) = C::littleendian(ctx, pattern0_0) { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - let pattern4_0 = arg3; - // Rule at src/isa/s390x/lower.isle line 2797. - let expr0_0 = C::put_in_reg(ctx, pattern2_0); - let expr1_0 = constructor_lower_address(ctx, pattern0_0, pattern3_0, pattern4_0); - let expr2_0 = constructor_storerev16(ctx, expr0_0, &expr1_0); - return expr2_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "istore16_impl", "src/isa/s390x/lower.isle line 2790" - ); -} - -// Generated as internal constructor for term istore32_impl. -pub fn constructor_istore32_impl( - ctx: &mut C, - arg0: MemFlags, - arg1: Value, - arg2: Value, - arg3: Offset32, -) -> SideEffectNoResult { - let pattern0_0 = arg0; - if let Some(()) = C::bigendian(ctx, pattern0_0) { - let pattern2_0 = arg1; - if let Some(pattern3_0) = C::i16_from_value(ctx, pattern2_0) { - let pattern4_0 = arg2; - let pattern5_0 = arg3; - // Rule at src/isa/s390x/lower.isle line 2823. - let expr0_0 = constructor_lower_address(ctx, pattern0_0, pattern4_0, pattern5_0); - let expr1_0 = constructor_store32_simm16(ctx, pattern3_0, &expr0_0); - return expr1_0; - } - } - let pattern0_0 = arg0; - if let Some(()) = C::bigendian(ctx, pattern0_0) { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - let pattern4_0 = arg3; - // Rule at src/isa/s390x/lower.isle line 2819. - let expr0_0 = C::put_in_reg(ctx, pattern2_0); - let expr1_0 = constructor_lower_address(ctx, pattern0_0, pattern3_0, pattern4_0); - let expr2_0 = constructor_store32(ctx, expr0_0, &expr1_0); - return expr2_0; - } - let pattern0_0 = arg0; - if let Some(()) = C::littleendian(ctx, pattern0_0) { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - let pattern4_0 = arg3; - // Rule at src/isa/s390x/lower.isle line 2827. - let expr0_0 = C::put_in_reg(ctx, pattern2_0); - let expr1_0 = constructor_lower_address(ctx, pattern0_0, pattern3_0, pattern4_0); - let expr2_0 = constructor_storerev32(ctx, expr0_0, &expr1_0); - return expr2_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "istore32_impl", "src/isa/s390x/lower.isle line 2816" - ); -} - -// Generated as internal constructor for term istore64_impl. -pub fn constructor_istore64_impl( - ctx: &mut C, - arg0: MemFlags, - arg1: Value, - arg2: Value, - arg3: Offset32, -) -> SideEffectNoResult { - let pattern0_0 = arg0; - if let Some(()) = C::bigendian(ctx, pattern0_0) { - let pattern2_0 = arg1; - if let Some(pattern3_0) = C::i16_from_value(ctx, pattern2_0) { - let pattern4_0 = arg2; - let pattern5_0 = arg3; - // Rule at src/isa/s390x/lower.isle line 2841. - let expr0_0 = constructor_lower_address(ctx, pattern0_0, pattern4_0, pattern5_0); - let expr1_0 = constructor_store64_simm16(ctx, pattern3_0, &expr0_0); - return expr1_0; - } - } - let pattern0_0 = arg0; - if let Some(()) = C::bigendian(ctx, pattern0_0) { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - let pattern4_0 = arg3; - // Rule at src/isa/s390x/lower.isle line 2837. - let expr0_0 = C::put_in_reg(ctx, pattern2_0); - let expr1_0 = constructor_lower_address(ctx, pattern0_0, pattern3_0, pattern4_0); - let expr2_0 = constructor_store64(ctx, expr0_0, &expr1_0); - return expr2_0; - } - let pattern0_0 = arg0; - if let Some(()) = C::littleendian(ctx, pattern0_0) { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - let pattern4_0 = arg3; - // Rule at src/isa/s390x/lower.isle line 2845. - let expr0_0 = C::put_in_reg(ctx, pattern2_0); - let expr1_0 = constructor_lower_address(ctx, pattern0_0, pattern3_0, pattern4_0); - let expr2_0 = constructor_storerev64(ctx, expr0_0, &expr1_0); - return expr2_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "istore64_impl", "src/isa/s390x/lower.isle line 2834" - ); -} - -// Generated as internal constructor for term atomic_rmw_body. -pub fn constructor_atomic_rmw_body( - ctx: &mut C, - arg0: &VecMInstBuilder, - arg1: Type, - arg2: MemFlags, - arg3: &AtomicRmwOp, - arg4: WritableReg, - arg5: Reg, - arg6: Reg, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - if let Some(()) = C::mie2_enabled(ctx, pattern1_0) { - if let Some(pattern3_0) = C::ty_32_or_64(ctx, pattern1_0) { - let pattern4_0 = arg2; - if let Some(()) = C::bigendian(ctx, pattern4_0) { - let pattern6_0 = arg3; - if let &AtomicRmwOp::Nand = pattern6_0 { - let pattern8_0 = arg4; - let pattern9_0 = arg5; - let pattern10_0 = arg6; - // Rule at src/isa/s390x/lower.isle line 2950. - let expr0_0 = constructor_aluop_not_and(ctx, pattern3_0); - let expr1_0 = constructor_push_alu_reg( - ctx, - pattern0_0, - &expr0_0, - pattern8_0, - pattern9_0, - pattern10_0, - ); - return expr1_0; - } - } - } - } - let pattern0_0 = arg0; - let pattern1_0 = arg1; - if let Some(()) = C::mie2_enabled(ctx, pattern1_0) { - if let Some(pattern3_0) = C::ty_32_or_64(ctx, pattern1_0) { - let pattern4_0 = arg2; - if let Some(()) = C::littleendian(ctx, pattern4_0) { - let pattern6_0 = arg3; - if let &AtomicRmwOp::Nand = pattern6_0 { - let pattern8_0 = arg4; - let pattern9_0 = arg5; - let pattern10_0 = arg6; - // Rule at src/isa/s390x/lower.isle line 2953. - let expr0_0 = constructor_aluop_not_and(ctx, pattern3_0); - let expr1_0 = constructor_bswap_reg(ctx, pattern3_0, pattern10_0); - let expr2_0 = constructor_push_alu_reg( - ctx, pattern0_0, &expr0_0, pattern8_0, pattern9_0, expr1_0, - ); - return expr2_0; - } - } - } - } - let pattern0_0 = arg0; - let pattern1_0 = arg1; - if let Some(()) = C::mie2_disabled(ctx, pattern1_0) { - if let Some(pattern3_0) = C::ty_32_or_64(ctx, pattern1_0) { - let pattern4_0 = arg2; - if let Some(()) = C::bigendian(ctx, pattern4_0) { - let pattern6_0 = arg3; - if let &AtomicRmwOp::Nand = pattern6_0 { - let pattern8_0 = arg4; - let pattern9_0 = arg5; - let pattern10_0 = arg6; - // Rule at src/isa/s390x/lower.isle line 2956. - let expr0_0 = constructor_aluop_and(ctx, pattern3_0); - let expr1_0 = constructor_push_alu_reg( - ctx, - pattern0_0, - &expr0_0, - pattern8_0, - pattern9_0, - pattern10_0, - ); - let expr2_0 = - constructor_push_not_reg(ctx, pattern0_0, pattern3_0, pattern8_0, expr1_0); - return expr2_0; - } - } - } - } - if let Some(pattern2_0) = C::ty_32_or_64(ctx, pattern1_0) { - let pattern3_0 = arg2; - if let Some(()) = C::bigendian(ctx, pattern3_0) { - let pattern5_0 = arg3; - if let &AtomicRmwOp::Xchg = pattern5_0 { - let pattern7_0 = arg4; - let pattern8_0 = arg5; - let pattern9_0 = arg6; - // Rule at src/isa/s390x/lower.isle line 2939. - return pattern9_0; - } - } - } - let pattern0_0 = arg0; - let pattern1_0 = arg1; - if let Some(()) = C::mie2_disabled(ctx, pattern1_0) { - if let Some(pattern3_0) = C::ty_32_or_64(ctx, pattern1_0) { - let pattern4_0 = arg2; - if let Some(()) = C::littleendian(ctx, pattern4_0) { - let pattern6_0 = arg3; - if let &AtomicRmwOp::Nand = pattern6_0 { - let pattern8_0 = arg4; - let pattern9_0 = arg5; - let pattern10_0 = arg6; - // Rule at src/isa/s390x/lower.isle line 2960. - let expr0_0 = constructor_aluop_and(ctx, pattern3_0); - let expr1_0 = constructor_bswap_reg(ctx, pattern3_0, pattern10_0); - let expr2_0 = constructor_push_alu_reg( - ctx, pattern0_0, &expr0_0, pattern8_0, pattern9_0, expr1_0, - ); - let expr3_0 = - constructor_push_not_reg(ctx, pattern0_0, pattern3_0, pattern8_0, expr2_0); - return expr3_0; - } - } - } - } - if let Some(pattern2_0) = C::ty_32_or_64(ctx, pattern1_0) { - let pattern3_0 = arg2; - if let Some(()) = C::littleendian(ctx, pattern3_0) { - let pattern5_0 = arg3; - if let &AtomicRmwOp::Xchg = pattern5_0 { - let pattern7_0 = arg4; - let pattern8_0 = arg5; - let pattern9_0 = arg6; - // Rule at src/isa/s390x/lower.isle line 2942. - let expr0_0 = constructor_bswap_reg(ctx, pattern2_0, pattern9_0); - return expr0_0; - } - } - } - let pattern0_0 = arg0; - let pattern1_0 = arg1; - if let Some(pattern2_0) = C::ty_8_or_16(ctx, pattern1_0) { - let pattern3_0 = arg2; - let pattern4_0 = arg3; - match pattern4_0 { - &AtomicRmwOp::And => { - let pattern6_0 = arg4; - let pattern7_0 = arg5; - let pattern8_0 = arg6; - // Rule at src/isa/s390x/lower.isle line 2970. - let expr0_0 = RxSBGOp::And; - let expr1_0 = constructor_atomic_rmw_body_rxsbg( - ctx, pattern0_0, pattern2_0, pattern3_0, &expr0_0, pattern6_0, pattern7_0, - pattern8_0, - ); - return expr1_0; - } - &AtomicRmwOp::Nand => { - let pattern6_0 = arg4; - let pattern7_0 = arg5; - let pattern8_0 = arg6; - // Rule at src/isa/s390x/lower.isle line 2976. - let expr0_0 = RxSBGOp::And; - let expr1_0 = constructor_atomic_rmw_body_rxsbg( - ctx, pattern0_0, pattern2_0, pattern3_0, &expr0_0, pattern6_0, pattern7_0, - pattern8_0, - ); - let expr2_0 = constructor_atomic_rmw_body_invert( - ctx, pattern0_0, pattern2_0, pattern3_0, pattern6_0, expr1_0, - ); - return expr2_0; - } - &AtomicRmwOp::Or => { - let pattern6_0 = arg4; - let pattern7_0 = arg5; - let pattern8_0 = arg6; - // Rule at src/isa/s390x/lower.isle line 2972. - let expr0_0 = RxSBGOp::Or; - let expr1_0 = constructor_atomic_rmw_body_rxsbg( - ctx, pattern0_0, pattern2_0, pattern3_0, &expr0_0, pattern6_0, pattern7_0, - pattern8_0, - ); - return expr1_0; - } - &AtomicRmwOp::Xchg => { - let pattern6_0 = arg4; - let pattern7_0 = arg5; - let pattern8_0 = arg6; - // Rule at src/isa/s390x/lower.isle line 2968. - let expr0_0 = RxSBGOp::Insert; - let expr1_0 = constructor_atomic_rmw_body_rxsbg( - ctx, pattern0_0, pattern2_0, pattern3_0, &expr0_0, pattern6_0, pattern7_0, - pattern8_0, - ); - return expr1_0; - } - &AtomicRmwOp::Xor => { - let pattern6_0 = arg4; - let pattern7_0 = arg5; - let pattern8_0 = arg6; - // Rule at src/isa/s390x/lower.isle line 2974. - let expr0_0 = RxSBGOp::Xor; - let expr1_0 = constructor_atomic_rmw_body_rxsbg( - ctx, pattern0_0, pattern2_0, pattern3_0, &expr0_0, pattern6_0, pattern7_0, - pattern8_0, - ); - return expr1_0; - } - _ => {} - } - } - let pattern2_0 = arg2; - let pattern3_0 = arg3; - match pattern3_0 { - &AtomicRmwOp::Add => { - let pattern5_0 = arg4; - let pattern6_0 = arg5; - let pattern7_0 = arg6; - // Rule at src/isa/s390x/lower.isle line 3008. - let expr0_0 = constructor_ty_ext32(ctx, pattern1_0); - let expr1_0 = constructor_aluop_add(ctx, expr0_0); - let expr2_0 = constructor_atomic_rmw_body_addsub( - ctx, pattern0_0, pattern1_0, pattern2_0, &expr1_0, pattern5_0, pattern6_0, - pattern7_0, - ); - return expr2_0; - } - &AtomicRmwOp::Smax => { - let pattern5_0 = arg4; - let pattern6_0 = arg5; - let pattern7_0 = arg6; - // Rule at src/isa/s390x/lower.isle line 3049. - let expr0_0 = constructor_ty_ext32(ctx, pattern1_0); - let expr1_0 = constructor_cmpop_cmps(ctx, expr0_0); - let expr2_0 = IntCC::SignedGreaterThan; - let expr3_0 = C::intcc_as_cond(ctx, &expr2_0); - let expr4_0 = constructor_atomic_rmw_body_minmax( - ctx, pattern0_0, pattern1_0, pattern2_0, &expr1_0, &expr3_0, pattern5_0, - pattern6_0, pattern7_0, - ); - return expr4_0; - } - &AtomicRmwOp::Smin => { - let pattern5_0 = arg4; - let pattern6_0 = arg5; - let pattern7_0 = arg6; - // Rule at src/isa/s390x/lower.isle line 3046. - let expr0_0 = constructor_ty_ext32(ctx, pattern1_0); - let expr1_0 = constructor_cmpop_cmps(ctx, expr0_0); - let expr2_0 = IntCC::SignedLessThan; - let expr3_0 = C::intcc_as_cond(ctx, &expr2_0); - let expr4_0 = constructor_atomic_rmw_body_minmax( - ctx, pattern0_0, pattern1_0, pattern2_0, &expr1_0, &expr3_0, pattern5_0, - pattern6_0, pattern7_0, - ); - return expr4_0; - } - &AtomicRmwOp::Sub => { - let pattern5_0 = arg4; - let pattern6_0 = arg5; - let pattern7_0 = arg6; - // Rule at src/isa/s390x/lower.isle line 3010. - let expr0_0 = constructor_ty_ext32(ctx, pattern1_0); - let expr1_0 = constructor_aluop_sub(ctx, expr0_0); - let expr2_0 = constructor_atomic_rmw_body_addsub( - ctx, pattern0_0, pattern1_0, pattern2_0, &expr1_0, pattern5_0, pattern6_0, - pattern7_0, - ); - return expr2_0; - } - &AtomicRmwOp::Umax => { - let pattern5_0 = arg4; - let pattern6_0 = arg5; - let pattern7_0 = arg6; - // Rule at src/isa/s390x/lower.isle line 3055. - let expr0_0 = constructor_ty_ext32(ctx, pattern1_0); - let expr1_0 = constructor_cmpop_cmpu(ctx, expr0_0); - let expr2_0 = IntCC::UnsignedGreaterThan; - let expr3_0 = C::intcc_as_cond(ctx, &expr2_0); - let expr4_0 = constructor_atomic_rmw_body_minmax( - ctx, pattern0_0, pattern1_0, pattern2_0, &expr1_0, &expr3_0, pattern5_0, - pattern6_0, pattern7_0, - ); - return expr4_0; - } - &AtomicRmwOp::Umin => { - let pattern5_0 = arg4; - let pattern6_0 = arg5; - let pattern7_0 = arg6; - // Rule at src/isa/s390x/lower.isle line 3052. - let expr0_0 = constructor_ty_ext32(ctx, pattern1_0); - let expr1_0 = constructor_cmpop_cmpu(ctx, expr0_0); - let expr2_0 = IntCC::UnsignedLessThan; - let expr3_0 = C::intcc_as_cond(ctx, &expr2_0); - let expr4_0 = constructor_atomic_rmw_body_minmax( - ctx, pattern0_0, pattern1_0, pattern2_0, &expr1_0, &expr3_0, pattern5_0, - pattern6_0, pattern7_0, - ); - return expr4_0; - } - _ => {} - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "atomic_rmw_body", "src/isa/s390x/lower.isle line 2934" - ); -} - -// Generated as internal constructor for term atomic_rmw_body_rxsbg. -pub fn constructor_atomic_rmw_body_rxsbg( - ctx: &mut C, - arg0: &VecMInstBuilder, - arg1: Type, - arg2: MemFlags, - arg3: &RxSBGOp, - arg4: WritableReg, - arg5: Reg, - arg6: Reg, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - if pattern1_0 == I16 { - let pattern3_0 = arg2; - if let Some(()) = C::bigendian(ctx, pattern3_0) { - let pattern5_0 = arg3; - let pattern6_0 = arg4; - let pattern7_0 = arg5; - let pattern8_0 = arg6; - // Rule at src/isa/s390x/lower.isle line 2988. - let expr0_0: u8 = 32i128 as u8; - let expr1_0: u8 = 48i128 as u8; - let expr2_0: i8 = 16i128 as i8; - let expr3_0 = constructor_push_rxsbg( - ctx, pattern0_0, pattern5_0, pattern6_0, pattern7_0, pattern8_0, expr0_0, expr1_0, - expr2_0, - ); - return expr3_0; - } - } - let pattern0_0 = arg0; - let pattern1_0 = arg1; - if pattern1_0 == I8 { - let pattern3_0 = arg2; - let pattern4_0 = arg3; - let pattern5_0 = arg4; - let pattern6_0 = arg5; - let pattern7_0 = arg6; - // Rule at src/isa/s390x/lower.isle line 2984. - let expr0_0: u8 = 32i128 as u8; - let expr1_0: u8 = 40i128 as u8; - let expr2_0: i8 = 24i128 as i8; - let expr3_0 = constructor_push_rxsbg( - ctx, pattern0_0, pattern4_0, pattern5_0, pattern6_0, pattern7_0, expr0_0, expr1_0, - expr2_0, - ); - return expr3_0; - } - if pattern1_0 == I16 { - let pattern3_0 = arg2; - if let Some(()) = C::littleendian(ctx, pattern3_0) { - let pattern5_0 = arg3; - let pattern6_0 = arg4; - let pattern7_0 = arg5; - let pattern8_0 = arg6; - // Rule at src/isa/s390x/lower.isle line 2992. - let expr0_0: Type = I32; - let expr1_0 = constructor_bswap_reg(ctx, expr0_0, pattern8_0); - let expr2_0: u8 = 48i128 as u8; - let expr3_0: u8 = 64i128 as u8; - let expr4_0: i8 = -16i128 as i8; - let expr5_0 = constructor_push_rxsbg( - ctx, pattern0_0, pattern5_0, pattern6_0, pattern7_0, expr1_0, expr2_0, expr3_0, - expr4_0, - ); - return expr5_0; - } - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "atomic_rmw_body_rxsbg", "src/isa/s390x/lower.isle line 2981" - ); -} - -// Generated as internal constructor for term atomic_rmw_body_invert. -pub fn constructor_atomic_rmw_body_invert( - ctx: &mut C, - arg0: &VecMInstBuilder, - arg1: Type, - arg2: MemFlags, - arg3: WritableReg, - arg4: Reg, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - if pattern1_0 == I16 { - let pattern3_0 = arg2; - if let Some(()) = C::bigendian(ctx, pattern3_0) { - let pattern5_0 = arg3; - let pattern6_0 = arg4; - // Rule at src/isa/s390x/lower.isle line 3001. - let expr0_0: Type = I32; - let expr1_0: u32 = 4294901760i128 as u32; - let expr2_0: u8 = 0i128 as u8; - let expr3_0 = C::uimm32shifted(ctx, expr1_0, expr2_0); - let expr4_0 = constructor_push_xor_uimm32shifted( - ctx, pattern0_0, expr0_0, pattern5_0, pattern6_0, expr3_0, - ); - return expr4_0; - } - } - let pattern0_0 = arg0; - let pattern1_0 = arg1; - if pattern1_0 == I8 { - let pattern3_0 = arg2; - let pattern4_0 = arg3; - let pattern5_0 = arg4; - // Rule at src/isa/s390x/lower.isle line 2998. - let expr0_0: Type = I32; - let expr1_0: u32 = 4278190080i128 as u32; - let expr2_0: u8 = 0i128 as u8; - let expr3_0 = C::uimm32shifted(ctx, expr1_0, expr2_0); - let expr4_0 = constructor_push_xor_uimm32shifted( - ctx, pattern0_0, expr0_0, pattern4_0, pattern5_0, expr3_0, - ); - return expr4_0; - } - if pattern1_0 == I16 { - let pattern3_0 = arg2; - if let Some(()) = C::littleendian(ctx, pattern3_0) { - let pattern5_0 = arg3; - let pattern6_0 = arg4; - // Rule at src/isa/s390x/lower.isle line 3004. - let expr0_0: Type = I32; - let expr1_0: u32 = 65535i128 as u32; - let expr2_0: u8 = 0i128 as u8; - let expr3_0 = C::uimm32shifted(ctx, expr1_0, expr2_0); - let expr4_0 = constructor_push_xor_uimm32shifted( - ctx, pattern0_0, expr0_0, pattern5_0, pattern6_0, expr3_0, - ); - return expr4_0; - } - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "atomic_rmw_body_invert", "src/isa/s390x/lower.isle line 2996" - ); -} - -// Generated as internal constructor for term atomic_rmw_body_addsub. -pub fn constructor_atomic_rmw_body_addsub( - ctx: &mut C, - arg0: &VecMInstBuilder, - arg1: Type, - arg2: MemFlags, - arg3: &ALUOp, - arg4: WritableReg, - arg5: Reg, - arg6: Reg, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - if pattern1_0 == I16 { - let pattern3_0 = arg2; - if let Some(()) = C::bigendian(ctx, pattern3_0) { - let pattern5_0 = arg3; - let pattern6_0 = arg4; - let pattern7_0 = arg5; - let pattern8_0 = arg6; - // Rule at src/isa/s390x/lower.isle line 3031. - let expr0_0: Type = I32; - let expr1_0: u8 = 16i128 as u8; - let expr2_0 = constructor_lshl_imm(ctx, expr0_0, pattern8_0, expr1_0); - let expr3_0 = constructor_push_alu_reg( - ctx, pattern0_0, pattern5_0, pattern6_0, pattern7_0, expr2_0, - ); - return expr3_0; - } - } - let pattern0_0 = arg0; - let pattern1_0 = arg1; - if let Some(pattern2_0) = C::ty_32_or_64(ctx, pattern1_0) { - let pattern3_0 = arg2; - if let Some(()) = C::bigendian(ctx, pattern3_0) { - let pattern5_0 = arg3; - let pattern6_0 = arg4; - let pattern7_0 = arg5; - let pattern8_0 = arg6; - // Rule at src/isa/s390x/lower.isle line 3017. - let expr0_0 = constructor_push_alu_reg( - ctx, pattern0_0, pattern5_0, pattern6_0, pattern7_0, pattern8_0, - ); - return expr0_0; - } - } - let pattern0_0 = arg0; - let pattern1_0 = arg1; - if let Some(pattern2_0) = C::ty_32_or_64(ctx, pattern1_0) { - let pattern3_0 = arg2; - if let Some(()) = C::littleendian(ctx, pattern3_0) { - let pattern5_0 = arg3; - let pattern6_0 = arg4; - let pattern7_0 = arg5; - let pattern8_0 = arg6; - // Rule at src/isa/s390x/lower.isle line 3021. - let expr0_0 = - constructor_push_bswap_reg(ctx, pattern0_0, pattern2_0, pattern6_0, pattern7_0); - let expr1_0 = constructor_push_alu_reg( - ctx, pattern0_0, pattern5_0, pattern6_0, expr0_0, pattern8_0, - ); - let expr2_0 = - constructor_push_bswap_reg(ctx, pattern0_0, pattern2_0, pattern6_0, expr1_0); - return expr2_0; - } - } - let pattern0_0 = arg0; - let pattern1_0 = arg1; - if pattern1_0 == I8 { - let pattern3_0 = arg2; - let pattern4_0 = arg3; - let pattern5_0 = arg4; - let pattern6_0 = arg5; - let pattern7_0 = arg6; - // Rule at src/isa/s390x/lower.isle line 3027. - let expr0_0: Type = I32; - let expr1_0: u8 = 24i128 as u8; - let expr2_0 = constructor_lshl_imm(ctx, expr0_0, pattern7_0, expr1_0); - let expr3_0 = - constructor_push_alu_reg(ctx, pattern0_0, pattern4_0, pattern5_0, pattern6_0, expr2_0); - return expr3_0; - } - if pattern1_0 == I16 { - let pattern3_0 = arg2; - if let Some(()) = C::littleendian(ctx, pattern3_0) { - let pattern5_0 = arg3; - let pattern6_0 = arg4; - let pattern7_0 = arg5; - let pattern8_0 = arg6; - // Rule at src/isa/s390x/lower.isle line 3039. - let expr0_0: Type = I32; - let expr1_0: u8 = 16i128 as u8; - let expr2_0 = constructor_lshl_imm(ctx, expr0_0, pattern8_0, expr1_0); - let expr3_0: Type = I32; - let expr4_0 = - constructor_push_bswap_reg(ctx, pattern0_0, expr3_0, pattern6_0, pattern7_0); - let expr5_0 = - constructor_push_alu_reg(ctx, pattern0_0, pattern5_0, pattern6_0, expr4_0, expr2_0); - let expr6_0: Type = I32; - let expr7_0 = constructor_push_bswap_reg(ctx, pattern0_0, expr6_0, pattern6_0, expr5_0); - return expr7_0; - } - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "atomic_rmw_body_addsub", "src/isa/s390x/lower.isle line 3014" - ); -} - -// Generated as internal constructor for term atomic_rmw_body_minmax. -pub fn constructor_atomic_rmw_body_minmax( - ctx: &mut C, - arg0: &VecMInstBuilder, - arg1: Type, - arg2: MemFlags, - arg3: &CmpOp, - arg4: &Cond, - arg5: WritableReg, - arg6: Reg, - arg7: Reg, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - if pattern1_0 == I16 { - let pattern3_0 = arg2; - if let Some(()) = C::bigendian(ctx, pattern3_0) { - let pattern5_0 = arg3; - let pattern6_0 = arg4; - let pattern7_0 = arg5; - let pattern8_0 = arg6; - let pattern9_0 = arg7; - // Rule at src/isa/s390x/lower.isle line 3090. - let expr0_0: Type = I32; - let expr1_0: u8 = 16i128 as u8; - let expr2_0 = constructor_lshl_imm(ctx, expr0_0, pattern9_0, expr1_0); - let expr3_0 = constructor_cmp_rr(ctx, pattern5_0, expr2_0, pattern8_0); - let expr4_0 = C::invert_cond(ctx, pattern6_0); - let expr5_0 = constructor_push_break_if(ctx, pattern0_0, &expr3_0, &expr4_0); - let expr6_0 = RxSBGOp::Insert; - let expr7_0: u8 = 32i128 as u8; - let expr8_0: u8 = 48i128 as u8; - let expr9_0: i8 = 0i128 as i8; - let expr10_0 = constructor_push_rxsbg( - ctx, pattern0_0, &expr6_0, pattern7_0, pattern8_0, expr2_0, expr7_0, expr8_0, - expr9_0, - ); - return expr10_0; - } - } - let pattern0_0 = arg0; - let pattern1_0 = arg1; - if let Some(pattern2_0) = C::ty_32_or_64(ctx, pattern1_0) { - let pattern3_0 = arg2; - if let Some(()) = C::bigendian(ctx, pattern3_0) { - let pattern5_0 = arg3; - let pattern6_0 = arg4; - let pattern7_0 = arg5; - let pattern8_0 = arg6; - let pattern9_0 = arg7; - // Rule at src/isa/s390x/lower.isle line 3065. - let expr0_0 = constructor_cmp_rr(ctx, pattern5_0, pattern9_0, pattern8_0); - let expr1_0 = C::invert_cond(ctx, pattern6_0); - let expr2_0 = constructor_push_break_if(ctx, pattern0_0, &expr0_0, &expr1_0); - return pattern9_0; - } - } - let pattern0_0 = arg0; - let pattern1_0 = arg1; - if let Some(pattern2_0) = C::ty_32_or_64(ctx, pattern1_0) { - let pattern3_0 = arg2; - if let Some(()) = C::littleendian(ctx, pattern3_0) { - let pattern5_0 = arg3; - let pattern6_0 = arg4; - let pattern7_0 = arg5; - let pattern8_0 = arg6; - let pattern9_0 = arg7; - // Rule at src/isa/s390x/lower.isle line 3072. - let expr0_0 = - constructor_push_bswap_reg(ctx, pattern0_0, pattern2_0, pattern7_0, pattern8_0); - let expr1_0 = constructor_cmp_rr(ctx, pattern5_0, pattern9_0, expr0_0); - let expr2_0 = C::invert_cond(ctx, pattern6_0); - let expr3_0 = constructor_push_break_if(ctx, pattern0_0, &expr1_0, &expr2_0); - let expr4_0 = - constructor_push_bswap_reg(ctx, pattern0_0, pattern2_0, pattern7_0, pattern9_0); - return expr4_0; - } - } - let pattern0_0 = arg0; - let pattern1_0 = arg1; - if pattern1_0 == I8 { - let pattern3_0 = arg2; - let pattern4_0 = arg3; - let pattern5_0 = arg4; - let pattern6_0 = arg5; - let pattern7_0 = arg6; - let pattern8_0 = arg7; - // Rule at src/isa/s390x/lower.isle line 3084. - let expr0_0: Type = I32; - let expr1_0: u8 = 24i128 as u8; - let expr2_0 = constructor_lshl_imm(ctx, expr0_0, pattern8_0, expr1_0); - let expr3_0 = constructor_cmp_rr(ctx, pattern4_0, expr2_0, pattern7_0); - let expr4_0 = C::invert_cond(ctx, pattern5_0); - let expr5_0 = constructor_push_break_if(ctx, pattern0_0, &expr3_0, &expr4_0); - let expr6_0 = RxSBGOp::Insert; - let expr7_0: u8 = 32i128 as u8; - let expr8_0: u8 = 40i128 as u8; - let expr9_0: i8 = 0i128 as i8; - let expr10_0 = constructor_push_rxsbg( - ctx, pattern0_0, &expr6_0, pattern6_0, pattern7_0, expr2_0, expr7_0, expr8_0, expr9_0, - ); - return expr10_0; - } - if pattern1_0 == I16 { - let pattern3_0 = arg2; - if let Some(()) = C::littleendian(ctx, pattern3_0) { - let pattern5_0 = arg3; - let pattern6_0 = arg4; - let pattern7_0 = arg5; - let pattern8_0 = arg6; - let pattern9_0 = arg7; - // Rule at src/isa/s390x/lower.isle line 3097. - let expr0_0: Type = I32; - let expr1_0: u8 = 16i128 as u8; - let expr2_0 = constructor_lshl_imm(ctx, expr0_0, pattern9_0, expr1_0); - let expr3_0: Type = I32; - let expr4_0 = - constructor_push_bswap_reg(ctx, pattern0_0, expr3_0, pattern7_0, pattern8_0); - let expr5_0 = constructor_cmp_rr(ctx, pattern5_0, expr2_0, expr4_0); - let expr6_0 = C::invert_cond(ctx, pattern6_0); - let expr7_0 = constructor_push_break_if(ctx, pattern0_0, &expr5_0, &expr6_0); - let expr8_0 = RxSBGOp::Insert; - let expr9_0: u8 = 32i128 as u8; - let expr10_0: u8 = 48i128 as u8; - let expr11_0: i8 = 0i128 as i8; - let expr12_0 = constructor_push_rxsbg( - ctx, pattern0_0, &expr8_0, pattern7_0, expr4_0, expr2_0, expr9_0, expr10_0, - expr11_0, - ); - let expr13_0: Type = I32; - let expr14_0 = - constructor_push_bswap_reg(ctx, pattern0_0, expr13_0, pattern7_0, expr12_0); - return expr14_0; - } - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "atomic_rmw_body_minmax", "src/isa/s390x/lower.isle line 3060" - ); -} - -// Generated as internal constructor for term atomic_cas_body. -pub fn constructor_atomic_cas_body( - ctx: &mut C, - arg0: &VecMInstBuilder, - arg1: Type, - arg2: MemFlags, - arg3: WritableReg, - arg4: Reg, - arg5: Reg, - arg6: Reg, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - if pattern1_0 == I16 { - let pattern3_0 = arg2; - if let Some(()) = C::bigendian(ctx, pattern3_0) { - let pattern5_0 = arg3; - let pattern6_0 = arg4; - let pattern7_0 = arg5; - let pattern8_0 = arg6; - // Rule at src/isa/s390x/lower.isle line 3156. - let expr0_0 = RxSBGOp::Xor; - let expr1_0: u8 = 32i128 as u8; - let expr2_0: u8 = 48i128 as u8; - let expr3_0: i8 = 16i128 as i8; - let expr4_0 = constructor_rxsbg_test( - ctx, &expr0_0, pattern6_0, pattern7_0, expr1_0, expr2_0, expr3_0, - ); - let expr5_0 = IntCC::NotEqual; - let expr6_0 = C::intcc_as_cond(ctx, &expr5_0); - let expr7_0 = constructor_push_break_if(ctx, pattern0_0, &expr4_0, &expr6_0); - let expr8_0 = RxSBGOp::Insert; - let expr9_0: u8 = 32i128 as u8; - let expr10_0: u8 = 48i128 as u8; - let expr11_0: i8 = 16i128 as i8; - let expr12_0 = constructor_push_rxsbg( - ctx, pattern0_0, &expr8_0, pattern5_0, pattern6_0, pattern8_0, expr9_0, expr10_0, - expr11_0, - ); - return expr12_0; - } - } - let pattern0_0 = arg0; - let pattern1_0 = arg1; - if pattern1_0 == I8 { - let pattern3_0 = arg2; - let pattern4_0 = arg3; - let pattern5_0 = arg4; - let pattern6_0 = arg5; - let pattern7_0 = arg6; - // Rule at src/isa/s390x/lower.isle line 3149. - let expr0_0 = RxSBGOp::Xor; - let expr1_0: u8 = 32i128 as u8; - let expr2_0: u8 = 40i128 as u8; - let expr3_0: i8 = 24i128 as i8; - let expr4_0 = constructor_rxsbg_test( - ctx, &expr0_0, pattern5_0, pattern6_0, expr1_0, expr2_0, expr3_0, - ); - let expr5_0 = IntCC::NotEqual; - let expr6_0 = C::intcc_as_cond(ctx, &expr5_0); - let expr7_0 = constructor_push_break_if(ctx, pattern0_0, &expr4_0, &expr6_0); - let expr8_0 = RxSBGOp::Insert; - let expr9_0: u8 = 32i128 as u8; - let expr10_0: u8 = 40i128 as u8; - let expr11_0: i8 = 24i128 as i8; - let expr12_0 = constructor_push_rxsbg( - ctx, pattern0_0, &expr8_0, pattern4_0, pattern5_0, pattern7_0, expr9_0, expr10_0, - expr11_0, - ); - return expr12_0; - } - if pattern1_0 == I16 { - let pattern3_0 = arg2; - if let Some(()) = C::littleendian(ctx, pattern3_0) { - let pattern5_0 = arg3; - let pattern6_0 = arg4; - let pattern7_0 = arg5; - let pattern8_0 = arg6; - // Rule at src/isa/s390x/lower.isle line 3167. - let expr0_0: Type = I32; - let expr1_0 = constructor_bswap_reg(ctx, expr0_0, pattern7_0); - let expr2_0: Type = I32; - let expr3_0 = constructor_bswap_reg(ctx, expr2_0, pattern8_0); - let expr4_0 = RxSBGOp::Xor; - let expr5_0: u8 = 48i128 as u8; - let expr6_0: u8 = 64i128 as u8; - let expr7_0: i8 = -16i128 as i8; - let expr8_0 = constructor_rxsbg_test( - ctx, &expr4_0, pattern6_0, expr1_0, expr5_0, expr6_0, expr7_0, - ); - let expr9_0 = IntCC::NotEqual; - let expr10_0 = C::intcc_as_cond(ctx, &expr9_0); - let expr11_0 = constructor_push_break_if(ctx, pattern0_0, &expr8_0, &expr10_0); - let expr12_0 = RxSBGOp::Insert; - let expr13_0: u8 = 48i128 as u8; - let expr14_0: u8 = 64i128 as u8; - let expr15_0: i8 = -16i128 as i8; - let expr16_0 = constructor_push_rxsbg( - ctx, pattern0_0, &expr12_0, pattern5_0, pattern6_0, expr3_0, expr13_0, expr14_0, - expr15_0, - ); - return expr16_0; - } - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "atomic_cas_body", "src/isa/s390x/lower.isle line 3142" - ); -} - -// Generated as internal constructor for term atomic_store_impl. -pub fn constructor_atomic_store_impl( - ctx: &mut C, - arg0: &SideEffectNoResult, -) -> InstOutput { - let pattern0_0 = arg0; - // Rule at src/isa/s390x/lower.isle line 3213. - let expr0_0 = constructor_side_effect(ctx, pattern0_0); - let expr1_0 = constructor_fence_impl(ctx); - let expr2_0 = constructor_side_effect(ctx, &expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term icmp_val. -pub fn constructor_icmp_val( - ctx: &mut C, - arg0: bool, - arg1: &IntCC, - arg2: Value, - arg3: Value, -) -> ProducesBool { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - match pattern1_0 { - &IntCC::Equal => { - let pattern3_0 = arg2; - let pattern4_0 = C::value_type(ctx, pattern3_0); - if let Some(pattern5_0) = C::vr128_ty(ctx, pattern4_0) { - let pattern6_0 = arg3; - // Rule at src/isa/s390x/lower.isle line 3359. - let expr0_0: Type = I64X2; - let expr1_0 = C::put_in_reg(ctx, pattern3_0); - let expr2_0 = C::put_in_reg(ctx, pattern6_0); - let expr3_0 = constructor_vec_cmpeqs(ctx, expr0_0, expr1_0, expr2_0); - let expr4_0 = FloatCC::Equal; - let expr5_0 = C::floatcc_as_cond(ctx, &expr4_0); - let expr6_0 = constructor_bool(ctx, &expr3_0, &expr5_0); - return expr6_0; - } - } - &IntCC::NotEqual => { - let pattern3_0 = arg2; - let pattern4_0 = C::value_type(ctx, pattern3_0); - if let Some(pattern5_0) = C::vr128_ty(ctx, pattern4_0) { - let pattern6_0 = arg3; - // Rule at src/isa/s390x/lower.isle line 3362. - let expr0_0: Type = I64X2; - let expr1_0 = C::put_in_reg(ctx, pattern3_0); - let expr2_0 = C::put_in_reg(ctx, pattern6_0); - let expr3_0 = constructor_vec_cmpeqs(ctx, expr0_0, expr1_0, expr2_0); - let expr4_0 = FloatCC::NotEqual; - let expr5_0 = C::floatcc_as_cond(ctx, &expr4_0); - let expr6_0 = constructor_bool(ctx, &expr3_0, &expr5_0); - return expr6_0; - } - } - &IntCC::SignedGreaterThan => { - let pattern3_0 = arg2; - let pattern4_0 = C::value_type(ctx, pattern3_0); - if let Some(pattern5_0) = C::vr128_ty(ctx, pattern4_0) { - let pattern6_0 = arg3; - // Rule at src/isa/s390x/lower.isle line 3368. - let expr0_0 = C::put_in_reg(ctx, pattern3_0); - let expr1_0 = C::put_in_reg(ctx, pattern6_0); - let expr2_0 = constructor_vec_int128_scmphi(ctx, expr0_0, expr1_0); - return expr2_0; - } - } - &IntCC::SignedGreaterThanOrEqual => { - let pattern3_0 = arg2; - let pattern4_0 = C::value_type(ctx, pattern3_0); - if let Some(pattern5_0) = C::vr128_ty(ctx, pattern4_0) { - let pattern6_0 = arg3; - // Rule at src/isa/s390x/lower.isle line 3372. - let expr0_0 = C::put_in_reg(ctx, pattern6_0); - let expr1_0 = C::put_in_reg(ctx, pattern3_0); - let expr2_0 = constructor_vec_int128_scmphi(ctx, expr0_0, expr1_0); - let expr3_0 = constructor_invert_bool(ctx, &expr2_0); - return expr3_0; - } - } - &IntCC::SignedLessThan => { - let pattern3_0 = arg2; - let pattern4_0 = C::value_type(ctx, pattern3_0); - if let Some(pattern5_0) = C::vr128_ty(ctx, pattern4_0) { - let pattern6_0 = arg3; - // Rule at src/isa/s390x/lower.isle line 3370. - let expr0_0 = C::put_in_reg(ctx, pattern6_0); - let expr1_0 = C::put_in_reg(ctx, pattern3_0); - let expr2_0 = constructor_vec_int128_scmphi(ctx, expr0_0, expr1_0); - return expr2_0; - } - } - &IntCC::SignedLessThanOrEqual => { - let pattern3_0 = arg2; - let pattern4_0 = C::value_type(ctx, pattern3_0); - if let Some(pattern5_0) = C::vr128_ty(ctx, pattern4_0) { - let pattern6_0 = arg3; - // Rule at src/isa/s390x/lower.isle line 3374. - let expr0_0 = C::put_in_reg(ctx, pattern3_0); - let expr1_0 = C::put_in_reg(ctx, pattern6_0); - let expr2_0 = constructor_vec_int128_scmphi(ctx, expr0_0, expr1_0); - let expr3_0 = constructor_invert_bool(ctx, &expr2_0); - return expr3_0; - } - } - &IntCC::UnsignedGreaterThan => { - let pattern3_0 = arg2; - let pattern4_0 = C::value_type(ctx, pattern3_0); - if let Some(pattern5_0) = C::vr128_ty(ctx, pattern4_0) { - let pattern6_0 = arg3; - // Rule at src/isa/s390x/lower.isle line 3379. - let expr0_0 = C::put_in_reg(ctx, pattern3_0); - let expr1_0 = C::put_in_reg(ctx, pattern6_0); - let expr2_0 = constructor_vec_int128_ucmphi(ctx, expr0_0, expr1_0); - return expr2_0; - } - } - &IntCC::UnsignedGreaterThanOrEqual => { - let pattern3_0 = arg2; - let pattern4_0 = C::value_type(ctx, pattern3_0); - if let Some(pattern5_0) = C::vr128_ty(ctx, pattern4_0) { - let pattern6_0 = arg3; - // Rule at src/isa/s390x/lower.isle line 3383. - let expr0_0 = C::put_in_reg(ctx, pattern6_0); - let expr1_0 = C::put_in_reg(ctx, pattern3_0); - let expr2_0 = constructor_vec_int128_ucmphi(ctx, expr0_0, expr1_0); - let expr3_0 = constructor_invert_bool(ctx, &expr2_0); - return expr3_0; - } - } - &IntCC::UnsignedLessThan => { - let pattern3_0 = arg2; - let pattern4_0 = C::value_type(ctx, pattern3_0); - if let Some(pattern5_0) = C::vr128_ty(ctx, pattern4_0) { - let pattern6_0 = arg3; - // Rule at src/isa/s390x/lower.isle line 3381. - let expr0_0 = C::put_in_reg(ctx, pattern6_0); - let expr1_0 = C::put_in_reg(ctx, pattern3_0); - let expr2_0 = constructor_vec_int128_ucmphi(ctx, expr0_0, expr1_0); - return expr2_0; - } - } - &IntCC::UnsignedLessThanOrEqual => { - let pattern3_0 = arg2; - let pattern4_0 = C::value_type(ctx, pattern3_0); - if let Some(pattern5_0) = C::vr128_ty(ctx, pattern4_0) { - let pattern6_0 = arg3; - // Rule at src/isa/s390x/lower.isle line 3385. - let expr0_0 = C::put_in_reg(ctx, pattern3_0); - let expr1_0 = C::put_in_reg(ctx, pattern6_0); - let expr2_0 = constructor_vec_int128_ucmphi(ctx, expr0_0, expr1_0); - let expr3_0 = constructor_invert_bool(ctx, &expr2_0); - return expr3_0; - } - } - _ => {} - } - let pattern0_0 = arg0; - let pattern1_0 = arg1; - if let Some(()) = C::signed(ctx, pattern1_0) { - let pattern3_0 = arg2; - let pattern4_0 = C::value_type(ctx, pattern3_0); - if let Some(pattern5_0) = C::fits_in_64(ctx, pattern4_0) { - let pattern6_0 = arg3; - // Rule at src/isa/s390x/lower.isle line 3280. - let expr0_0 = constructor_icmps_val(ctx, pattern0_0, pattern3_0, pattern6_0); - let expr1_0 = C::intcc_as_cond(ctx, pattern1_0); - let expr2_0 = constructor_bool(ctx, &expr0_0, &expr1_0); - return expr2_0; - } - } - let pattern0_0 = arg0; - let pattern1_0 = arg1; - if let Some(()) = C::unsigned(ctx, pattern1_0) { - let pattern3_0 = arg2; - let pattern4_0 = C::value_type(ctx, pattern3_0); - if let Some(pattern5_0) = C::fits_in_64(ctx, pattern4_0) { - let pattern6_0 = arg3; - // Rule at src/isa/s390x/lower.isle line 3283. - let expr0_0 = constructor_icmpu_val(ctx, pattern0_0, pattern3_0, pattern6_0); - let expr1_0 = C::intcc_as_cond(ctx, pattern1_0); - let expr2_0 = constructor_bool(ctx, &expr0_0, &expr1_0); - return expr2_0; - } - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "icmp_val", "src/isa/s390x/lower.isle line 3277" - ); -} - -// Generated as internal constructor for term icmps_val. -pub fn constructor_icmps_val( - ctx: &mut C, - arg0: bool, - arg1: Value, - arg2: Value, -) -> ProducesFlags { - let pattern0_0 = arg0; - if pattern0_0 == true { - let pattern2_0 = arg1; - let pattern3_0 = C::value_type(ctx, pattern2_0); - if let Some(pattern4_0) = C::fits_in_64(ctx, pattern3_0) { - let pattern5_0 = arg2; - let pattern6_0 = C::value_type(ctx, pattern5_0); - if pattern6_0 == I16 { - if let Some(pattern8_0) = C::sinkable_inst(ctx, pattern5_0) { - let pattern9_0 = C::inst_data(ctx, pattern8_0); - if let &InstructionData::Load { - opcode: ref pattern10_0, - arg: pattern10_1, - flags: pattern10_2, - offset: pattern10_3, - } = &pattern9_0 - { - if let &Opcode::Load = pattern10_0 { - if let Some(()) = C::bigendian(ctx, pattern10_2) { - // Rule at src/isa/s390x/lower.isle line 3309. - let expr0_0 = constructor_ty_ext32(ctx, pattern4_0); - let expr1_0 = constructor_put_in_reg_sext32(ctx, pattern2_0); - let expr2_0 = constructor_sink_load(ctx, pattern8_0); - let expr3_0 = - constructor_icmps_mem_sext16(ctx, expr0_0, expr1_0, &expr2_0); - return expr3_0; - } - } - } - } - } - } - } - let pattern0_0 = arg0; - if pattern0_0 == true { - let pattern2_0 = arg1; - let pattern3_0 = C::value_type(ctx, pattern2_0); - if let Some(pattern4_0) = C::fits_in_64(ctx, pattern3_0) { - let pattern5_0 = arg2; - if let Some(pattern6_0) = C::sinkable_inst(ctx, pattern5_0) { - let pattern7_0 = C::inst_data(ctx, pattern6_0); - if let &InstructionData::Load { - opcode: ref pattern8_0, - arg: pattern8_1, - flags: pattern8_2, - offset: pattern8_3, - } = &pattern7_0 - { - match pattern8_0 { - &Opcode::Sload16 => { - if let Some(()) = C::bigendian(ctx, pattern8_2) { - // Rule at src/isa/s390x/lower.isle line 3313. - let expr0_0 = C::put_in_reg(ctx, pattern2_0); - let expr1_0 = constructor_sink_sload16(ctx, pattern6_0); - let expr2_0 = constructor_icmps_mem_sext16( - ctx, pattern4_0, expr0_0, &expr1_0, - ); - return expr2_0; - } - } - &Opcode::Sload32 => { - if let Some(()) = C::bigendian(ctx, pattern8_2) { - // Rule at src/isa/s390x/lower.isle line 3315. - let expr0_0 = C::put_in_reg(ctx, pattern2_0); - let expr1_0 = constructor_sink_sload32(ctx, pattern6_0); - let expr2_0 = constructor_icmps_mem_sext32( - ctx, pattern4_0, expr0_0, &expr1_0, - ); - return expr2_0; - } - } - _ => {} - } - } - } - let pattern6_0 = C::value_type(ctx, pattern5_0); - if let Some(pattern7_0) = C::ty_32_or_64(ctx, pattern6_0) { - if let Some(pattern8_0) = C::sinkable_inst(ctx, pattern5_0) { - let pattern9_0 = C::inst_data(ctx, pattern8_0); - if let &InstructionData::Load { - opcode: ref pattern10_0, - arg: pattern10_1, - flags: pattern10_2, - offset: pattern10_3, - } = &pattern9_0 - { - if let &Opcode::Load = pattern10_0 { - if let Some(()) = C::bigendian(ctx, pattern10_2) { - // Rule at src/isa/s390x/lower.isle line 3305. - let expr0_0 = C::put_in_reg(ctx, pattern2_0); - let expr1_0 = constructor_sink_load(ctx, pattern8_0); - let expr2_0 = - constructor_icmps_mem(ctx, pattern4_0, expr0_0, &expr1_0); - return expr2_0; - } - } - } - } - } - } - } - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = C::value_type(ctx, pattern1_0); - if let Some(pattern3_0) = C::fits_in_64(ctx, pattern2_0) { - let pattern4_0 = arg2; - if let Some(pattern5_0) = C::def_inst(ctx, pattern4_0) { - let pattern6_0 = C::inst_data(ctx, pattern5_0); - if let &InstructionData::Unary { - opcode: ref pattern7_0, - arg: pattern7_1, - } = &pattern6_0 - { - if let &Opcode::Sextend = pattern7_0 { - let pattern9_0 = C::value_type(ctx, pattern7_1); - if pattern9_0 == I32 { - // Rule at src/isa/s390x/lower.isle line 3295. - let expr0_0 = C::put_in_reg(ctx, pattern1_0); - let expr1_0 = C::put_in_reg(ctx, pattern7_1); - let expr2_0 = - constructor_icmps_reg_sext32(ctx, pattern3_0, expr0_0, expr1_0); - return expr2_0; - } - } - } - } - } - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = C::value_type(ctx, pattern1_0); - if let Some(pattern3_0) = C::fits_in_64(ctx, pattern2_0) { - let pattern4_0 = arg2; - if let Some(pattern5_0) = C::i16_from_value(ctx, pattern4_0) { - // Rule at src/isa/s390x/lower.isle line 3299. - let expr0_0 = constructor_ty_ext32(ctx, pattern3_0); - let expr1_0 = constructor_put_in_reg_sext32(ctx, pattern1_0); - let expr2_0 = constructor_icmps_simm16(ctx, expr0_0, expr1_0, pattern5_0); - return expr2_0; - } - } - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = C::value_type(ctx, pattern1_0); - if let Some(pattern3_0) = C::fits_in_64(ctx, pattern2_0) { - let pattern4_0 = arg2; - if let Some(pattern5_0) = C::i32_from_value(ctx, pattern4_0) { - // Rule at src/isa/s390x/lower.isle line 3301. - let expr0_0 = constructor_ty_ext32(ctx, pattern3_0); - let expr1_0 = constructor_put_in_reg_sext32(ctx, pattern1_0); - let expr2_0 = constructor_icmps_simm32(ctx, expr0_0, expr1_0, pattern5_0); - return expr2_0; - } - } - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = C::value_type(ctx, pattern1_0); - if let Some(pattern3_0) = C::fits_in_64(ctx, pattern2_0) { - let pattern4_0 = arg2; - // Rule at src/isa/s390x/lower.isle line 3291. - let expr0_0 = constructor_ty_ext32(ctx, pattern3_0); - let expr1_0 = constructor_put_in_reg_sext32(ctx, pattern1_0); - let expr2_0 = constructor_put_in_reg_sext32(ctx, pattern4_0); - let expr3_0 = constructor_icmps_reg(ctx, expr0_0, expr1_0, expr2_0); - return expr3_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "icmps_val", "src/isa/s390x/lower.isle line 3288" - ); -} - -// Generated as internal constructor for term icmpu_val. -pub fn constructor_icmpu_val( - ctx: &mut C, - arg0: bool, - arg1: Value, - arg2: Value, -) -> ProducesFlags { - let pattern0_0 = arg0; - if pattern0_0 == true { - let pattern2_0 = arg1; - let pattern3_0 = C::value_type(ctx, pattern2_0); - if let Some(pattern4_0) = C::fits_in_64(ctx, pattern3_0) { - let pattern5_0 = arg2; - let pattern6_0 = C::value_type(ctx, pattern5_0); - if let Some(pattern7_0) = C::ty_32_or_64(ctx, pattern6_0) { - if let Some(pattern8_0) = C::sinkable_inst(ctx, pattern5_0) { - let pattern9_0 = C::inst_data(ctx, pattern8_0); - if let &InstructionData::Load { - opcode: ref pattern10_0, - arg: pattern10_1, - flags: pattern10_2, - offset: pattern10_3, - } = &pattern9_0 - { - if let &Opcode::Load = pattern10_0 { - if let Some(()) = C::bigendian(ctx, pattern10_2) { - // Rule at src/isa/s390x/lower.isle line 3335. - let expr0_0 = C::put_in_reg(ctx, pattern2_0); - let expr1_0 = constructor_sink_load(ctx, pattern8_0); - let expr2_0 = - constructor_icmpu_mem(ctx, pattern4_0, expr0_0, &expr1_0); - return expr2_0; - } - } - } - } - } - } - } - let pattern0_0 = arg0; - if pattern0_0 == true { - let pattern2_0 = arg1; - let pattern3_0 = C::value_type(ctx, pattern2_0); - if let Some(pattern4_0) = C::fits_in_64(ctx, pattern3_0) { - let pattern5_0 = arg2; - if let Some(pattern6_0) = C::sinkable_inst(ctx, pattern5_0) { - let pattern7_0 = C::inst_data(ctx, pattern6_0); - if let &InstructionData::Load { - opcode: ref pattern8_0, - arg: pattern8_1, - flags: pattern8_2, - offset: pattern8_3, - } = &pattern7_0 - { - match pattern8_0 { - &Opcode::Uload16 => { - if let Some(()) = C::bigendian(ctx, pattern8_2) { - let mut closure11 = || { - let expr0_0 = constructor_uload16_sym(ctx, pattern6_0)?; - return Some(expr0_0); - }; - if let Some(pattern11_0) = closure11() { - // Rule at src/isa/s390x/lower.isle line 3349. - let expr0_0 = C::put_in_reg(ctx, pattern2_0); - let expr1_0 = constructor_sink_uload16(ctx, pattern11_0); - let expr2_0 = constructor_icmpu_mem_zext16( - ctx, pattern4_0, expr0_0, &expr1_0, - ); - return expr2_0; - } - } - } - &Opcode::Uload32 => { - if let Some(()) = C::bigendian(ctx, pattern8_2) { - // Rule at src/isa/s390x/lower.isle line 3353. - let expr0_0 = C::put_in_reg(ctx, pattern2_0); - let expr1_0 = constructor_sink_uload32(ctx, pattern6_0); - let expr2_0 = constructor_icmpu_mem_zext32( - ctx, pattern4_0, expr0_0, &expr1_0, - ); - return expr2_0; - } - } - _ => {} - } - } - } - let pattern6_0 = C::value_type(ctx, pattern5_0); - if pattern6_0 == I16 { - if let Some(pattern8_0) = C::sinkable_inst(ctx, pattern5_0) { - let pattern9_0 = C::inst_data(ctx, pattern8_0); - if let &InstructionData::Load { - opcode: ref pattern10_0, - arg: pattern10_1, - flags: pattern10_2, - offset: pattern10_3, - } = &pattern9_0 - { - if let &Opcode::Load = pattern10_0 { - if let Some(()) = C::bigendian(ctx, pattern10_2) { - let mut closure13 = || { - let expr0_0 = constructor_load_sym(ctx, pattern8_0)?; - return Some(expr0_0); - }; - if let Some(pattern13_0) = closure13() { - // Rule at src/isa/s390x/lower.isle line 3341. - let expr0_0 = constructor_ty_ext32(ctx, pattern4_0); - let expr1_0 = constructor_put_in_reg_zext32(ctx, pattern2_0); - let expr2_0 = constructor_sink_load(ctx, pattern13_0); - let expr3_0 = constructor_icmpu_mem_zext16( - ctx, expr0_0, expr1_0, &expr2_0, - ); - return expr3_0; - } - } - } - } - } - } - } - } - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = C::value_type(ctx, pattern1_0); - if let Some(pattern3_0) = C::fits_in_64(ctx, pattern2_0) { - let pattern4_0 = arg2; - if let Some(pattern5_0) = C::u32_from_value(ctx, pattern4_0) { - // Rule at src/isa/s390x/lower.isle line 3331. - let expr0_0 = constructor_ty_ext32(ctx, pattern3_0); - let expr1_0 = constructor_put_in_reg_zext32(ctx, pattern1_0); - let expr2_0 = constructor_icmpu_uimm32(ctx, expr0_0, expr1_0, pattern5_0); - return expr2_0; - } - } - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = C::value_type(ctx, pattern1_0); - if let Some(pattern3_0) = C::fits_in_64(ctx, pattern2_0) { - let pattern4_0 = arg2; - if let Some(pattern5_0) = C::def_inst(ctx, pattern4_0) { - let pattern6_0 = C::inst_data(ctx, pattern5_0); - if let &InstructionData::Unary { - opcode: ref pattern7_0, - arg: pattern7_1, - } = &pattern6_0 - { - if let &Opcode::Uextend = pattern7_0 { - let pattern9_0 = C::value_type(ctx, pattern7_1); - if pattern9_0 == I32 { - // Rule at src/isa/s390x/lower.isle line 3327. - let expr0_0 = C::put_in_reg(ctx, pattern1_0); - let expr1_0 = C::put_in_reg(ctx, pattern7_1); - let expr2_0 = - constructor_icmpu_reg_zext32(ctx, pattern3_0, expr0_0, expr1_0); - return expr2_0; - } - } - } - } - } - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = C::value_type(ctx, pattern1_0); - if let Some(pattern3_0) = C::fits_in_64(ctx, pattern2_0) { - let pattern4_0 = arg2; - // Rule at src/isa/s390x/lower.isle line 3323. - let expr0_0 = constructor_ty_ext32(ctx, pattern3_0); - let expr1_0 = constructor_put_in_reg_zext32(ctx, pattern1_0); - let expr2_0 = constructor_put_in_reg_zext32(ctx, pattern4_0); - let expr3_0 = constructor_icmpu_reg(ctx, expr0_0, expr1_0, expr2_0); - return expr3_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "icmpu_val", "src/isa/s390x/lower.isle line 3320" - ); -} - -// Generated as internal constructor for term fcmp_val. -pub fn constructor_fcmp_val( - ctx: &mut C, - arg0: &FloatCC, - arg1: Value, - arg2: Value, -) -> ProducesBool { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = C::value_type(ctx, pattern1_0); - let pattern3_0 = arg2; - // Rule at src/isa/s390x/lower.isle line 3423. - let expr0_0 = C::put_in_reg(ctx, pattern1_0); - let expr1_0 = C::put_in_reg(ctx, pattern3_0); - let expr2_0 = constructor_fcmp_reg(ctx, pattern2_0, expr0_0, expr1_0); - let expr3_0 = C::floatcc_as_cond(ctx, pattern0_0); - let expr4_0 = constructor_bool(ctx, &expr2_0, &expr3_0); - return expr4_0; -} - -// Generated as internal constructor for term vall_true_val. -pub fn constructor_vall_true_val(ctx: &mut C, arg0: Value) -> ProducesBool { - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::def_inst(ctx, pattern0_0) { - if let Some(pattern2_0) = C::first_result(ctx, pattern1_0) { - let pattern3_0 = C::value_type(ctx, pattern2_0); - let pattern4_0 = C::inst_data(ctx, pattern1_0); - match &pattern4_0 { - &InstructionData::FloatCompare { - opcode: ref pattern5_0, - args: ref pattern5_1, - cond: ref pattern5_2, - } => { - if let &Opcode::Fcmp = pattern5_0 { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - match pattern5_2 { - &FloatCC::Equal => { - // Rule at src/isa/s390x/lower.isle line 3506. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = C::put_in_reg(ctx, pattern7_1); - let expr2_0 = - constructor_vec_fcmpeqs(ctx, pattern3_0, expr0_0, expr1_0); - let expr3_0 = FloatCC::Equal; - let expr4_0 = C::floatcc_as_cond(ctx, &expr3_0); - let expr5_0 = constructor_bool(ctx, &expr2_0, &expr4_0); - return expr5_0; - } - &FloatCC::GreaterThan => { - // Rule at src/isa/s390x/lower.isle line 3512. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = C::put_in_reg(ctx, pattern7_1); - let expr2_0 = - constructor_vec_fcmphs(ctx, pattern3_0, expr0_0, expr1_0); - let expr3_0 = FloatCC::Equal; - let expr4_0 = C::floatcc_as_cond(ctx, &expr3_0); - let expr5_0 = constructor_bool(ctx, &expr2_0, &expr4_0); - return expr5_0; - } - &FloatCC::GreaterThanOrEqual => { - // Rule at src/isa/s390x/lower.isle line 3518. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = C::put_in_reg(ctx, pattern7_1); - let expr2_0 = - constructor_vec_fcmphes(ctx, pattern3_0, expr0_0, expr1_0); - let expr3_0 = FloatCC::Equal; - let expr4_0 = C::floatcc_as_cond(ctx, &expr3_0); - let expr5_0 = constructor_bool(ctx, &expr2_0, &expr4_0); - return expr5_0; - } - &FloatCC::LessThan => { - // Rule at src/isa/s390x/lower.isle line 3524. - let expr0_0 = C::put_in_reg(ctx, pattern7_1); - let expr1_0 = C::put_in_reg(ctx, pattern7_0); - let expr2_0 = - constructor_vec_fcmphs(ctx, pattern3_0, expr0_0, expr1_0); - let expr3_0 = FloatCC::Equal; - let expr4_0 = C::floatcc_as_cond(ctx, &expr3_0); - let expr5_0 = constructor_bool(ctx, &expr2_0, &expr4_0); - return expr5_0; - } - &FloatCC::LessThanOrEqual => { - // Rule at src/isa/s390x/lower.isle line 3530. - let expr0_0 = C::put_in_reg(ctx, pattern7_1); - let expr1_0 = C::put_in_reg(ctx, pattern7_0); - let expr2_0 = - constructor_vec_fcmphes(ctx, pattern3_0, expr0_0, expr1_0); - let expr3_0 = FloatCC::Equal; - let expr4_0 = C::floatcc_as_cond(ctx, &expr3_0); - let expr5_0 = constructor_bool(ctx, &expr2_0, &expr4_0); - return expr5_0; - } - &FloatCC::NotEqual => { - // Rule at src/isa/s390x/lower.isle line 3509. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = C::put_in_reg(ctx, pattern7_1); - let expr2_0 = - constructor_vec_fcmpeqs(ctx, pattern3_0, expr0_0, expr1_0); - let expr3_0 = FloatCC::Unordered; - let expr4_0 = C::floatcc_as_cond(ctx, &expr3_0); - let expr5_0 = constructor_bool(ctx, &expr2_0, &expr4_0); - return expr5_0; - } - &FloatCC::UnorderedOrGreaterThan => { - // Rule at src/isa/s390x/lower.isle line 3533. - let expr0_0 = C::put_in_reg(ctx, pattern7_1); - let expr1_0 = C::put_in_reg(ctx, pattern7_0); - let expr2_0 = - constructor_vec_fcmphes(ctx, pattern3_0, expr0_0, expr1_0); - let expr3_0 = FloatCC::Unordered; - let expr4_0 = C::floatcc_as_cond(ctx, &expr3_0); - let expr5_0 = constructor_bool(ctx, &expr2_0, &expr4_0); - return expr5_0; - } - &FloatCC::UnorderedOrGreaterThanOrEqual => { - // Rule at src/isa/s390x/lower.isle line 3527. - let expr0_0 = C::put_in_reg(ctx, pattern7_1); - let expr1_0 = C::put_in_reg(ctx, pattern7_0); - let expr2_0 = - constructor_vec_fcmphs(ctx, pattern3_0, expr0_0, expr1_0); - let expr3_0 = FloatCC::Unordered; - let expr4_0 = C::floatcc_as_cond(ctx, &expr3_0); - let expr5_0 = constructor_bool(ctx, &expr2_0, &expr4_0); - return expr5_0; - } - &FloatCC::UnorderedOrLessThan => { - // Rule at src/isa/s390x/lower.isle line 3521. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = C::put_in_reg(ctx, pattern7_1); - let expr2_0 = - constructor_vec_fcmphes(ctx, pattern3_0, expr0_0, expr1_0); - let expr3_0 = FloatCC::Unordered; - let expr4_0 = C::floatcc_as_cond(ctx, &expr3_0); - let expr5_0 = constructor_bool(ctx, &expr2_0, &expr4_0); - return expr5_0; - } - &FloatCC::UnorderedOrLessThanOrEqual => { - // Rule at src/isa/s390x/lower.isle line 3515. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = C::put_in_reg(ctx, pattern7_1); - let expr2_0 = - constructor_vec_fcmphs(ctx, pattern3_0, expr0_0, expr1_0); - let expr3_0 = FloatCC::Unordered; - let expr4_0 = C::floatcc_as_cond(ctx, &expr3_0); - let expr5_0 = constructor_bool(ctx, &expr2_0, &expr4_0); - return expr5_0; - } - _ => {} - } - } - } - &InstructionData::IntCompare { - opcode: ref pattern5_0, - args: ref pattern5_1, - cond: ref pattern5_2, - } => { - if let &Opcode::Icmp = pattern5_0 { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - match pattern5_2 { - &IntCC::Equal => { - // Rule at src/isa/s390x/lower.isle line 3474. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = C::put_in_reg(ctx, pattern7_1); - let expr2_0 = - constructor_vec_cmpeqs(ctx, pattern3_0, expr0_0, expr1_0); - let expr3_0 = FloatCC::Equal; - let expr4_0 = C::floatcc_as_cond(ctx, &expr3_0); - let expr5_0 = constructor_bool(ctx, &expr2_0, &expr4_0); - return expr5_0; - } - &IntCC::NotEqual => { - // Rule at src/isa/s390x/lower.isle line 3477. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = C::put_in_reg(ctx, pattern7_1); - let expr2_0 = - constructor_vec_cmpeqs(ctx, pattern3_0, expr0_0, expr1_0); - let expr3_0 = FloatCC::Unordered; - let expr4_0 = C::floatcc_as_cond(ctx, &expr3_0); - let expr5_0 = constructor_bool(ctx, &expr2_0, &expr4_0); - return expr5_0; - } - &IntCC::SignedGreaterThan => { - // Rule at src/isa/s390x/lower.isle line 3480. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = C::put_in_reg(ctx, pattern7_1); - let expr2_0 = - constructor_vec_cmphs(ctx, pattern3_0, expr0_0, expr1_0); - let expr3_0 = FloatCC::Equal; - let expr4_0 = C::floatcc_as_cond(ctx, &expr3_0); - let expr5_0 = constructor_bool(ctx, &expr2_0, &expr4_0); - return expr5_0; - } - &IntCC::SignedGreaterThanOrEqual => { - // Rule at src/isa/s390x/lower.isle line 3489. - let expr0_0 = C::put_in_reg(ctx, pattern7_1); - let expr1_0 = C::put_in_reg(ctx, pattern7_0); - let expr2_0 = - constructor_vec_cmphs(ctx, pattern3_0, expr0_0, expr1_0); - let expr3_0 = FloatCC::Unordered; - let expr4_0 = C::floatcc_as_cond(ctx, &expr3_0); - let expr5_0 = constructor_bool(ctx, &expr2_0, &expr4_0); - return expr5_0; - } - &IntCC::SignedLessThan => { - // Rule at src/isa/s390x/lower.isle line 3486. - let expr0_0 = C::put_in_reg(ctx, pattern7_1); - let expr1_0 = C::put_in_reg(ctx, pattern7_0); - let expr2_0 = - constructor_vec_cmphs(ctx, pattern3_0, expr0_0, expr1_0); - let expr3_0 = FloatCC::Equal; - let expr4_0 = C::floatcc_as_cond(ctx, &expr3_0); - let expr5_0 = constructor_bool(ctx, &expr2_0, &expr4_0); - return expr5_0; - } - &IntCC::SignedLessThanOrEqual => { - // Rule at src/isa/s390x/lower.isle line 3483. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = C::put_in_reg(ctx, pattern7_1); - let expr2_0 = - constructor_vec_cmphs(ctx, pattern3_0, expr0_0, expr1_0); - let expr3_0 = FloatCC::Unordered; - let expr4_0 = C::floatcc_as_cond(ctx, &expr3_0); - let expr5_0 = constructor_bool(ctx, &expr2_0, &expr4_0); - return expr5_0; - } - &IntCC::UnsignedGreaterThan => { - // Rule at src/isa/s390x/lower.isle line 3492. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = C::put_in_reg(ctx, pattern7_1); - let expr2_0 = - constructor_vec_cmphls(ctx, pattern3_0, expr0_0, expr1_0); - let expr3_0 = FloatCC::Equal; - let expr4_0 = C::floatcc_as_cond(ctx, &expr3_0); - let expr5_0 = constructor_bool(ctx, &expr2_0, &expr4_0); - return expr5_0; - } - &IntCC::UnsignedGreaterThanOrEqual => { - // Rule at src/isa/s390x/lower.isle line 3501. - let expr0_0 = C::put_in_reg(ctx, pattern7_1); - let expr1_0 = C::put_in_reg(ctx, pattern7_0); - let expr2_0 = - constructor_vec_cmphls(ctx, pattern3_0, expr0_0, expr1_0); - let expr3_0 = FloatCC::Unordered; - let expr4_0 = C::floatcc_as_cond(ctx, &expr3_0); - let expr5_0 = constructor_bool(ctx, &expr2_0, &expr4_0); - return expr5_0; - } - &IntCC::UnsignedLessThan => { - // Rule at src/isa/s390x/lower.isle line 3498. - let expr0_0 = C::put_in_reg(ctx, pattern7_1); - let expr1_0 = C::put_in_reg(ctx, pattern7_0); - let expr2_0 = - constructor_vec_cmphls(ctx, pattern3_0, expr0_0, expr1_0); - let expr3_0 = FloatCC::Equal; - let expr4_0 = C::floatcc_as_cond(ctx, &expr3_0); - let expr5_0 = constructor_bool(ctx, &expr2_0, &expr4_0); - return expr5_0; - } - &IntCC::UnsignedLessThanOrEqual => { - // Rule at src/isa/s390x/lower.isle line 3495. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = C::put_in_reg(ctx, pattern7_1); - let expr2_0 = - constructor_vec_cmphls(ctx, pattern3_0, expr0_0, expr1_0); - let expr3_0 = FloatCC::Unordered; - let expr4_0 = C::floatcc_as_cond(ctx, &expr3_0); - let expr5_0 = constructor_bool(ctx, &expr2_0, &expr4_0); - return expr5_0; - } - _ => {} - } - } - } - _ => {} - } - } - } - let pattern0_0 = arg0; - let pattern1_0 = C::value_type(ctx, pattern0_0); - // Rule at src/isa/s390x/lower.isle line 3469. - let expr0_0 = C::put_in_reg(ctx, pattern0_0); - let expr1_0: u128 = 0i128 as u128; - let expr2_0 = constructor_vec_imm(ctx, pattern1_0, expr1_0); - let expr3_0 = constructor_vec_cmpeqs(ctx, pattern1_0, expr0_0, expr2_0); - let expr4_0 = FloatCC::Unordered; - let expr5_0 = C::floatcc_as_cond(ctx, &expr4_0); - let expr6_0 = constructor_bool(ctx, &expr3_0, &expr5_0); - return expr6_0; -} - -// Generated as internal constructor for term vany_true_val. -pub fn constructor_vany_true_val(ctx: &mut C, arg0: Value) -> ProducesBool { - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::def_inst(ctx, pattern0_0) { - if let Some(pattern2_0) = C::first_result(ctx, pattern1_0) { - let pattern3_0 = C::value_type(ctx, pattern2_0); - let pattern4_0 = C::inst_data(ctx, pattern1_0); - match &pattern4_0 { - &InstructionData::FloatCompare { - opcode: ref pattern5_0, - args: ref pattern5_1, - cond: ref pattern5_2, - } => { - if let &Opcode::Fcmp = pattern5_0 { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - match pattern5_2 { - &FloatCC::Equal => { - // Rule at src/isa/s390x/lower.isle line 3584. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = C::put_in_reg(ctx, pattern7_1); - let expr2_0 = - constructor_vec_fcmpeqs(ctx, pattern3_0, expr0_0, expr1_0); - let expr3_0 = FloatCC::Ordered; - let expr4_0 = C::floatcc_as_cond(ctx, &expr3_0); - let expr5_0 = constructor_bool(ctx, &expr2_0, &expr4_0); - return expr5_0; - } - &FloatCC::GreaterThan => { - // Rule at src/isa/s390x/lower.isle line 3590. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = C::put_in_reg(ctx, pattern7_1); - let expr2_0 = - constructor_vec_fcmphs(ctx, pattern3_0, expr0_0, expr1_0); - let expr3_0 = FloatCC::Ordered; - let expr4_0 = C::floatcc_as_cond(ctx, &expr3_0); - let expr5_0 = constructor_bool(ctx, &expr2_0, &expr4_0); - return expr5_0; - } - &FloatCC::GreaterThanOrEqual => { - // Rule at src/isa/s390x/lower.isle line 3596. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = C::put_in_reg(ctx, pattern7_1); - let expr2_0 = - constructor_vec_fcmphes(ctx, pattern3_0, expr0_0, expr1_0); - let expr3_0 = FloatCC::Ordered; - let expr4_0 = C::floatcc_as_cond(ctx, &expr3_0); - let expr5_0 = constructor_bool(ctx, &expr2_0, &expr4_0); - return expr5_0; - } - &FloatCC::LessThan => { - // Rule at src/isa/s390x/lower.isle line 3602. - let expr0_0 = C::put_in_reg(ctx, pattern7_1); - let expr1_0 = C::put_in_reg(ctx, pattern7_0); - let expr2_0 = - constructor_vec_fcmphs(ctx, pattern3_0, expr0_0, expr1_0); - let expr3_0 = FloatCC::Ordered; - let expr4_0 = C::floatcc_as_cond(ctx, &expr3_0); - let expr5_0 = constructor_bool(ctx, &expr2_0, &expr4_0); - return expr5_0; - } - &FloatCC::LessThanOrEqual => { - // Rule at src/isa/s390x/lower.isle line 3608. - let expr0_0 = C::put_in_reg(ctx, pattern7_1); - let expr1_0 = C::put_in_reg(ctx, pattern7_0); - let expr2_0 = - constructor_vec_fcmphes(ctx, pattern3_0, expr0_0, expr1_0); - let expr3_0 = FloatCC::Ordered; - let expr4_0 = C::floatcc_as_cond(ctx, &expr3_0); - let expr5_0 = constructor_bool(ctx, &expr2_0, &expr4_0); - return expr5_0; - } - &FloatCC::NotEqual => { - // Rule at src/isa/s390x/lower.isle line 3587. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = C::put_in_reg(ctx, pattern7_1); - let expr2_0 = - constructor_vec_fcmpeqs(ctx, pattern3_0, expr0_0, expr1_0); - let expr3_0 = FloatCC::NotEqual; - let expr4_0 = C::floatcc_as_cond(ctx, &expr3_0); - let expr5_0 = constructor_bool(ctx, &expr2_0, &expr4_0); - return expr5_0; - } - &FloatCC::UnorderedOrGreaterThan => { - // Rule at src/isa/s390x/lower.isle line 3611. - let expr0_0 = C::put_in_reg(ctx, pattern7_1); - let expr1_0 = C::put_in_reg(ctx, pattern7_0); - let expr2_0 = - constructor_vec_fcmphes(ctx, pattern3_0, expr0_0, expr1_0); - let expr3_0 = FloatCC::NotEqual; - let expr4_0 = C::floatcc_as_cond(ctx, &expr3_0); - let expr5_0 = constructor_bool(ctx, &expr2_0, &expr4_0); - return expr5_0; - } - &FloatCC::UnorderedOrGreaterThanOrEqual => { - // Rule at src/isa/s390x/lower.isle line 3605. - let expr0_0 = C::put_in_reg(ctx, pattern7_1); - let expr1_0 = C::put_in_reg(ctx, pattern7_0); - let expr2_0 = - constructor_vec_fcmphs(ctx, pattern3_0, expr0_0, expr1_0); - let expr3_0 = FloatCC::NotEqual; - let expr4_0 = C::floatcc_as_cond(ctx, &expr3_0); - let expr5_0 = constructor_bool(ctx, &expr2_0, &expr4_0); - return expr5_0; - } - &FloatCC::UnorderedOrLessThan => { - // Rule at src/isa/s390x/lower.isle line 3599. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = C::put_in_reg(ctx, pattern7_1); - let expr2_0 = - constructor_vec_fcmphes(ctx, pattern3_0, expr0_0, expr1_0); - let expr3_0 = FloatCC::NotEqual; - let expr4_0 = C::floatcc_as_cond(ctx, &expr3_0); - let expr5_0 = constructor_bool(ctx, &expr2_0, &expr4_0); - return expr5_0; - } - &FloatCC::UnorderedOrLessThanOrEqual => { - // Rule at src/isa/s390x/lower.isle line 3593. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = C::put_in_reg(ctx, pattern7_1); - let expr2_0 = - constructor_vec_fcmphs(ctx, pattern3_0, expr0_0, expr1_0); - let expr3_0 = FloatCC::NotEqual; - let expr4_0 = C::floatcc_as_cond(ctx, &expr3_0); - let expr5_0 = constructor_bool(ctx, &expr2_0, &expr4_0); - return expr5_0; - } - _ => {} - } - } - } - &InstructionData::IntCompare { - opcode: ref pattern5_0, - args: ref pattern5_1, - cond: ref pattern5_2, - } => { - if let &Opcode::Icmp = pattern5_0 { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - match pattern5_2 { - &IntCC::Equal => { - // Rule at src/isa/s390x/lower.isle line 3552. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = C::put_in_reg(ctx, pattern7_1); - let expr2_0 = - constructor_vec_cmpeqs(ctx, pattern3_0, expr0_0, expr1_0); - let expr3_0 = FloatCC::Ordered; - let expr4_0 = C::floatcc_as_cond(ctx, &expr3_0); - let expr5_0 = constructor_bool(ctx, &expr2_0, &expr4_0); - return expr5_0; - } - &IntCC::NotEqual => { - // Rule at src/isa/s390x/lower.isle line 3555. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = C::put_in_reg(ctx, pattern7_1); - let expr2_0 = - constructor_vec_cmpeqs(ctx, pattern3_0, expr0_0, expr1_0); - let expr3_0 = FloatCC::NotEqual; - let expr4_0 = C::floatcc_as_cond(ctx, &expr3_0); - let expr5_0 = constructor_bool(ctx, &expr2_0, &expr4_0); - return expr5_0; - } - &IntCC::SignedGreaterThan => { - // Rule at src/isa/s390x/lower.isle line 3558. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = C::put_in_reg(ctx, pattern7_1); - let expr2_0 = - constructor_vec_cmphs(ctx, pattern3_0, expr0_0, expr1_0); - let expr3_0 = FloatCC::Ordered; - let expr4_0 = C::floatcc_as_cond(ctx, &expr3_0); - let expr5_0 = constructor_bool(ctx, &expr2_0, &expr4_0); - return expr5_0; - } - &IntCC::SignedGreaterThanOrEqual => { - // Rule at src/isa/s390x/lower.isle line 3567. - let expr0_0 = C::put_in_reg(ctx, pattern7_1); - let expr1_0 = C::put_in_reg(ctx, pattern7_0); - let expr2_0 = - constructor_vec_cmphs(ctx, pattern3_0, expr0_0, expr1_0); - let expr3_0 = FloatCC::NotEqual; - let expr4_0 = C::floatcc_as_cond(ctx, &expr3_0); - let expr5_0 = constructor_bool(ctx, &expr2_0, &expr4_0); - return expr5_0; - } - &IntCC::SignedLessThan => { - // Rule at src/isa/s390x/lower.isle line 3564. - let expr0_0 = C::put_in_reg(ctx, pattern7_1); - let expr1_0 = C::put_in_reg(ctx, pattern7_0); - let expr2_0 = - constructor_vec_cmphs(ctx, pattern3_0, expr0_0, expr1_0); - let expr3_0 = FloatCC::Ordered; - let expr4_0 = C::floatcc_as_cond(ctx, &expr3_0); - let expr5_0 = constructor_bool(ctx, &expr2_0, &expr4_0); - return expr5_0; - } - &IntCC::SignedLessThanOrEqual => { - // Rule at src/isa/s390x/lower.isle line 3561. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = C::put_in_reg(ctx, pattern7_1); - let expr2_0 = - constructor_vec_cmphs(ctx, pattern3_0, expr0_0, expr1_0); - let expr3_0 = FloatCC::NotEqual; - let expr4_0 = C::floatcc_as_cond(ctx, &expr3_0); - let expr5_0 = constructor_bool(ctx, &expr2_0, &expr4_0); - return expr5_0; - } - &IntCC::UnsignedGreaterThan => { - // Rule at src/isa/s390x/lower.isle line 3570. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = C::put_in_reg(ctx, pattern7_1); - let expr2_0 = - constructor_vec_cmphls(ctx, pattern3_0, expr0_0, expr1_0); - let expr3_0 = FloatCC::Ordered; - let expr4_0 = C::floatcc_as_cond(ctx, &expr3_0); - let expr5_0 = constructor_bool(ctx, &expr2_0, &expr4_0); - return expr5_0; - } - &IntCC::UnsignedGreaterThanOrEqual => { - // Rule at src/isa/s390x/lower.isle line 3579. - let expr0_0 = C::put_in_reg(ctx, pattern7_1); - let expr1_0 = C::put_in_reg(ctx, pattern7_0); - let expr2_0 = - constructor_vec_cmphls(ctx, pattern3_0, expr0_0, expr1_0); - let expr3_0 = FloatCC::NotEqual; - let expr4_0 = C::floatcc_as_cond(ctx, &expr3_0); - let expr5_0 = constructor_bool(ctx, &expr2_0, &expr4_0); - return expr5_0; - } - &IntCC::UnsignedLessThan => { - // Rule at src/isa/s390x/lower.isle line 3576. - let expr0_0 = C::put_in_reg(ctx, pattern7_1); - let expr1_0 = C::put_in_reg(ctx, pattern7_0); - let expr2_0 = - constructor_vec_cmphls(ctx, pattern3_0, expr0_0, expr1_0); - let expr3_0 = FloatCC::Ordered; - let expr4_0 = C::floatcc_as_cond(ctx, &expr3_0); - let expr5_0 = constructor_bool(ctx, &expr2_0, &expr4_0); - return expr5_0; - } - &IntCC::UnsignedLessThanOrEqual => { - // Rule at src/isa/s390x/lower.isle line 3573. - let expr0_0 = C::put_in_reg(ctx, pattern7_0); - let expr1_0 = C::put_in_reg(ctx, pattern7_1); - let expr2_0 = - constructor_vec_cmphls(ctx, pattern3_0, expr0_0, expr1_0); - let expr3_0 = FloatCC::NotEqual; - let expr4_0 = C::floatcc_as_cond(ctx, &expr3_0); - let expr5_0 = constructor_bool(ctx, &expr2_0, &expr4_0); - return expr5_0; - } - _ => {} - } - } - } - _ => {} - } - } - } - let pattern0_0 = arg0; - let pattern1_0 = C::value_type(ctx, pattern0_0); - // Rule at src/isa/s390x/lower.isle line 3547. - let expr0_0 = C::put_in_reg(ctx, pattern0_0); - let expr1_0: u128 = 0i128 as u128; - let expr2_0 = constructor_vec_imm(ctx, pattern1_0, expr1_0); - let expr3_0 = constructor_vec_cmpeqs(ctx, pattern1_0, expr0_0, expr2_0); - let expr4_0 = FloatCC::NotEqual; - let expr5_0 = C::floatcc_as_cond(ctx, &expr4_0); - let expr6_0 = constructor_bool(ctx, &expr3_0, &expr5_0); - return expr6_0; -} - -// Generated as internal constructor for term value_nonzero. -pub fn constructor_value_nonzero(ctx: &mut C, arg0: Value) -> ProducesBool { - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::def_inst(ctx, pattern0_0) { - let pattern2_0 = C::inst_data(ctx, pattern1_0); - match &pattern2_0 { - &InstructionData::FloatCompare { - opcode: ref pattern3_0, - args: ref pattern3_1, - cond: ref pattern3_2, - } => { - if let &Opcode::Fcmp = pattern3_0 { - let (pattern5_0, pattern5_1) = C::unpack_value_array_2(ctx, pattern3_1); - // Rule at src/isa/s390x/lower.isle line 3685. - let expr0_0 = constructor_fcmp_val(ctx, pattern3_2, pattern5_0, pattern5_1); - return expr0_0; - } - } - &InstructionData::IntCompare { - opcode: ref pattern3_0, - args: ref pattern3_1, - cond: ref pattern3_2, - } => { - if let &Opcode::Icmp = pattern3_0 { - let (pattern5_0, pattern5_1) = C::unpack_value_array_2(ctx, pattern3_1); - // Rule at src/isa/s390x/lower.isle line 3684. - let expr0_0: bool = false; - let expr1_0 = - constructor_icmp_val(ctx, expr0_0, pattern3_2, pattern5_0, pattern5_1); - return expr1_0; - } - } - _ => {} - } - } - let pattern0_0 = arg0; - let pattern1_0 = C::value_type(ctx, pattern0_0); - if let Some(pattern2_0) = C::gpr32_ty(ctx, pattern1_0) { - // Rule at src/isa/s390x/lower.isle line 3686. - let expr0_0: Type = I32; - let expr1_0 = constructor_put_in_reg_sext32(ctx, pattern0_0); - let expr2_0: i16 = 0i128 as i16; - let expr3_0 = constructor_icmps_simm16(ctx, expr0_0, expr1_0, expr2_0); - let expr4_0 = IntCC::NotEqual; - let expr5_0 = C::intcc_as_cond(ctx, &expr4_0); - let expr6_0 = constructor_bool(ctx, &expr3_0, &expr5_0); - return expr6_0; - } - let pattern0_0 = arg0; - let pattern1_0 = C::value_type(ctx, pattern0_0); - if let Some(pattern2_0) = C::gpr64_ty(ctx, pattern1_0) { - // Rule at src/isa/s390x/lower.isle line 3689. - let expr0_0: Type = I64; - let expr1_0 = C::put_in_reg(ctx, pattern0_0); - let expr2_0: i16 = 0i128 as i16; - let expr3_0 = constructor_icmps_simm16(ctx, expr0_0, expr1_0, expr2_0); - let expr4_0 = IntCC::NotEqual; - let expr5_0 = C::intcc_as_cond(ctx, &expr4_0); - let expr6_0 = constructor_bool(ctx, &expr3_0, &expr5_0); - return expr6_0; - } - let pattern0_0 = arg0; - let pattern1_0 = C::value_type(ctx, pattern0_0); - if let Some(pattern2_0) = C::vr128_ty(ctx, pattern1_0) { - // Rule at src/isa/s390x/lower.isle line 3692. - let expr0_0: Type = I64X2; - let expr1_0 = C::put_in_reg(ctx, pattern0_0); - let expr2_0: Type = I64X2; - let expr3_0: u128 = 0i128 as u128; - let expr4_0 = constructor_vec_imm(ctx, expr2_0, expr3_0); - let expr5_0 = constructor_vec_cmpeqs(ctx, expr0_0, expr1_0, expr4_0); - let expr6_0 = FloatCC::NotEqual; - let expr7_0 = C::floatcc_as_cond(ctx, &expr6_0); - let expr8_0 = constructor_bool(ctx, &expr5_0, &expr7_0); - return expr8_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "value_nonzero", "src/isa/s390x/lower.isle line 3683" - ); -} - -// Generated as internal constructor for term lower_call_args. -pub fn constructor_lower_call_args( - ctx: &mut C, - arg0: Sig, - arg1: Range, - arg2: ValueSlice, -) -> CallArgList { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/s390x/lower.isle line 3921. - let expr0_0 = C::args_builder_new(ctx); - let expr1_0 = constructor_lower_call_args_buffer(ctx, pattern0_0, pattern1_0, pattern2_0); - let expr2_0 = - constructor_lower_call_args_slots(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0); - let expr3_0 = constructor_lower_call_ret_arg(ctx, pattern0_0, &expr0_0); - let expr4_0 = C::args_builder_finish(ctx, &expr0_0); - return expr4_0; -} - -// Generated as internal constructor for term lower_call_args_buffer. -pub fn constructor_lower_call_args_buffer( - ctx: &mut C, - arg0: Sig, - arg1: Range, - arg2: ValueSlice, -) -> InstOutput { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = C::range_view(ctx, pattern1_0); - match &pattern2_0 { - &RangeView::Empty => { - let pattern4_0 = arg2; - // Rule at src/isa/s390x/lower.isle line 3930. - let expr0_0 = C::output_none(ctx); - return expr0_0; - } - &RangeView::NonEmpty { - index: pattern3_0, - rest: pattern3_1, - } => { - let pattern4_0 = arg2; - // Rule at src/isa/s390x/lower.isle line 3931. - let expr0_0: i64 = 0i128 as i64; - let expr1_0 = C::abi_get_arg(ctx, pattern0_0, pattern3_0); - let expr2_0 = C::value_slice_get(ctx, pattern4_0, pattern3_0); - let expr3_0 = constructor_copy_to_buffer(ctx, expr0_0, &expr1_0, expr2_0); - let expr4_0 = - constructor_lower_call_args_buffer(ctx, pattern0_0, pattern3_1, pattern4_0); - return expr4_0; - } - _ => {} - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "lower_call_args_buffer", "src/isa/s390x/lower.isle line 3929" - ); -} - -// Generated as internal constructor for term lower_call_args_slots. -pub fn constructor_lower_call_args_slots( - ctx: &mut C, - arg0: Sig, - arg1: &CallArgListBuilder, - arg2: Range, - arg3: ValueSlice, -) -> InstOutput { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = C::range_view(ctx, pattern2_0); - match &pattern3_0 { - &RangeView::Empty => { - let pattern5_0 = arg3; - // Rule at src/isa/s390x/lower.isle line 3938. - let expr0_0 = C::output_none(ctx); - return expr0_0; - } - &RangeView::NonEmpty { - index: pattern4_0, - rest: pattern4_1, - } => { - let pattern5_0 = arg3; - // Rule at src/isa/s390x/lower.isle line 3939. - let expr0_0 = C::abi_lane_order(ctx, pattern0_0); - let expr1_0: i64 = 0i128 as i64; - let expr2_0 = C::abi_get_arg(ctx, pattern0_0, pattern4_0); - let expr3_0 = C::value_slice_get(ctx, pattern5_0, pattern4_0); - let expr4_0 = - constructor_copy_to_arg(ctx, pattern1_0, &expr0_0, expr1_0, &expr2_0, expr3_0); - let expr5_0 = constructor_lower_call_args_slots( - ctx, pattern0_0, pattern1_0, pattern4_1, pattern5_0, - ); - return expr5_0; - } - _ => {} - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "lower_call_args_slots", "src/isa/s390x/lower.isle line 3937" - ); -} - -// Generated as internal constructor for term lower_call_ret_arg. -pub fn constructor_lower_call_ret_arg( - ctx: &mut C, - arg0: Sig, - arg1: &CallArgListBuilder, -) -> InstOutput { - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::abi_ret_arg(ctx, pattern0_0) { - if let Some(pattern2_0) = C::abi_arg_only_slot(ctx, &pattern1_0) { - let pattern3_0 = arg1; - // Rule at src/isa/s390x/lower.isle line 3948. - let expr0_0 = C::abi_sized_stack_arg_space(ctx, pattern0_0); - let expr1_0: i64 = 0i128 as i64; - let expr2_0 = C::memarg_stack_off(ctx, expr0_0, expr1_0); - let expr3_0 = C::abi_lane_order(ctx, pattern0_0); - let expr4_0: i64 = 0i128 as i64; - let expr5_0 = constructor_load_addr(ctx, &expr2_0); - let expr6_0 = constructor_copy_reg_to_arg_slot( - ctx, - pattern3_0, - &expr3_0, - expr4_0, - &pattern2_0, - expr5_0, - ); - return expr6_0; - } - } - let pattern0_0 = arg0; - if let Some(()) = C::abi_no_ret_arg(ctx, pattern0_0) { - let pattern2_0 = arg1; - // Rule at src/isa/s390x/lower.isle line 3947. - let expr0_0 = C::output_none(ctx); - return expr0_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "lower_call_ret_arg", "src/isa/s390x/lower.isle line 3946" - ); -} - -// Generated as internal constructor for term lower_call_rets. -pub fn constructor_lower_call_rets( - ctx: &mut C, - arg0: Sig, - arg1: &CallRetList, - arg2: Range, - arg3: &InstOutputBuilder, -) -> InstOutput { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = C::range_view(ctx, pattern2_0); - match &pattern3_0 { - &RangeView::Empty => { - let pattern5_0 = arg3; - // Rule at src/isa/s390x/lower.isle line 3954. - let expr0_0 = C::output_builder_finish(ctx, pattern5_0); - return expr0_0; - } - &RangeView::NonEmpty { - index: pattern4_0, - rest: pattern4_1, - } => { - let pattern5_0 = arg3; - // Rule at src/isa/s390x/lower.isle line 3955. - let expr0_0 = C::abi_lane_order(ctx, pattern0_0); - let expr1_0 = C::abi_sized_stack_arg_space(ctx, pattern0_0); - let expr2_0 = C::abi_get_ret(ctx, pattern0_0, pattern4_0); - let expr3_0 = constructor_copy_from_arg(ctx, pattern1_0, &expr0_0, expr1_0, &expr2_0); - let expr4_0 = C::output_builder_push(ctx, pattern5_0, expr3_0); - let expr5_0 = - constructor_lower_call_rets(ctx, pattern0_0, pattern1_0, pattern4_1, pattern5_0); - return expr5_0; - } - _ => {} - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "lower_call_rets", "src/isa/s390x/lower.isle line 3953" - ); -} diff --git a/cranelift/codegen/isle_generated_code/isle_x64.rs b/cranelift/codegen/isle_generated_code/isle_x64.rs deleted file mode 100644 index 34a453e605ab..000000000000 --- a/cranelift/codegen/isle_generated_code/isle_x64.rs +++ /dev/null @@ -1,18835 +0,0 @@ -// GENERATED BY ISLE. DO NOT EDIT! -// -// Generated automatically from the instruction-selection DSL code in: -// - src/prelude.isle -// - src/prelude_lower.isle -// - src/isa/x64/inst.isle -// - src/isa/x64/lower.isle -// - /Users/avh/research/wasmtime/cranelift/codegen/isle_generated_code/clif_lower.isle - -use super::*; // Pulls in all external types. -use std::marker::PhantomData; - -/// Context during lowering: an implementation of this trait -/// must be provided with all external constructors and extractors. -/// A mutable borrow is passed along through all lowering logic. -pub trait Context { - fn unit(&mut self) -> Unit; - fn value_type(&mut self, arg0: Value) -> Type; - fn u32_add(&mut self, arg0: u32, arg1: u32) -> u32; - fn s32_add_fallible(&mut self, arg0: u32, arg1: u32) -> Option; - fn u32_nonnegative(&mut self, arg0: u32) -> Option; - fn offset32(&mut self, arg0: Offset32) -> u32; - fn u32_lteq(&mut self, arg0: u32, arg1: u32) -> Option; - fn u8_lteq(&mut self, arg0: u8, arg1: u8) -> Option; - fn u8_lt(&mut self, arg0: u8, arg1: u8) -> Option; - fn simm32(&mut self, arg0: Imm64) -> Option; - fn uimm8(&mut self, arg0: Imm64) -> Option; - fn u8_and(&mut self, arg0: u8, arg1: u8) -> u8; - fn u8_as_u32(&mut self, arg0: u8) -> u32; - fn u8_as_u64(&mut self, arg0: u8) -> u64; - fn u16_as_u64(&mut self, arg0: u16) -> u64; - fn u32_as_u64(&mut self, arg0: u32) -> u64; - fn i64_as_u64(&mut self, arg0: i64) -> u64; - fn u64_add(&mut self, arg0: u64, arg1: u64) -> u64; - fn u64_sub(&mut self, arg0: u64, arg1: u64) -> u64; - fn u64_mul(&mut self, arg0: u64, arg1: u64) -> u64; - fn u64_sdiv(&mut self, arg0: u64, arg1: u64) -> Option; - fn u64_udiv(&mut self, arg0: u64, arg1: u64) -> Option; - fn u64_and(&mut self, arg0: u64, arg1: u64) -> u64; - fn u64_or(&mut self, arg0: u64, arg1: u64) -> u64; - fn u64_xor(&mut self, arg0: u64, arg1: u64) -> u64; - fn u64_not(&mut self, arg0: u64) -> u64; - fn u64_sextend_u32(&mut self, arg0: u64) -> u64; - fn u64_uextend_u32(&mut self, arg0: u64) -> u64; - fn u64_is_zero(&mut self, arg0: u64) -> bool; - fn u64_is_odd(&mut self, arg0: u64) -> bool; - fn ty_bits(&mut self, arg0: Type) -> u8; - fn ty_bits_u16(&mut self, arg0: Type) -> u16; - fn ty_bits_u64(&mut self, arg0: Type) -> u64; - fn ty_mask(&mut self, arg0: Type) -> u64; - fn ty_bytes(&mut self, arg0: Type) -> u16; - fn lane_type(&mut self, arg0: Type) -> Type; - fn mem_flags_trusted(&mut self) -> MemFlags; - fn intcc_reverse(&mut self, arg0: &IntCC) -> IntCC; - fn intcc_inverse(&mut self, arg0: &IntCC) -> IntCC; - fn floatcc_reverse(&mut self, arg0: &FloatCC) -> FloatCC; - fn floatcc_inverse(&mut self, arg0: &FloatCC) -> FloatCC; - fn fits_in_16(&mut self, arg0: Type) -> Option; - fn fits_in_32(&mut self, arg0: Type) -> Option; - fn lane_fits_in_32(&mut self, arg0: Type) -> Option; - fn fits_in_64(&mut self, arg0: Type) -> Option; - fn ty_32(&mut self, arg0: Type) -> Option; - fn ty_64(&mut self, arg0: Type) -> Option; - fn ty_int_ref_scalar_64(&mut self, arg0: Type) -> Option; - fn ty_32_or_64(&mut self, arg0: Type) -> Option; - fn ty_8_or_16(&mut self, arg0: Type) -> Option; - fn int_fits_in_32(&mut self, arg0: Type) -> Option; - fn ty_int_ref_64(&mut self, arg0: Type) -> Option; - fn ty_int(&mut self, arg0: Type) -> Option; - fn ty_scalar_float(&mut self, arg0: Type) -> Option; - fn ty_float_or_vec(&mut self, arg0: Type) -> Option; - fn ty_vector_float(&mut self, arg0: Type) -> Option; - fn ty_vector_not_float(&mut self, arg0: Type) -> Option; - fn ty_vec64(&mut self, arg0: Type) -> Option; - fn ty_vec64_ctor(&mut self, arg0: Type) -> Option; - fn ty_vec128(&mut self, arg0: Type) -> Option; - fn ty_dyn_vec64(&mut self, arg0: Type) -> Option; - fn ty_dyn_vec128(&mut self, arg0: Type) -> Option; - fn ty_vec64_int(&mut self, arg0: Type) -> Option; - fn ty_vec128_int(&mut self, arg0: Type) -> Option; - fn not_vec32x2(&mut self, arg0: Type) -> Option; - fn not_i64x2(&mut self, arg0: Type) -> Option<()>; - fn u8_from_uimm8(&mut self, arg0: Uimm8) -> u8; - fn u64_from_bool(&mut self, arg0: bool) -> u64; - fn u64_from_imm64(&mut self, arg0: Imm64) -> u64; - fn nonzero_u64_from_imm64(&mut self, arg0: Imm64) -> Option; - fn imm64(&mut self, arg0: u64) -> Imm64; - fn imm64_masked(&mut self, arg0: Type, arg1: u64) -> Imm64; - fn u64_from_ieee32(&mut self, arg0: Ieee32) -> u64; - fn u64_from_ieee64(&mut self, arg0: Ieee64) -> u64; - fn multi_lane(&mut self, arg0: Type) -> Option<(u32, u32)>; - fn dynamic_lane(&mut self, arg0: Type) -> Option<(u32, u32)>; - fn dynamic_int_lane(&mut self, arg0: Type) -> Option; - fn dynamic_fp_lane(&mut self, arg0: Type) -> Option; - fn ty_dyn64_int(&mut self, arg0: Type) -> Option; - fn ty_dyn128_int(&mut self, arg0: Type) -> Option; - fn offset32_to_u32(&mut self, arg0: Offset32) -> u32; - fn intcc_unsigned(&mut self, arg0: &IntCC) -> IntCC; - fn signed_cond_code(&mut self, arg0: &IntCC) -> Option; - fn trap_code_division_by_zero(&mut self) -> TrapCode; - fn trap_code_integer_overflow(&mut self) -> TrapCode; - fn trap_code_bad_conversion_to_integer(&mut self) -> TrapCode; - fn range(&mut self, arg0: usize, arg1: usize) -> Range; - fn range_view(&mut self, arg0: Range) -> RangeView; - fn value_reg(&mut self, arg0: Reg) -> ValueRegs; - fn value_regs(&mut self, arg0: Reg, arg1: Reg) -> ValueRegs; - fn value_regs_invalid(&mut self) -> ValueRegs; - fn output_none(&mut self) -> InstOutput; - fn output(&mut self, arg0: ValueRegs) -> InstOutput; - fn output_pair(&mut self, arg0: ValueRegs, arg1: ValueRegs) -> InstOutput; - fn output_builder_new(&mut self) -> InstOutputBuilder; - fn output_builder_push(&mut self, arg0: &InstOutputBuilder, arg1: ValueRegs) -> Unit; - fn output_builder_finish(&mut self, arg0: &InstOutputBuilder) -> InstOutput; - fn temp_writable_reg(&mut self, arg0: Type) -> WritableReg; - fn is_valid_reg(&mut self, arg0: Reg) -> bool; - fn invalid_reg(&mut self) -> Reg; - fn mark_value_used(&mut self, arg0: Value) -> Unit; - fn put_in_reg(&mut self, arg0: Value) -> Reg; - fn put_in_regs(&mut self, arg0: Value) -> ValueRegs; - fn ensure_in_vreg(&mut self, arg0: Reg, arg1: Type) -> Reg; - fn value_regs_get(&mut self, arg0: ValueRegs, arg1: usize) -> Reg; - fn value_regs_len(&mut self, arg0: ValueRegs) -> usize; - fn preg_to_reg(&mut self, arg0: PReg) -> Reg; - fn value_list_slice(&mut self, arg0: ValueList) -> ValueSlice; - fn value_slice_empty(&mut self, arg0: ValueSlice) -> Option<()>; - fn value_slice_unwrap(&mut self, arg0: ValueSlice) -> Option<(Value, ValueSlice)>; - fn value_slice_len(&mut self, arg0: ValueSlice) -> usize; - fn value_slice_get(&mut self, arg0: ValueSlice, arg1: usize) -> Value; - fn writable_reg_to_reg(&mut self, arg0: WritableReg) -> Reg; - fn inst_results(&mut self, arg0: Inst) -> ValueSlice; - fn first_result(&mut self, arg0: Inst) -> Option; - fn inst_data(&mut self, arg0: Inst) -> InstructionData; - fn def_inst(&mut self, arg0: Value) -> Option; - fn zero_value(&mut self, arg0: Value) -> Option; - fn is_sinkable_inst(&mut self, arg0: Value) -> Option; - fn maybe_uextend(&mut self, arg0: Value) -> Option; - fn emit(&mut self, arg0: &MInst) -> Unit; - fn sink_inst(&mut self, arg0: Inst) -> Unit; - fn emit_u64_le_const(&mut self, arg0: u64) -> VCodeConstant; - fn emit_u128_le_const(&mut self, arg0: u128) -> VCodeConstant; - fn const_to_vconst(&mut self, arg0: Constant) -> VCodeConstant; - fn avoid_div_traps(&mut self, arg0: Type) -> Option<()>; - fn tls_model(&mut self, arg0: Type) -> TlsModel; - fn tls_model_is_elf_gd(&mut self) -> Option; - fn tls_model_is_macho(&mut self) -> Option; - fn tls_model_is_coff(&mut self) -> Option; - fn preserve_frame_pointers(&mut self) -> Option; - fn box_external_name(&mut self, arg0: ExternalName) -> BoxExternalName; - fn func_ref_data(&mut self, arg0: FuncRef) -> (SigRef, ExternalName, RelocDistance); - fn symbol_value_data( - &mut self, - arg0: GlobalValue, - ) -> Option<(ExternalName, RelocDistance, i64)>; - fn reloc_distance_near(&mut self, arg0: RelocDistance) -> Option<()>; - fn vec_mask_from_immediate(&mut self, arg0: Immediate) -> Option; - fn u128_from_immediate(&mut self, arg0: Immediate) -> Option; - fn u128_from_constant(&mut self, arg0: Constant) -> Option; - fn u64_from_constant(&mut self, arg0: Constant) -> Option; - fn only_writable_reg(&mut self, arg0: WritableValueRegs) -> Option; - fn writable_regs_get(&mut self, arg0: WritableValueRegs, arg1: usize) -> WritableReg; - fn abi_num_args(&mut self, arg0: Sig) -> usize; - fn abi_get_arg(&mut self, arg0: Sig, arg1: usize) -> ABIArg; - fn abi_num_rets(&mut self, arg0: Sig) -> usize; - fn abi_get_ret(&mut self, arg0: Sig, arg1: usize) -> ABIArg; - fn abi_ret_arg(&mut self, arg0: Sig) -> Option; - fn abi_no_ret_arg(&mut self, arg0: Sig) -> Option<()>; - fn abi_sized_stack_arg_space(&mut self, arg0: Sig) -> i64; - fn abi_sized_stack_ret_space(&mut self, arg0: Sig) -> i64; - fn abi_stackslot_addr(&mut self, arg0: WritableReg, arg1: StackSlot, arg2: Offset32) -> MInst; - fn abi_dynamic_stackslot_addr(&mut self, arg0: WritableReg, arg1: DynamicStackSlot) -> MInst; - fn abi_arg_only_slot(&mut self, arg0: &ABIArg) -> Option; - fn abi_arg_struct_pointer(&mut self, arg0: &ABIArg) -> Option<(ABIArgSlot, i64, u64)>; - fn abi_arg_implicit_pointer(&mut self, arg0: &ABIArg) -> Option<(ABIArgSlot, i64, Type)>; - fn real_reg_to_reg(&mut self, arg0: RealReg) -> Reg; - fn real_reg_to_writable_reg(&mut self, arg0: RealReg) -> WritableReg; - fn gen_move(&mut self, arg0: Type, arg1: WritableReg, arg2: Reg) -> MInst; - fn gen_return(&mut self, arg0: ValueSlice) -> Unit; - fn jump_table_size(&mut self, arg0: &BoxVecMachLabel) -> u32; - fn single_target(&mut self, arg0: &MachLabelSlice) -> Option; - fn two_targets(&mut self, arg0: &MachLabelSlice) -> Option<(MachLabel, MachLabel)>; - fn jump_table_targets(&mut self, arg0: &MachLabelSlice) - -> Option<(MachLabel, BoxVecMachLabel)>; - fn operand_size_of_type_32_64(&mut self, arg0: Type) -> OperandSize; - fn raw_operand_size_of_type(&mut self, arg0: Type) -> OperandSize; - fn put_in_reg_mem_imm(&mut self, arg0: Value) -> RegMemImm; - fn put_in_reg_mem(&mut self, arg0: Value) -> RegMem; - fn synthetic_amode_to_reg_mem(&mut self, arg0: &SyntheticAmode) -> RegMem; - fn amode_to_synthetic_amode(&mut self, arg0: &Amode) -> SyntheticAmode; - fn amode_with_flags(&mut self, arg0: &Amode, arg1: MemFlags) -> Amode; - fn amode_imm_reg(&mut self, arg0: u32, arg1: Gpr) -> Amode; - fn amode_imm_reg_reg_shift(&mut self, arg0: u32, arg1: Gpr, arg2: Gpr, arg3: u8) -> Amode; - fn sum_extend_fits_in_32_bits( - &mut self, - arg0: Type, - arg1: Imm64, - arg2: Offset32, - ) -> Option; - fn amode_offset(&mut self, arg0: &Amode, arg1: u32) -> Amode; - fn zero_offset(&mut self) -> Offset32; - fn intcc_to_cc(&mut self, arg0: &IntCC) -> CC; - fn cc_invert(&mut self, arg0: &CC) -> CC; - fn cc_nz_or_z(&mut self, arg0: &CC) -> Option; - fn encode_fcmp_imm(&mut self, arg0: &FcmpImm) -> u8; - fn encode_round_imm(&mut self, arg0: &RoundImm) -> u8; - fn imm8_reg_to_imm8_gpr(&mut self, arg0: &Imm8Reg) -> Imm8Gpr; - fn writable_gpr_to_reg(&mut self, arg0: WritableGpr) -> WritableReg; - fn writable_xmm_to_reg(&mut self, arg0: WritableXmm) -> WritableReg; - fn writable_reg_to_xmm(&mut self, arg0: WritableReg) -> WritableXmm; - fn writable_xmm_to_xmm(&mut self, arg0: WritableXmm) -> Xmm; - fn writable_gpr_to_gpr(&mut self, arg0: WritableGpr) -> Gpr; - fn gpr_to_reg(&mut self, arg0: Gpr) -> Reg; - fn gpr_to_gpr_mem(&mut self, arg0: Gpr) -> GprMem; - fn gpr_to_gpr_mem_imm(&mut self, arg0: Gpr) -> GprMemImm; - fn xmm_to_reg(&mut self, arg0: Xmm) -> Reg; - fn xmm_to_xmm_mem_imm(&mut self, arg0: Xmm) -> XmmMemImm; - fn temp_writable_gpr(&mut self) -> WritableGpr; - fn temp_writable_xmm(&mut self) -> WritableXmm; - fn reg_mem_to_xmm_mem(&mut self, arg0: &RegMem) -> XmmMem; - fn reg_to_reg_mem_imm(&mut self, arg0: Reg) -> RegMemImm; - fn gpr_mem_imm_new(&mut self, arg0: &RegMemImm) -> GprMemImm; - fn xmm_mem_imm_new(&mut self, arg0: &RegMemImm) -> XmmMemImm; - fn xmm_to_xmm_mem(&mut self, arg0: Xmm) -> XmmMem; - fn xmm_mem_to_reg_mem(&mut self, arg0: &XmmMem) -> RegMem; - fn gpr_mem_to_reg_mem(&mut self, arg0: &GprMem) -> RegMem; - fn xmm_new(&mut self, arg0: Reg) -> Xmm; - fn gpr_new(&mut self, arg0: Reg) -> Gpr; - fn reg_mem_to_gpr_mem(&mut self, arg0: &RegMem) -> GprMem; - fn reg_to_gpr_mem(&mut self, arg0: Reg) -> GprMem; - fn put_in_xmm_mem(&mut self, arg0: Value) -> XmmMem; - fn put_in_xmm_mem_imm(&mut self, arg0: Value) -> XmmMemImm; - fn gpr_to_imm8_gpr(&mut self, arg0: Gpr) -> Imm8Gpr; - fn imm8_to_imm8_gpr(&mut self, arg0: u8) -> Imm8Gpr; - fn intcc_without_eq(&mut self, arg0: &IntCC) -> IntCC; - fn type_register_class(&mut self, arg0: Type) -> Option; - fn avx512vl_enabled(&mut self, arg0: Type) -> bool; - fn avx512dq_enabled(&mut self, arg0: Type) -> bool; - fn avx512f_enabled(&mut self, arg0: Type) -> bool; - fn avx512bitalg_enabled(&mut self, arg0: Type) -> bool; - fn avx512vbmi_enabled(&mut self, arg0: Type) -> bool; - fn use_lzcnt(&mut self, arg0: Type) -> bool; - fn use_bmi1(&mut self, arg0: Type) -> bool; - fn use_popcnt(&mut self, arg0: Type) -> bool; - fn use_fma(&mut self, arg0: Type) -> bool; - fn use_sse41(&mut self, arg0: Type) -> bool; - fn imm8_from_value(&mut self, arg0: Value) -> Option; - fn const_to_type_masked_imm8(&mut self, arg0: u64, arg1: Type) -> Imm8Gpr; - fn shift_mask(&mut self, arg0: Type) -> u32; - fn simm32_from_value(&mut self, arg0: Value) -> Option; - fn simm32_from_imm64(&mut self, arg0: Imm64) -> Option; - fn sinkable_load(&mut self, arg0: Value) -> Option; - fn sink_load(&mut self, arg0: &SinkableLoad) -> RegMem; - fn ext_mode(&mut self, arg0: u16, arg1: u16) -> ExtMode; - fn gen_call( - &mut self, - arg0: SigRef, - arg1: ExternalName, - arg2: RelocDistance, - arg3: ValueSlice, - ) -> InstOutput; - fn gen_call_indirect(&mut self, arg0: SigRef, arg1: Value, arg2: ValueSlice) -> InstOutput; - fn nonzero_u64_fits_in_u32(&mut self, arg0: u64) -> Option; - fn fcvt_uint_mask_const(&mut self) -> VCodeConstant; - fn fcvt_uint_mask_high_const(&mut self) -> VCodeConstant; - fn iadd_pairwise_mul_const_16(&mut self) -> VCodeConstant; - fn iadd_pairwise_mul_const_32(&mut self) -> VCodeConstant; - fn iadd_pairwise_xor_const_32(&mut self) -> VCodeConstant; - fn iadd_pairwise_addd_const_32(&mut self) -> VCodeConstant; - fn snarrow_umax_mask(&mut self) -> VCodeConstant; - fn ty_int_bool_or_ref(&mut self, arg0: Type) -> Option<()>; - fn atomic_rmw_op_to_mach_atomic_rmw_op(&mut self, arg0: &AtomicRmwOp) -> MachAtomicRmwOp; - fn emit_div_or_rem( - &mut self, - arg0: &DivOrRemKind, - arg1: Type, - arg2: WritableGpr, - arg3: Gpr, - arg4: Gpr, - ) -> Unit; - fn shuffle_0_31_mask(&mut self, arg0: &VecMask) -> VCodeConstant; - fn shuffle_0_15_mask(&mut self, arg0: &VecMask) -> VCodeConstant; - fn shuffle_16_31_mask(&mut self, arg0: &VecMask) -> VCodeConstant; - fn perm_from_mask(&mut self, arg0: &VecMask) -> VCodeConstant; - fn perm_from_mask_with_zeros( - &mut self, - arg0: &VecMask, - ) -> Option<(VCodeConstant, VCodeConstant)>; - fn swizzle_zero_mask(&mut self) -> VCodeConstant; - fn sqmul_round_sat_mask(&mut self) -> VCodeConstant; - fn uunarrow_umax_mask(&mut self) -> VCodeConstant; - fn uunarrow_uint_mask(&mut self) -> VCodeConstant; - fn const_to_synthetic_amode(&mut self, arg0: VCodeConstant) -> SyntheticAmode; - fn preg_rbp(&mut self) -> PReg; - fn preg_rsp(&mut self) -> PReg; - fn preg_pinned(&mut self) -> PReg; - fn libcall_1(&mut self, arg0: &LibCall, arg1: Reg) -> Reg; - fn libcall_3(&mut self, arg0: &LibCall, arg1: Reg, arg2: Reg, arg3: Reg) -> Reg; - fn ishl_i8x16_mask_for_const(&mut self, arg0: u32) -> SyntheticAmode; - fn ishl_i8x16_mask_table(&mut self) -> SyntheticAmode; - fn ushr_i8x16_mask_for_const(&mut self, arg0: u32) -> SyntheticAmode; - fn ushr_i8x16_mask_table(&mut self) -> SyntheticAmode; - fn vconst_all_ones_or_all_zeros(&mut self, arg0: Constant) -> Option<()>; - fn sse_insertps_lane_imm(&mut self, arg0: u8) -> u8; - fn popcount_4bit_table(&mut self) -> VCodeConstant; - fn popcount_low_mask(&mut self) -> VCodeConstant; - fn unpack_value_array_2(&mut self, arg0: &ValueArray2) -> (Value, Value); - fn pack_value_array_2(&mut self, arg0: Value, arg1: Value) -> ValueArray2; - fn unpack_value_array_3(&mut self, arg0: &ValueArray3) -> (Value, Value, Value); - fn pack_value_array_3(&mut self, arg0: Value, arg1: Value, arg2: Value) -> ValueArray3; -} - -pub trait ContextIter { - type Context; - type Output; - fn next(&mut self, ctx: &mut Self::Context) -> Option; -} - -pub struct ContextIterWrapper, C: Context> { - iter: I, - _ctx: PhantomData, -} -impl, C: Context> From for ContextIterWrapper { - fn from(iter: I) -> Self { - Self { - iter, - _ctx: PhantomData, - } - } -} -impl, C: Context> ContextIter for ContextIterWrapper { - type Context = C; - type Output = Item; - fn next(&mut self, _ctx: &mut Self::Context) -> Option { - self.iter.next() - } -} - -/// Internal type SideEffectNoResult: defined at src/prelude_lower.isle line 282. -#[derive(Clone, Debug)] -pub enum SideEffectNoResult { - Inst { - inst: MInst, - }, - Inst2 { - inst1: MInst, - inst2: MInst, - }, - Inst3 { - inst1: MInst, - inst2: MInst, - inst3: MInst, - }, -} - -/// Internal type ProducesFlags: defined at src/prelude_lower.isle line 324. -#[derive(Clone, Debug)] -pub enum ProducesFlags { - AlreadyExistingFlags, - ProducesFlagsSideEffect { inst: MInst }, - ProducesFlagsTwiceSideEffect { inst1: MInst, inst2: MInst }, - ProducesFlagsReturnsReg { inst: MInst, result: Reg }, - ProducesFlagsReturnsResultWithConsumer { inst: MInst, result: Reg }, -} - -/// Internal type ConsumesFlags: defined at src/prelude_lower.isle line 346. -#[derive(Clone, Debug)] -pub enum ConsumesFlags { - ConsumesFlagsSideEffect { - inst: MInst, - }, - ConsumesFlagsSideEffect2 { - inst1: MInst, - inst2: MInst, - }, - ConsumesFlagsReturnsResultWithProducer { - inst: MInst, - result: Reg, - }, - ConsumesFlagsReturnsReg { - inst: MInst, - result: Reg, - }, - ConsumesFlagsTwiceReturnsValueRegs { - inst1: MInst, - inst2: MInst, - result: ValueRegs, - }, - ConsumesFlagsFourTimesReturnsValueRegs { - inst1: MInst, - inst2: MInst, - inst3: MInst, - inst4: MInst, - result: ValueRegs, - }, -} - -/// Internal type MInst: defined at src/isa/x64/inst.isle line 8. -#[derive(Clone)] -pub enum MInst { - Nop { - len: u8, - }, - AluRmiR { - size: OperandSize, - op: AluRmiROpcode, - src1: Gpr, - src2: GprMemImm, - dst: WritableGpr, - }, - AluRM { - size: OperandSize, - op: AluRmiROpcode, - src1_dst: SyntheticAmode, - src2: Gpr, - }, - UnaryRmR { - size: OperandSize, - op: UnaryRmROpcode, - src: GprMem, - dst: WritableGpr, - }, - Not { - size: OperandSize, - src: Gpr, - dst: WritableGpr, - }, - Neg { - size: OperandSize, - src: Gpr, - dst: WritableGpr, - }, - Div { - size: OperandSize, - signed: bool, - divisor: GprMem, - dividend_lo: Gpr, - dividend_hi: Gpr, - dst_quotient: WritableGpr, - dst_remainder: WritableGpr, - }, - MulHi { - size: OperandSize, - signed: bool, - src1: Gpr, - src2: GprMem, - dst_lo: WritableGpr, - dst_hi: WritableGpr, - }, - CheckedDivOrRemSeq { - kind: DivOrRemKind, - size: OperandSize, - dividend_lo: Gpr, - dividend_hi: Gpr, - divisor: Gpr, - dst_quotient: WritableGpr, - dst_remainder: WritableGpr, - tmp: OptionWritableGpr, - }, - SignExtendData { - size: OperandSize, - src: Gpr, - dst: WritableGpr, - }, - Imm { - dst_size: OperandSize, - simm64: u64, - dst: WritableGpr, - }, - MovRR { - size: OperandSize, - src: Gpr, - dst: WritableGpr, - }, - MovFromPReg { - src: PReg, - dst: WritableGpr, - }, - MovToPReg { - src: Gpr, - dst: PReg, - }, - MovzxRmR { - ext_mode: ExtMode, - src: GprMem, - dst: WritableGpr, - }, - Mov64MR { - src: SyntheticAmode, - dst: WritableGpr, - }, - LoadEffectiveAddress { - addr: SyntheticAmode, - dst: WritableGpr, - }, - MovsxRmR { - ext_mode: ExtMode, - src: GprMem, - dst: WritableGpr, - }, - MovImmM { - size: OperandSize, - simm64: u64, - dst: SyntheticAmode, - }, - MovRM { - size: OperandSize, - src: Gpr, - dst: SyntheticAmode, - }, - ShiftR { - size: OperandSize, - kind: ShiftKind, - src: Gpr, - num_bits: Imm8Gpr, - dst: WritableGpr, - }, - XmmRmiReg { - opcode: SseOpcode, - src1: Xmm, - src2: XmmMemImm, - dst: WritableXmm, - }, - CmpRmiR { - size: OperandSize, - opcode: CmpOpcode, - src: GprMemImm, - dst: Gpr, - }, - Setcc { - cc: CC, - dst: WritableGpr, - }, - Bswap { - size: OperandSize, - src: Gpr, - dst: WritableGpr, - }, - Cmove { - size: OperandSize, - cc: CC, - consequent: GprMem, - alternative: Gpr, - dst: WritableGpr, - }, - XmmCmove { - ty: Type, - cc: CC, - consequent: XmmMem, - alternative: Xmm, - dst: WritableXmm, - }, - Push64 { - src: GprMemImm, - }, - Pop64 { - dst: WritableGpr, - }, - StackProbeLoop { - tmp: WritableReg, - frame_size: u32, - guard_size: u32, - }, - XmmRmR { - op: SseOpcode, - src1: Xmm, - src2: XmmMem, - dst: WritableXmm, - }, - XmmRmRBlend { - op: SseOpcode, - src1: Xmm, - src2: XmmMem, - mask: Xmm, - dst: WritableXmm, - }, - XmmRmRVex { - op: AvxOpcode, - src1: Xmm, - src2: Xmm, - src3: XmmMem, - dst: WritableXmm, - }, - XmmRmREvex { - op: Avx512Opcode, - src1: XmmMem, - src2: Xmm, - dst: WritableXmm, - }, - XmmRmREvex3 { - op: Avx512Opcode, - src1: XmmMem, - src2: Xmm, - src3: Xmm, - dst: WritableXmm, - }, - XmmUnaryRmR { - op: SseOpcode, - src: XmmMem, - dst: WritableXmm, - }, - XmmUnaryRmRImm { - op: SseOpcode, - src: XmmMem, - imm: u8, - dst: WritableXmm, - }, - XmmUnaryRmREvex { - op: Avx512Opcode, - src: XmmMem, - dst: WritableXmm, - }, - XmmMovRM { - op: SseOpcode, - src: Reg, - dst: SyntheticAmode, - }, - XmmToGpr { - op: SseOpcode, - src: Xmm, - dst: WritableGpr, - dst_size: OperandSize, - }, - GprToXmm { - op: SseOpcode, - src: GprMem, - dst: WritableXmm, - src_size: OperandSize, - }, - CvtUint64ToFloatSeq { - dst_size: OperandSize, - src: Gpr, - dst: WritableXmm, - tmp_gpr1: WritableGpr, - tmp_gpr2: WritableGpr, - }, - CvtFloatToSintSeq { - dst_size: OperandSize, - src_size: OperandSize, - is_saturating: bool, - src: Xmm, - dst: WritableGpr, - tmp_gpr: WritableGpr, - tmp_xmm: WritableXmm, - }, - CvtFloatToUintSeq { - dst_size: OperandSize, - src_size: OperandSize, - is_saturating: bool, - src: Xmm, - dst: WritableGpr, - tmp_gpr: WritableGpr, - tmp_xmm: WritableXmm, - tmp_xmm2: WritableXmm, - }, - XmmMinMaxSeq { - size: OperandSize, - is_min: bool, - lhs: Xmm, - rhs: Xmm, - dst: WritableXmm, - }, - XmmCmpRmR { - op: SseOpcode, - src: XmmMem, - dst: Xmm, - }, - XmmRmRImm { - op: SseOpcode, - src1: Reg, - src2: RegMem, - dst: WritableReg, - imm: u8, - size: OperandSize, - }, - CallKnown { - dest: ExternalName, - info: BoxCallInfo, - }, - CallUnknown { - dest: RegMem, - info: BoxCallInfo, - }, - Args { - args: VecArgPair, - }, - Ret { - rets: VecRetPair, - }, - JmpKnown { - dst: MachLabel, - }, - JmpIf { - cc: CC, - taken: MachLabel, - }, - JmpCond { - cc: CC, - taken: MachLabel, - not_taken: MachLabel, - }, - JmpTableSeq { - idx: Reg, - tmp1: WritableReg, - tmp2: WritableReg, - default_target: MachLabel, - targets: BoxVecMachLabel, - }, - JmpUnknown { - target: RegMem, - }, - TrapIf { - cc: CC, - trap_code: TrapCode, - }, - TrapIfAnd { - cc1: CC, - cc2: CC, - trap_code: TrapCode, - }, - TrapIfOr { - cc1: CC, - cc2: CC, - trap_code: TrapCode, - }, - Hlt, - Ud2 { - trap_code: TrapCode, - }, - LoadExtName { - dst: WritableReg, - name: BoxExternalName, - offset: i64, - }, - LockCmpxchg { - ty: Type, - replacement: Reg, - expected: Reg, - mem: SyntheticAmode, - dst_old: WritableReg, - }, - AtomicRmwSeq { - ty: Type, - op: MachAtomicRmwOp, - mem: SyntheticAmode, - operand: Reg, - temp: WritableReg, - dst_old: WritableReg, - }, - Fence { - kind: FenceKind, - }, - VirtualSPOffsetAdj { - offset: i64, - }, - XmmUninitializedValue { - dst: WritableXmm, - }, - ElfTlsGetAddr { - symbol: ExternalName, - dst: WritableGpr, - }, - MachOTlsGetAddr { - symbol: ExternalName, - dst: WritableGpr, - }, - CoffTlsGetAddr { - symbol: ExternalName, - dst: WritableGpr, - tmp: WritableGpr, - }, - Unwind { - inst: UnwindInst, - }, - DummyUse { - reg: Reg, - }, -} - -/// Internal type Amode: defined at src/isa/x64/inst.isle line 832. -#[derive(Clone, Debug)] -pub enum Amode { - ImmReg { - simm32: u32, - base: Reg, - flags: MemFlags, - }, - ImmRegRegShift { - simm32: u32, - base: Gpr, - index: Gpr, - shift: u8, - flags: MemFlags, - }, - RipRelative { - target: MachLabel, - }, -} - -/// Internal type RegisterClass: defined at src/isa/x64/inst.isle line 1375. -#[derive(Clone, Debug)] -pub enum RegisterClass { - Gpr { single_register: bool }, - Xmm, -} - -/// Internal type ExtendKind: defined at src/isa/x64/inst.isle line 1485. -#[derive(Copy, Clone, PartialEq, Eq, Debug)] -pub enum ExtendKind { - Sign, - Zero, -} - -/// Internal type IcmpCondResult: defined at src/isa/x64/inst.isle line 3436. -#[derive(Clone, Debug)] -pub enum IcmpCondResult { - Condition { producer: ProducesFlags, cc: CC }, -} - -/// Internal type FcmpCondResult: defined at src/isa/x64/inst.isle line 3538. -#[derive(Clone, Debug)] -pub enum FcmpCondResult { - Condition { - producer: ProducesFlags, - cc: CC, - }, - AndCondition { - producer: ProducesFlags, - cc1: CC, - cc2: CC, - }, - OrCondition { - producer: ProducesFlags, - cc1: CC, - cc2: CC, - }, -} - -// Generated as internal constructor for term output_reg. -pub fn constructor_output_reg(ctx: &mut C, arg0: Reg) -> InstOutput { - let pattern0_0 = arg0; - // Rule at src/prelude_lower.isle line 55. - let expr0_0 = C::value_reg(ctx, pattern0_0); - let expr1_0 = C::output(ctx, expr0_0); - return expr1_0; -} - -// Generated as internal constructor for term output_value. -pub fn constructor_output_value(ctx: &mut C, arg0: Value) -> InstOutput { - let pattern0_0 = arg0; - // Rule at src/prelude_lower.isle line 59. - let expr0_0 = C::put_in_regs(ctx, pattern0_0); - let expr1_0 = C::output(ctx, expr0_0); - return expr1_0; -} - -// Generated as internal constructor for term temp_reg. -pub fn constructor_temp_reg(ctx: &mut C, arg0: Type) -> Reg { - let pattern0_0 = arg0; - // Rule at src/prelude_lower.isle line 79. - let expr0_0 = C::temp_writable_reg(ctx, pattern0_0); - let expr1_0 = C::writable_reg_to_reg(ctx, expr0_0); - return expr1_0; -} - -// Generated as internal constructor for term value_regs_range. -pub fn constructor_value_regs_range(ctx: &mut C, arg0: ValueRegs) -> Range { - let pattern0_0 = arg0; - // Rule at src/prelude_lower.isle line 128. - let expr0_0: usize = 0i128 as usize; - let expr1_0 = C::value_regs_len(ctx, pattern0_0); - let expr2_0 = C::range(ctx, expr0_0, expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term lo_reg. -pub fn constructor_lo_reg(ctx: &mut C, arg0: Value) -> Reg { - let pattern0_0 = arg0; - // Rule at src/prelude_lower.isle line 139. - let expr0_0 = C::put_in_regs(ctx, pattern0_0); - let expr1_0: usize = 0i128 as usize; - let expr2_0 = C::value_regs_get(ctx, expr0_0, expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term emit_side_effect. -pub fn constructor_emit_side_effect(ctx: &mut C, arg0: &SideEffectNoResult) -> Unit { - let pattern0_0 = arg0; - match pattern0_0 { - &SideEffectNoResult::Inst { - inst: ref pattern1_0, - } => { - // Rule at src/prelude_lower.isle line 292. - let expr0_0 = C::emit(ctx, pattern1_0); - return expr0_0; - } - &SideEffectNoResult::Inst2 { - inst1: ref pattern1_0, - inst2: ref pattern1_1, - } => { - // Rule at src/prelude_lower.isle line 294. - let expr0_0 = C::emit(ctx, pattern1_0); - let expr1_0 = C::emit(ctx, pattern1_1); - return expr1_0; - } - &SideEffectNoResult::Inst3 { - inst1: ref pattern1_0, - inst2: ref pattern1_1, - inst3: ref pattern1_2, - } => { - // Rule at src/prelude_lower.isle line 297. - let expr0_0 = C::emit(ctx, pattern1_0); - let expr1_0 = C::emit(ctx, pattern1_1); - let expr2_0 = C::emit(ctx, pattern1_2); - return expr2_0; - } - _ => {} - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "emit_side_effect", "src/prelude_lower.isle line 291" - ); -} - -// Generated as internal constructor for term side_effect. -pub fn constructor_side_effect(ctx: &mut C, arg0: &SideEffectNoResult) -> InstOutput { - let pattern0_0 = arg0; - // Rule at src/prelude_lower.isle line 305. - let expr0_0 = constructor_emit_side_effect(ctx, pattern0_0); - let expr1_0 = C::output_none(ctx); - return expr1_0; -} - -// Generated as internal constructor for term side_effect_concat. -pub fn constructor_side_effect_concat( - ctx: &mut C, - arg0: &SideEffectNoResult, - arg1: &SideEffectNoResult, -) -> SideEffectNoResult { - let pattern0_0 = arg0; - match pattern0_0 { - &SideEffectNoResult::Inst { - inst: ref pattern1_0, - } => { - let pattern2_0 = arg1; - match pattern2_0 { - &SideEffectNoResult::Inst { - inst: ref pattern3_0, - } => { - // Rule at src/prelude_lower.isle line 310. - let expr0_0 = SideEffectNoResult::Inst2 { - inst1: pattern1_0.clone(), - inst2: pattern3_0.clone(), - }; - return expr0_0; - } - &SideEffectNoResult::Inst2 { - inst1: ref pattern3_0, - inst2: ref pattern3_1, - } => { - // Rule at src/prelude_lower.isle line 312. - let expr0_0 = SideEffectNoResult::Inst3 { - inst1: pattern1_0.clone(), - inst2: pattern3_0.clone(), - inst3: pattern3_1.clone(), - }; - return expr0_0; - } - _ => {} - } - } - &SideEffectNoResult::Inst2 { - inst1: ref pattern1_0, - inst2: ref pattern1_1, - } => { - let pattern2_0 = arg1; - if let &SideEffectNoResult::Inst { - inst: ref pattern3_0, - } = pattern2_0 - { - // Rule at src/prelude_lower.isle line 314. - let expr0_0 = SideEffectNoResult::Inst3 { - inst1: pattern1_0.clone(), - inst2: pattern1_1.clone(), - inst3: pattern3_0.clone(), - }; - return expr0_0; - } - } - _ => {} - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "side_effect_concat", "src/prelude_lower.isle line 309" - ); -} - -// Generated as internal constructor for term produces_flags_append. -pub fn constructor_produces_flags_append( - ctx: &mut C, - arg0: &ProducesFlags, - arg1: &MInst, -) -> ProducesFlags { - let pattern0_0 = arg0; - if let &ProducesFlags::ProducesFlagsSideEffect { - inst: ref pattern1_0, - } = pattern0_0 - { - let pattern2_0 = arg1; - // Rule at src/prelude_lower.isle line 339. - let expr0_0 = ProducesFlags::ProducesFlagsTwiceSideEffect { - inst1: pattern1_0.clone(), - inst2: pattern2_0.clone(), - }; - return expr0_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "produces_flags_append", "src/prelude_lower.isle line 338" - ); -} - -// Generated as internal constructor for term produces_flags_get_reg. -pub fn constructor_produces_flags_get_reg(ctx: &mut C, arg0: &ProducesFlags) -> Reg { - let pattern0_0 = arg0; - if let &ProducesFlags::ProducesFlagsReturnsReg { - inst: ref pattern1_0, - result: pattern1_1, - } = pattern0_0 - { - // Rule at src/prelude_lower.isle line 364. - return pattern1_1; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "produces_flags_get_reg", "src/prelude_lower.isle line 363" - ); -} - -// Generated as internal constructor for term produces_flags_ignore. -pub fn constructor_produces_flags_ignore( - ctx: &mut C, - arg0: &ProducesFlags, -) -> ProducesFlags { - let pattern0_0 = arg0; - match pattern0_0 { - &ProducesFlags::ProducesFlagsReturnsReg { - inst: ref pattern1_0, - result: pattern1_1, - } => { - // Rule at src/prelude_lower.isle line 369. - let expr0_0 = ProducesFlags::ProducesFlagsSideEffect { - inst: pattern1_0.clone(), - }; - return expr0_0; - } - &ProducesFlags::ProducesFlagsReturnsResultWithConsumer { - inst: ref pattern1_0, - result: pattern1_1, - } => { - // Rule at src/prelude_lower.isle line 371. - let expr0_0 = ProducesFlags::ProducesFlagsSideEffect { - inst: pattern1_0.clone(), - }; - return expr0_0; - } - _ => {} - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "produces_flags_ignore", "src/prelude_lower.isle line 368" - ); -} - -// Generated as internal constructor for term consumes_flags_concat. -pub fn constructor_consumes_flags_concat( - ctx: &mut C, - arg0: &ConsumesFlags, - arg1: &ConsumesFlags, -) -> ConsumesFlags { - let pattern0_0 = arg0; - match pattern0_0 { - &ConsumesFlags::ConsumesFlagsSideEffect { - inst: ref pattern1_0, - } => { - let pattern2_0 = arg1; - if let &ConsumesFlags::ConsumesFlagsSideEffect { - inst: ref pattern3_0, - } = pattern2_0 - { - // Rule at src/prelude_lower.isle line 384. - let expr0_0 = ConsumesFlags::ConsumesFlagsSideEffect2 { - inst1: pattern1_0.clone(), - inst2: pattern3_0.clone(), - }; - return expr0_0; - } - } - &ConsumesFlags::ConsumesFlagsReturnsReg { - inst: ref pattern1_0, - result: pattern1_1, - } => { - let pattern2_0 = arg1; - if let &ConsumesFlags::ConsumesFlagsReturnsReg { - inst: ref pattern3_0, - result: pattern3_1, - } = pattern2_0 - { - // Rule at src/prelude_lower.isle line 378. - let expr0_0 = C::value_regs(ctx, pattern1_1, pattern3_1); - let expr1_0 = ConsumesFlags::ConsumesFlagsTwiceReturnsValueRegs { - inst1: pattern1_0.clone(), - inst2: pattern3_0.clone(), - result: expr0_0, - }; - return expr1_0; - } - } - _ => {} - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "consumes_flags_concat", "src/prelude_lower.isle line 377" - ); -} - -// Generated as internal constructor for term with_flags. -pub fn constructor_with_flags( - ctx: &mut C, - arg0: &ProducesFlags, - arg1: &ConsumesFlags, -) -> ValueRegs { - let pattern0_0 = arg0; - match pattern0_0 { - &ProducesFlags::ProducesFlagsSideEffect { - inst: ref pattern1_0, - } => { - let pattern2_0 = arg1; - match pattern2_0 { - &ConsumesFlags::ConsumesFlagsReturnsReg { - inst: ref pattern3_0, - result: pattern3_1, - } => { - // Rule at src/prelude_lower.isle line 415. - let expr0_0 = C::emit(ctx, pattern1_0); - let expr1_0 = C::emit(ctx, pattern3_0); - let expr2_0 = C::value_reg(ctx, pattern3_1); - return expr2_0; - } - &ConsumesFlags::ConsumesFlagsTwiceReturnsValueRegs { - inst1: ref pattern3_0, - inst2: ref pattern3_1, - result: pattern3_2, - } => { - // Rule at src/prelude_lower.isle line 421. - let expr0_0 = C::emit(ctx, pattern1_0); - let expr1_0 = C::emit(ctx, pattern3_0); - let expr2_0 = C::emit(ctx, pattern3_1); - return pattern3_2; - } - &ConsumesFlags::ConsumesFlagsFourTimesReturnsValueRegs { - inst1: ref pattern3_0, - inst2: ref pattern3_1, - inst3: ref pattern3_2, - inst4: ref pattern3_3, - result: pattern3_4, - } => { - // Rule at src/prelude_lower.isle line 433. - let expr0_0 = C::emit(ctx, pattern1_0); - let expr1_0 = C::emit(ctx, pattern3_0); - let expr2_0 = C::emit(ctx, pattern3_1); - let expr3_0 = C::emit(ctx, pattern3_2); - let expr4_0 = C::emit(ctx, pattern3_3); - return pattern3_4; - } - _ => {} - } - } - &ProducesFlags::ProducesFlagsReturnsResultWithConsumer { - inst: ref pattern1_0, - result: pattern1_1, - } => { - let pattern2_0 = arg1; - match pattern2_0 { - &ConsumesFlags::ConsumesFlagsSideEffect { - inst: ref pattern3_0, - } => { - // Rule at src/prelude_lower.isle line 409. - let expr0_0 = C::emit(ctx, pattern1_0); - let expr1_0 = C::emit(ctx, pattern3_0); - let expr2_0 = C::value_reg(ctx, pattern1_1); - return expr2_0; - } - &ConsumesFlags::ConsumesFlagsReturnsResultWithProducer { - inst: ref pattern3_0, - result: pattern3_1, - } => { - // Rule at src/prelude_lower.isle line 401. - let expr0_0 = C::emit(ctx, pattern1_0); - let expr1_0 = C::emit(ctx, pattern3_0); - let expr2_0 = C::value_regs(ctx, pattern1_1, pattern3_1); - return expr2_0; - } - _ => {} - } - } - &ProducesFlags::ProducesFlagsTwiceSideEffect { - inst1: ref pattern1_0, - inst2: ref pattern1_1, - } => { - let pattern2_0 = arg1; - match pattern2_0 { - &ConsumesFlags::ConsumesFlagsReturnsReg { - inst: ref pattern3_0, - result: pattern3_1, - } => { - // Rule at src/prelude_lower.isle line 449. - let expr0_0 = C::emit(ctx, pattern1_0); - let expr1_0 = C::emit(ctx, pattern1_1); - let expr2_0 = C::emit(ctx, pattern3_0); - let expr3_0 = C::value_reg(ctx, pattern3_1); - return expr3_0; - } - &ConsumesFlags::ConsumesFlagsTwiceReturnsValueRegs { - inst1: ref pattern3_0, - inst2: ref pattern3_1, - result: pattern3_2, - } => { - // Rule at src/prelude_lower.isle line 456. - let expr0_0 = C::emit(ctx, pattern1_0); - let expr1_0 = C::emit(ctx, pattern1_1); - let expr2_0 = C::emit(ctx, pattern3_0); - let expr3_0 = C::emit(ctx, pattern3_1); - return pattern3_2; - } - &ConsumesFlags::ConsumesFlagsFourTimesReturnsValueRegs { - inst1: ref pattern3_0, - inst2: ref pattern3_1, - inst3: ref pattern3_2, - inst4: ref pattern3_3, - result: pattern3_4, - } => { - // Rule at src/prelude_lower.isle line 469. - let expr0_0 = C::emit(ctx, pattern1_0); - let expr1_0 = C::emit(ctx, pattern1_1); - let expr2_0 = C::emit(ctx, pattern3_0); - let expr3_0 = C::emit(ctx, pattern3_1); - let expr4_0 = C::emit(ctx, pattern3_2); - let expr5_0 = C::emit(ctx, pattern3_3); - return pattern3_4; - } - _ => {} - } - } - _ => {} - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "with_flags", "src/prelude_lower.isle line 399" - ); -} - -// Generated as internal constructor for term with_flags_reg. -pub fn constructor_with_flags_reg( - ctx: &mut C, - arg0: &ProducesFlags, - arg1: &ConsumesFlags, -) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/prelude_lower.isle line 487. - let expr0_0 = constructor_with_flags(ctx, pattern0_0, pattern1_0); - let expr1_0: usize = 0i128 as usize; - let expr2_0 = C::value_regs_get(ctx, expr0_0, expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term flags_to_producesflags. -pub fn constructor_flags_to_producesflags(ctx: &mut C, arg0: Value) -> ProducesFlags { - let pattern0_0 = arg0; - // Rule at src/prelude_lower.isle line 494. - let expr0_0 = C::mark_value_used(ctx, pattern0_0); - let expr1_0 = ProducesFlags::AlreadyExistingFlags; - return expr1_0; -} - -// Generated as internal constructor for term with_flags_side_effect. -pub fn constructor_with_flags_side_effect( - ctx: &mut C, - arg0: &ProducesFlags, - arg1: &ConsumesFlags, -) -> SideEffectNoResult { - let pattern0_0 = arg0; - match pattern0_0 { - &ProducesFlags::AlreadyExistingFlags => { - let pattern2_0 = arg1; - match pattern2_0 { - &ConsumesFlags::ConsumesFlagsSideEffect { - inst: ref pattern3_0, - } => { - // Rule at src/prelude_lower.isle line 505. - let expr0_0 = SideEffectNoResult::Inst { - inst: pattern3_0.clone(), - }; - return expr0_0; - } - &ConsumesFlags::ConsumesFlagsSideEffect2 { - inst1: ref pattern3_0, - inst2: ref pattern3_1, - } => { - // Rule at src/prelude_lower.isle line 510. - let expr0_0 = SideEffectNoResult::Inst2 { - inst1: pattern3_0.clone(), - inst2: pattern3_1.clone(), - }; - return expr0_0; - } - _ => {} - } - } - &ProducesFlags::ProducesFlagsSideEffect { - inst: ref pattern1_0, - } => { - let pattern2_0 = arg1; - match pattern2_0 { - &ConsumesFlags::ConsumesFlagsSideEffect { - inst: ref pattern3_0, - } => { - // Rule at src/prelude_lower.isle line 515. - let expr0_0 = SideEffectNoResult::Inst2 { - inst1: pattern1_0.clone(), - inst2: pattern3_0.clone(), - }; - return expr0_0; - } - &ConsumesFlags::ConsumesFlagsSideEffect2 { - inst1: ref pattern3_0, - inst2: ref pattern3_1, - } => { - // Rule at src/prelude_lower.isle line 520. - let expr0_0 = SideEffectNoResult::Inst3 { - inst1: pattern1_0.clone(), - inst2: pattern3_0.clone(), - inst3: pattern3_1.clone(), - }; - return expr0_0; - } - _ => {} - } - } - &ProducesFlags::ProducesFlagsTwiceSideEffect { - inst1: ref pattern1_0, - inst2: ref pattern1_1, - } => { - let pattern2_0 = arg1; - if let &ConsumesFlags::ConsumesFlagsSideEffect { - inst: ref pattern3_0, - } = pattern2_0 - { - // Rule at src/prelude_lower.isle line 525. - let expr0_0 = SideEffectNoResult::Inst3 { - inst1: pattern1_0.clone(), - inst2: pattern1_1.clone(), - inst3: pattern3_0.clone(), - }; - return expr0_0; - } - } - _ => {} - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "with_flags_side_effect", "src/prelude_lower.isle line 503" - ); -} - -// Generated as internal constructor for term lower_return. -pub fn constructor_lower_return( - ctx: &mut C, - arg0: Range, - arg1: ValueSlice, -) -> InstOutput { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/prelude_lower.isle line 705. - let expr0_0 = C::gen_return(ctx, pattern1_0); - let expr1_0 = C::output_none(ctx); - return expr1_0; -} - -// Generated as internal constructor for term operand_size_bits. -pub fn constructor_operand_size_bits(ctx: &mut C, arg0: &OperandSize) -> u16 { - let pattern0_0 = arg0; - match pattern0_0 { - &OperandSize::Size8 => { - // Rule at src/isa/x64/inst.isle line 574. - let expr0_0: u16 = 8i128 as u16; - return expr0_0; - } - &OperandSize::Size16 => { - // Rule at src/isa/x64/inst.isle line 575. - let expr0_0: u16 = 16i128 as u16; - return expr0_0; - } - &OperandSize::Size32 => { - // Rule at src/isa/x64/inst.isle line 576. - let expr0_0: u16 = 32i128 as u16; - return expr0_0; - } - &OperandSize::Size64 => { - // Rule at src/isa/x64/inst.isle line 577. - let expr0_0: u16 = 64i128 as u16; - return expr0_0; - } - _ => {} - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "operand_size_bits", "src/isa/x64/inst.isle line 573" - ); -} - -// Generated as internal constructor for term reg_mem_to_reg_mem_imm. -pub fn constructor_reg_mem_to_reg_mem_imm(ctx: &mut C, arg0: &RegMem) -> RegMemImm { - let pattern0_0 = arg0; - match pattern0_0 { - &RegMem::Reg { reg: pattern1_0 } => { - // Rule at src/isa/x64/inst.isle line 806. - let expr0_0 = RegMemImm::Reg { reg: pattern1_0 }; - return expr0_0; - } - &RegMem::Mem { - addr: ref pattern1_0, - } => { - // Rule at src/isa/x64/inst.isle line 808. - let expr0_0 = RegMemImm::Mem { - addr: pattern1_0.clone(), - }; - return expr0_0; - } - _ => {} - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "reg_mem_to_reg_mem_imm", "src/isa/x64/inst.isle line 805" - ); -} - -// Generated as internal constructor for term amode_imm_reg_flags. -pub fn constructor_amode_imm_reg_flags( - ctx: &mut C, - arg0: u32, - arg1: Gpr, - arg2: MemFlags, -) -> Amode { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/x64/inst.isle line 860. - let expr0_0 = C::amode_imm_reg(ctx, pattern0_0, pattern1_0); - let expr1_0 = C::amode_with_flags(ctx, &expr0_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term amode_imm_reg_reg_shift_flags. -pub fn constructor_amode_imm_reg_reg_shift_flags( - ctx: &mut C, - arg0: u32, - arg1: Gpr, - arg2: Gpr, - arg3: u8, - arg4: MemFlags, -) -> Amode { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - let pattern4_0 = arg4; - // Rule at src/isa/x64/inst.isle line 867. - let expr0_0 = C::amode_imm_reg_reg_shift(ctx, pattern0_0, pattern1_0, pattern2_0, pattern3_0); - let expr1_0 = C::amode_with_flags(ctx, &expr0_0, pattern4_0); - return expr1_0; -} - -// Generated as internal constructor for term to_amode. -pub fn constructor_to_amode( - ctx: &mut C, - arg0: MemFlags, - arg1: Value, - arg2: Offset32, -) -> Amode { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/x64/inst.isle line 1043. - let expr0_0 = constructor_amode_initial(ctx, pattern0_0, pattern2_0); - let expr1_0 = constructor_amode_add(ctx, &expr0_0, pattern1_0); - let expr2_0 = constructor_amode_finalize(ctx, &expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term amode_initial. -pub fn constructor_amode_initial(ctx: &mut C, arg0: MemFlags, arg1: Offset32) -> Amode { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = C::offset32(ctx, pattern1_0); - // Rule at src/isa/x64/inst.isle line 937. - let expr0_0 = C::invalid_reg(ctx); - let expr1_0 = Amode::ImmReg { - simm32: pattern2_0, - base: expr0_0, - flags: pattern0_0, - }; - return expr1_0; -} - -// Generated as internal constructor for term amode_add. -pub fn constructor_amode_add(ctx: &mut C, arg0: &Amode, arg1: Value) -> Amode { - let pattern0_0 = arg0; - match pattern0_0 { - &Amode::ImmReg { - simm32: pattern1_0, - base: pattern1_1, - flags: pattern1_2, - } => { - let pattern2_0 = C::is_valid_reg(ctx, pattern1_1); - if pattern2_0 == true { - let pattern4_0 = arg1; - if let Some(pattern5_0) = C::def_inst(ctx, pattern4_0) { - let pattern6_0 = C::inst_data(ctx, pattern5_0); - if let &InstructionData::Unary { - opcode: ref pattern7_0, - arg: pattern7_1, - } = &pattern6_0 - { - if let &Opcode::Uextend = pattern7_0 { - if let Some(pattern9_0) = C::def_inst(ctx, pattern7_1) { - let pattern10_0 = C::inst_data(ctx, pattern9_0); - if let &InstructionData::Binary { - opcode: ref pattern11_0, - args: ref pattern11_1, - } = &pattern10_0 - { - if let &Opcode::Ishl = pattern11_0 { - let (pattern13_0, pattern13_1) = - C::unpack_value_array_2(ctx, pattern11_1); - if let Some(pattern14_0) = C::def_inst(ctx, pattern13_0) { - let pattern15_0 = C::inst_data(ctx, pattern14_0); - if let &InstructionData::Binary { - opcode: ref pattern16_0, - args: ref pattern16_1, - } = &pattern15_0 - { - if let &Opcode::Iadd = pattern16_0 { - let (pattern18_0, pattern18_1) = - C::unpack_value_array_2(ctx, pattern16_1); - if let Some(pattern19_0) = - C::def_inst(ctx, pattern13_1) - { - let pattern20_0 = - C::inst_data(ctx, pattern19_0); - if let &InstructionData::UnaryImm { - opcode: ref pattern21_0, - imm: pattern21_1, - } = &pattern20_0 - { - if let &Opcode::Iconst = pattern21_0 { - if let Some(pattern23_0) = - C::uimm8(ctx, pattern21_1) - { - let mut closure24 = || { - let expr0_0 = C::u8_as_u32( - ctx, - pattern23_0, - ); - let expr1_0: u32 = - 3i128 as u32; - let expr2_0 = C::u32_lteq( - ctx, expr0_0, expr1_0, - )?; - return Some(expr2_0); - }; - if let Some(pattern24_0) = - closure24() - { - // Rule at src/isa/x64/inst.isle line 988. - let expr0_0 = C::gpr_new( - ctx, pattern1_1, - ); - let expr1_0 = - constructor_put_in_gpr( - ctx, - pattern13_0, - ); - let expr2_0 = - Amode::ImmRegRegShift { - simm32: pattern1_0, - base: expr0_0, - index: expr1_0, - shift: pattern23_0, - flags: pattern1_2, - }; - return expr2_0; - } - } - } - } - } - } - } - } - } - } - } - } - } - } - } - let pattern2_0 = arg1; - if let Some(pattern3_0) = C::def_inst(ctx, pattern2_0) { - let pattern4_0 = C::inst_data(ctx, pattern3_0); - match &pattern4_0 { - &InstructionData::Unary { - opcode: ref pattern5_0, - arg: pattern5_1, - } => { - match pattern5_0 { - &Opcode::Uextend => { - if let Some(pattern7_0) = C::def_inst(ctx, pattern5_1) { - let pattern8_0 = C::inst_data(ctx, pattern7_0); - if let &InstructionData::UnaryImm { - opcode: ref pattern9_0, - imm: pattern9_1, - } = &pattern8_0 - { - if let &Opcode::Iconst = pattern9_0 { - if let Some(pattern11_0) = C::simm32(ctx, pattern9_1) { - if let Some(pattern12_0) = - C::u32_nonnegative(ctx, pattern11_0) - { - let mut closure13 = || { - let expr0_0 = C::s32_add_fallible( - ctx, - pattern1_0, - pattern12_0, - )?; - return Some(expr0_0); - }; - if let Some(pattern13_0) = closure13() { - // Rule at src/isa/x64/inst.isle line 1014. - let expr0_0 = Amode::ImmReg { - simm32: pattern13_0, - base: pattern1_1, - flags: pattern1_2, - }; - return expr0_0; - } - } - } - } - } - } - } - &Opcode::Sextend => { - if let Some(pattern7_0) = C::def_inst(ctx, pattern5_1) { - let pattern8_0 = C::inst_data(ctx, pattern7_0); - if let &InstructionData::UnaryImm { - opcode: ref pattern9_0, - imm: pattern9_1, - } = &pattern8_0 - { - if let &Opcode::Iconst = pattern9_0 { - if let Some(pattern11_0) = C::simm32(ctx, pattern9_1) { - let mut closure12 = || { - let expr0_0 = C::s32_add_fallible( - ctx, - pattern1_0, - pattern11_0, - )?; - return Some(expr0_0); - }; - if let Some(pattern12_0) = closure12() { - // Rule at src/isa/x64/inst.isle line 1024. - let expr0_0 = Amode::ImmReg { - simm32: pattern12_0, - base: pattern1_1, - flags: pattern1_2, - }; - return expr0_0; - } - } - } - } - } - } - _ => {} - } - } - &InstructionData::UnaryImm { - opcode: ref pattern5_0, - imm: pattern5_1, - } => { - if let &Opcode::Iconst = pattern5_0 { - if let Some(pattern7_0) = C::simm32(ctx, pattern5_1) { - let mut closure8 = || { - let expr0_0 = C::s32_add_fallible(ctx, pattern1_0, pattern7_0)?; - return Some(expr0_0); - }; - if let Some(pattern8_0) = closure8() { - // Rule at src/isa/x64/inst.isle line 1001. - let expr0_0 = Amode::ImmReg { - simm32: pattern8_0, - base: pattern1_1, - flags: pattern1_2, - }; - return expr0_0; - } - } - } - } - _ => {} - } - } - } - &Amode::ImmRegRegShift { - simm32: pattern1_0, - base: pattern1_1, - index: pattern1_2, - shift: pattern1_3, - flags: pattern1_4, - } => { - let pattern2_0 = arg1; - if let Some(pattern3_0) = C::def_inst(ctx, pattern2_0) { - let pattern4_0 = C::inst_data(ctx, pattern3_0); - match &pattern4_0 { - &InstructionData::Unary { - opcode: ref pattern5_0, - arg: pattern5_1, - } => { - match pattern5_0 { - &Opcode::Uextend => { - if let Some(pattern7_0) = C::def_inst(ctx, pattern5_1) { - let pattern8_0 = C::inst_data(ctx, pattern7_0); - if let &InstructionData::UnaryImm { - opcode: ref pattern9_0, - imm: pattern9_1, - } = &pattern8_0 - { - if let &Opcode::Iconst = pattern9_0 { - if let Some(pattern11_0) = C::simm32(ctx, pattern9_1) { - if let Some(pattern12_0) = - C::u32_nonnegative(ctx, pattern11_0) - { - let mut closure13 = || { - let expr0_0 = C::s32_add_fallible( - ctx, - pattern1_0, - pattern12_0, - )?; - return Some(expr0_0); - }; - if let Some(pattern13_0) = closure13() { - // Rule at src/isa/x64/inst.isle line 1018. - let expr0_0 = Amode::ImmRegRegShift { - simm32: pattern13_0, - base: pattern1_1, - index: pattern1_2, - shift: pattern1_3, - flags: pattern1_4, - }; - return expr0_0; - } - } - } - } - } - } - } - &Opcode::Sextend => { - if let Some(pattern7_0) = C::def_inst(ctx, pattern5_1) { - let pattern8_0 = C::inst_data(ctx, pattern7_0); - if let &InstructionData::UnaryImm { - opcode: ref pattern9_0, - imm: pattern9_1, - } = &pattern8_0 - { - if let &Opcode::Iconst = pattern9_0 { - if let Some(pattern11_0) = C::simm32(ctx, pattern9_1) { - let mut closure12 = || { - let expr0_0 = C::s32_add_fallible( - ctx, - pattern1_0, - pattern11_0, - )?; - return Some(expr0_0); - }; - if let Some(pattern12_0) = closure12() { - // Rule at src/isa/x64/inst.isle line 1028. - let expr0_0 = Amode::ImmRegRegShift { - simm32: pattern12_0, - base: pattern1_1, - index: pattern1_2, - shift: pattern1_3, - flags: pattern1_4, - }; - return expr0_0; - } - } - } - } - } - } - _ => {} - } - } - &InstructionData::UnaryImm { - opcode: ref pattern5_0, - imm: pattern5_1, - } => { - if let &Opcode::Iconst = pattern5_0 { - if let Some(pattern7_0) = C::simm32(ctx, pattern5_1) { - let mut closure8 = || { - let expr0_0 = C::s32_add_fallible(ctx, pattern1_0, pattern7_0)?; - return Some(expr0_0); - }; - if let Some(pattern8_0) = closure8() { - // Rule at src/isa/x64/inst.isle line 1005. - let expr0_0 = Amode::ImmRegRegShift { - simm32: pattern8_0, - base: pattern1_1, - index: pattern1_2, - shift: pattern1_3, - flags: pattern1_4, - }; - return expr0_0; - } - } - } - } - _ => {} - } - } - } - _ => {} - } - let pattern0_0 = arg0; - if let &Amode::ImmReg { - simm32: pattern1_0, - base: pattern1_1, - flags: pattern1_2, - } = pattern0_0 - { - let pattern2_0 = C::is_valid_reg(ctx, pattern1_1); - if pattern2_0 == true { - let pattern4_0 = arg1; - if let Some(pattern5_0) = C::def_inst(ctx, pattern4_0) { - let pattern6_0 = C::inst_data(ctx, pattern5_0); - match &pattern6_0 { - &InstructionData::Unary { - opcode: ref pattern7_0, - arg: pattern7_1, - } => { - if let &Opcode::Uextend = pattern7_0 { - if let Some(pattern9_0) = C::def_inst(ctx, pattern7_1) { - let pattern10_0 = C::inst_data(ctx, pattern9_0); - if let &InstructionData::Binary { - opcode: ref pattern11_0, - args: ref pattern11_1, - } = &pattern10_0 - { - if let &Opcode::Ishl = pattern11_0 { - let (pattern13_0, pattern13_1) = - C::unpack_value_array_2(ctx, pattern11_1); - if let Some(pattern14_0) = C::def_inst(ctx, pattern13_1) { - let pattern15_0 = C::inst_data(ctx, pattern14_0); - if let &InstructionData::UnaryImm { - opcode: ref pattern16_0, - imm: pattern16_1, - } = &pattern15_0 - { - if let &Opcode::Iconst = pattern16_0 { - if let Some(pattern18_0) = - C::uimm8(ctx, pattern16_1) - { - let mut closure19 = || { - let expr0_0 = - C::u8_as_u32(ctx, pattern18_0); - let expr1_0: u32 = 3i128 as u32; - let expr2_0 = - C::u32_lteq(ctx, expr0_0, expr1_0)?; - return Some(expr2_0); - }; - if let Some(pattern19_0) = closure19() { - // Rule at src/isa/x64/inst.isle line 978. - let expr0_0 = - C::gpr_new(ctx, pattern1_1); - let expr1_0: Type = I64; - let expr2_0 = ExtendKind::Zero; - let expr3_0 = constructor_extend_to_gpr( - ctx, - pattern13_0, - expr1_0, - &expr2_0, - ); - let expr4_0 = Amode::ImmRegRegShift { - simm32: pattern1_0, - base: expr0_0, - index: expr3_0, - shift: pattern18_0, - flags: pattern1_2, - }; - return expr4_0; - } - } - } - } - } - } - } - } - } - } - &InstructionData::Binary { - opcode: ref pattern7_0, - args: ref pattern7_1, - } => { - if let &Opcode::Ishl = pattern7_0 { - let (pattern9_0, pattern9_1) = C::unpack_value_array_2(ctx, pattern7_1); - if let Some(pattern10_0) = C::def_inst(ctx, pattern9_1) { - let pattern11_0 = C::inst_data(ctx, pattern10_0); - if let &InstructionData::UnaryImm { - opcode: ref pattern12_0, - imm: pattern12_1, - } = &pattern11_0 - { - if let &Opcode::Iconst = pattern12_0 { - if let Some(pattern14_0) = C::uimm8(ctx, pattern12_1) { - let mut closure15 = || { - let expr0_0 = C::u8_as_u32(ctx, pattern14_0); - let expr1_0: u32 = 3i128 as u32; - let expr2_0 = C::u32_lteq(ctx, expr0_0, expr1_0)?; - return Some(expr2_0); - }; - if let Some(pattern15_0) = closure15() { - // Rule at src/isa/x64/inst.isle line 975. - let expr0_0 = C::gpr_new(ctx, pattern1_1); - let expr1_0 = - constructor_put_in_gpr(ctx, pattern9_0); - let expr2_0 = Amode::ImmRegRegShift { - simm32: pattern1_0, - base: expr0_0, - index: expr1_0, - shift: pattern14_0, - flags: pattern1_2, - }; - return expr2_0; - } - } - } - } - } - } - } - _ => {} - } - } - } - } - let pattern1_0 = arg1; - if let Some(pattern2_0) = C::def_inst(ctx, pattern1_0) { - let pattern3_0 = C::inst_data(ctx, pattern2_0); - if let &InstructionData::Binary { - opcode: ref pattern4_0, - args: ref pattern4_1, - } = &pattern3_0 - { - if let &Opcode::Iadd = pattern4_0 { - let (pattern6_0, pattern6_1) = C::unpack_value_array_2(ctx, pattern4_1); - // Rule at src/isa/x64/inst.isle line 951. - let expr0_0 = constructor_amode_add(ctx, pattern0_0, pattern6_0); - let expr1_0 = constructor_amode_add(ctx, &expr0_0, pattern6_1); - return expr1_0; - } - } - } - let pattern0_0 = arg0; - match pattern0_0 { - &Amode::ImmReg { - simm32: pattern1_0, - base: pattern1_1, - flags: pattern1_2, - } => { - let pattern2_0 = C::is_valid_reg(ctx, pattern1_1); - if pattern2_0 == true { - let pattern4_0 = arg1; - // Rule at src/isa/x64/inst.isle line 966. - let expr0_0 = C::gpr_new(ctx, pattern1_1); - let expr1_0 = constructor_put_in_gpr(ctx, pattern4_0); - let expr2_0: u8 = 0i128 as u8; - let expr3_0 = Amode::ImmRegRegShift { - simm32: pattern1_0, - base: expr0_0, - index: expr1_0, - shift: expr2_0, - flags: pattern1_2, - }; - return expr3_0; - } - if pattern2_0 == false { - let pattern4_0 = arg1; - // Rule at src/isa/x64/inst.isle line 960. - let expr0_0 = C::put_in_reg(ctx, pattern4_0); - let expr1_0 = Amode::ImmReg { - simm32: pattern1_0, - base: expr0_0, - flags: pattern1_2, - }; - return expr1_0; - } - } - &Amode::ImmRegRegShift { - simm32: pattern1_0, - base: pattern1_1, - index: pattern1_2, - shift: pattern1_3, - flags: pattern1_4, - } => { - let pattern2_0 = arg1; - // Rule at src/isa/x64/inst.isle line 1038. - let expr0_0: Type = I64; - let expr1_0 = constructor_put_in_gpr_mem_imm(ctx, pattern2_0); - let expr2_0 = constructor_x64_add(ctx, expr0_0, pattern1_1, &expr1_0); - let expr3_0 = Amode::ImmRegRegShift { - simm32: pattern1_0, - base: expr2_0, - index: pattern1_2, - shift: pattern1_3, - flags: pattern1_4, - }; - return expr3_0; - } - _ => {} - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "amode_add", "src/isa/x64/inst.isle line 942" - ); -} - -// Generated as internal constructor for term amode_finalize. -pub fn constructor_amode_finalize(ctx: &mut C, arg0: &Amode) -> Amode { - let pattern0_0 = arg0; - if let &Amode::ImmReg { - simm32: pattern1_0, - base: pattern1_1, - flags: pattern1_2, - } = pattern0_0 - { - let pattern2_0 = C::is_valid_reg(ctx, pattern1_1); - if pattern2_0 == false { - // Rule at src/isa/x64/inst.isle line 1050. - let expr0_0: Type = I64; - let expr1_0: u64 = 0i128 as u64; - let expr2_0 = constructor_imm(ctx, expr0_0, expr1_0); - let expr3_0 = Amode::ImmReg { - simm32: pattern1_0, - base: expr2_0, - flags: pattern1_2, - }; - return expr3_0; - } - } - let pattern0_0 = arg0; - // Rule at src/isa/x64/inst.isle line 1052. - return pattern0_0.clone(); -} - -// Generated as internal constructor for term put_masked_in_imm8_gpr. -pub fn constructor_put_masked_in_imm8_gpr( - ctx: &mut C, - arg0: Value, - arg1: Type, -) -> Imm8Gpr { - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::def_inst(ctx, pattern0_0) { - let pattern2_0 = C::inst_data(ctx, pattern1_0); - if let &InstructionData::UnaryImm { - opcode: ref pattern3_0, - imm: pattern3_1, - } = &pattern2_0 - { - if let &Opcode::Iconst = pattern3_0 { - let pattern5_0 = C::u64_from_imm64(ctx, pattern3_1); - let pattern6_0 = arg1; - // Rule at src/isa/x64/inst.isle line 1087. - let expr0_0 = C::const_to_type_masked_imm8(ctx, pattern5_0, pattern6_0); - return expr0_0; - } - } - } - let pattern0_0 = arg0; - let pattern1_0 = arg1; - if let Some(pattern2_0) = C::fits_in_16(ctx, pattern1_0) { - // Rule at src/isa/x64/inst.isle line 1089. - let expr0_0: Type = I64; - let expr1_0 = C::put_in_regs(ctx, pattern0_0); - let expr2_0: usize = 0i128 as usize; - let expr3_0 = constructor_value_regs_get_gpr(ctx, expr1_0, expr2_0); - let expr4_0 = C::shift_mask(ctx, pattern2_0); - let expr5_0 = RegMemImm::Imm { simm32: expr4_0 }; - let expr6_0 = C::gpr_mem_imm_new(ctx, &expr5_0); - let expr7_0 = constructor_x64_and(ctx, expr0_0, expr3_0, &expr6_0); - let expr8_0 = C::gpr_to_imm8_gpr(ctx, expr7_0); - return expr8_0; - } - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 1091. - let expr0_0 = C::put_in_regs(ctx, pattern0_0); - let expr1_0: usize = 0i128 as usize; - let expr2_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr1_0); - let expr3_0 = C::gpr_to_imm8_gpr(ctx, expr2_0); - return expr3_0; -} - -// Generated as internal constructor for term reg_to_gpr_mem_imm. -pub fn constructor_reg_to_gpr_mem_imm(ctx: &mut C, arg0: Reg) -> GprMemImm { - let pattern0_0 = arg0; - // Rule at src/isa/x64/inst.isle line 1287. - let expr0_0 = C::gpr_new(ctx, pattern0_0); - let expr1_0 = C::gpr_to_gpr_mem_imm(ctx, expr0_0); - return expr1_0; -} - -// Generated as internal constructor for term put_in_gpr. -pub fn constructor_put_in_gpr(ctx: &mut C, arg0: Value) -> Gpr { - let pattern0_0 = arg0; - // Rule at src/isa/x64/inst.isle line 1294. - let expr0_0 = C::put_in_reg(ctx, pattern0_0); - let expr1_0 = C::gpr_new(ctx, expr0_0); - return expr1_0; -} - -// Generated as internal constructor for term put_in_gpr_mem. -pub fn constructor_put_in_gpr_mem(ctx: &mut C, arg0: Value) -> GprMem { - let pattern0_0 = arg0; - // Rule at src/isa/x64/inst.isle line 1301. - let expr0_0 = C::put_in_reg_mem(ctx, pattern0_0); - let expr1_0 = C::reg_mem_to_gpr_mem(ctx, &expr0_0); - return expr1_0; -} - -// Generated as internal constructor for term put_in_gpr_mem_imm. -pub fn constructor_put_in_gpr_mem_imm(ctx: &mut C, arg0: Value) -> GprMemImm { - let pattern0_0 = arg0; - // Rule at src/isa/x64/inst.isle line 1308. - let expr0_0 = C::put_in_reg_mem_imm(ctx, pattern0_0); - let expr1_0 = C::gpr_mem_imm_new(ctx, &expr0_0); - return expr1_0; -} - -// Generated as internal constructor for term put_in_xmm. -pub fn constructor_put_in_xmm(ctx: &mut C, arg0: Value) -> Xmm { - let pattern0_0 = arg0; - // Rule at src/isa/x64/inst.isle line 1315. - let expr0_0 = C::put_in_reg(ctx, pattern0_0); - let expr1_0 = C::xmm_new(ctx, expr0_0); - return expr1_0; -} - -// Generated as internal constructor for term output_gpr. -pub fn constructor_output_gpr(ctx: &mut C, arg0: Gpr) -> InstOutput { - let pattern0_0 = arg0; - // Rule at src/isa/x64/inst.isle line 1332. - let expr0_0 = C::gpr_to_reg(ctx, pattern0_0); - let expr1_0 = constructor_output_reg(ctx, expr0_0); - return expr1_0; -} - -// Generated as internal constructor for term value_gprs. -pub fn constructor_value_gprs(ctx: &mut C, arg0: Gpr, arg1: Gpr) -> ValueRegs { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 1337. - let expr0_0 = C::gpr_to_reg(ctx, pattern0_0); - let expr1_0 = C::gpr_to_reg(ctx, pattern1_0); - let expr2_0 = C::value_regs(ctx, expr0_0, expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term output_xmm. -pub fn constructor_output_xmm(ctx: &mut C, arg0: Xmm) -> InstOutput { - let pattern0_0 = arg0; - // Rule at src/isa/x64/inst.isle line 1342. - let expr0_0 = C::xmm_to_reg(ctx, pattern0_0); - let expr1_0 = constructor_output_reg(ctx, expr0_0); - return expr1_0; -} - -// Generated as internal constructor for term value_regs_get_gpr. -pub fn constructor_value_regs_get_gpr( - ctx: &mut C, - arg0: ValueRegs, - arg1: usize, -) -> Gpr { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 1349. - let expr0_0 = C::value_regs_get(ctx, pattern0_0, pattern1_0); - let expr1_0 = C::gpr_new(ctx, expr0_0); - return expr1_0; -} - -// Generated as internal constructor for term lo_gpr. -pub fn constructor_lo_gpr(ctx: &mut C, arg0: Value) -> Gpr { - let pattern0_0 = arg0; - // Rule at src/isa/x64/inst.isle line 1362. - let expr0_0 = constructor_lo_reg(ctx, pattern0_0); - let expr1_0 = C::gpr_new(ctx, expr0_0); - return expr1_0; -} - -// Generated as internal constructor for term sink_load_to_gpr_mem_imm. -pub fn constructor_sink_load_to_gpr_mem_imm( - ctx: &mut C, - arg0: &SinkableLoad, -) -> GprMemImm { - let pattern0_0 = arg0; - // Rule at src/isa/x64/inst.isle line 1471. - let expr0_0 = C::sink_load(ctx, pattern0_0); - let expr1_0 = constructor_reg_mem_to_reg_mem_imm(ctx, &expr0_0); - let expr2_0 = C::gpr_mem_imm_new(ctx, &expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term sink_load_to_xmm_mem. -pub fn constructor_sink_load_to_xmm_mem(ctx: &mut C, arg0: &SinkableLoad) -> XmmMem { - let pattern0_0 = arg0; - // Rule at src/isa/x64/inst.isle line 1475. - let expr0_0 = C::sink_load(ctx, pattern0_0); - let expr1_0 = C::reg_mem_to_xmm_mem(ctx, &expr0_0); - return expr1_0; -} - -// Generated as internal constructor for term extend_to_gpr. -pub fn constructor_extend_to_gpr( - ctx: &mut C, - arg0: Value, - arg1: Type, - arg2: &ExtendKind, -) -> Gpr { - let pattern0_0 = arg0; - let pattern1_0 = C::value_type(ctx, pattern0_0); - let pattern2_0 = arg1; - if pattern2_0 == pattern1_0 { - let pattern4_0 = arg2; - // Rule at src/isa/x64/inst.isle line 1500. - let expr0_0 = constructor_put_in_gpr(ctx, pattern0_0); - return expr0_0; - } - let pattern0_0 = arg0; - let pattern1_0 = C::value_type(ctx, pattern0_0); - let pattern2_0 = arg1; - let pattern3_0 = arg2; - // Rule at src/isa/x64/inst.isle line 1503. - let expr0_0 = C::ty_bits_u16(ctx, pattern1_0); - let expr1_0 = C::operand_size_of_type_32_64(ctx, pattern2_0); - let expr2_0 = constructor_operand_size_bits(ctx, &expr1_0); - let expr3_0 = C::ext_mode(ctx, expr0_0, expr2_0); - let expr4_0 = constructor_put_in_gpr_mem(ctx, pattern0_0); - let expr5_0 = constructor_extend(ctx, pattern3_0, pattern2_0, &expr3_0, &expr4_0); - return expr5_0; -} - -// Generated as internal constructor for term extend. -pub fn constructor_extend( - ctx: &mut C, - arg0: &ExtendKind, - arg1: Type, - arg2: &ExtMode, - arg3: &GprMem, -) -> Gpr { - let pattern0_0 = arg0; - match pattern0_0 { - &ExtendKind::Sign => { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - let pattern4_0 = arg3; - // Rule at src/isa/x64/inst.isle line 1523. - let expr0_0 = constructor_x64_movsx(ctx, pattern3_0, pattern4_0); - return expr0_0; - } - &ExtendKind::Zero => { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - let pattern4_0 = arg3; - // Rule at src/isa/x64/inst.isle line 1519. - let expr0_0 = constructor_x64_movzx(ctx, pattern3_0, pattern4_0); - return expr0_0; - } - _ => {} - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "extend", "src/isa/x64/inst.isle line 1516" - ); -} - -// Generated as internal constructor for term vec_int_type. -pub fn constructor_vec_int_type(ctx: &mut C, arg0: Type) -> Type { - let pattern0_0 = arg0; - if let Some((pattern1_0, pattern1_1)) = C::multi_lane(ctx, pattern0_0) { - if pattern1_0 == 8i128 as u32 { - if pattern1_1 == 16i128 as u32 { - // Rule at src/isa/x64/inst.isle line 1530. - let expr0_0: Type = I8X16; - return expr0_0; - } - } - if pattern1_0 == 16i128 as u32 { - if pattern1_1 == 8i128 as u32 { - // Rule at src/isa/x64/inst.isle line 1531. - let expr0_0: Type = I16X8; - return expr0_0; - } - } - if pattern1_0 == 32i128 as u32 { - if pattern1_1 == 4i128 as u32 { - // Rule at src/isa/x64/inst.isle line 1532. - let expr0_0: Type = I32X4; - return expr0_0; - } - } - if pattern1_0 == 64i128 as u32 { - if pattern1_1 == 2i128 as u32 { - // Rule at src/isa/x64/inst.isle line 1533. - let expr0_0: Type = I64X2; - return expr0_0; - } - } - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "vec_int_type", "src/isa/x64/inst.isle line 1529" - ); -} - -// Generated as internal constructor for term sse_xor_op. -pub fn constructor_sse_xor_op(ctx: &mut C, arg0: Type) -> SseOpcode { - let pattern0_0 = arg0; - if pattern0_0 == F32 { - // Rule at src/isa/x64/inst.isle line 1539. - let expr0_0 = SseOpcode::Xorps; - return expr0_0; - } - if pattern0_0 == F64 { - // Rule at src/isa/x64/inst.isle line 1540. - let expr0_0 = SseOpcode::Xorpd; - return expr0_0; - } - if pattern0_0 == F32X4 { - // Rule at src/isa/x64/inst.isle line 1537. - let expr0_0 = SseOpcode::Xorps; - return expr0_0; - } - if pattern0_0 == F64X2 { - // Rule at src/isa/x64/inst.isle line 1538. - let expr0_0 = SseOpcode::Xorpd; - return expr0_0; - } - let pattern0_0 = arg0; - if let Some((pattern1_0, pattern1_1)) = C::multi_lane(ctx, pattern0_0) { - // Rule at src/isa/x64/inst.isle line 1544. - let expr0_0 = SseOpcode::Pxor; - return expr0_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "sse_xor_op", "src/isa/x64/inst.isle line 1536" - ); -} - -// Generated as internal constructor for term sse_xor. -pub fn constructor_sse_xor(ctx: &mut C, arg0: Type, arg1: Xmm, arg2: &XmmMem) -> Xmm { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/x64/inst.isle line 1548. - let expr0_0 = constructor_sse_xor_op(ctx, pattern0_0); - let expr1_0 = constructor_xmm_rm_r(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term vector_all_ones. -pub fn constructor_vector_all_ones(ctx: &mut C) -> Xmm { - // Rule at src/isa/x64/inst.isle line 1560. - let expr0_0 = C::temp_writable_xmm(ctx); - let expr1_0 = C::writable_xmm_to_xmm(ctx, expr0_0); - let expr2_0 = constructor_writable_xmm_to_xmm_mem(ctx, expr0_0); - let expr3_0 = constructor_x64_pcmpeqd(ctx, expr1_0, &expr2_0); - return expr3_0; -} - -// Generated as internal constructor for term xmm_uninit_value. -pub fn constructor_xmm_uninit_value(ctx: &mut C) -> Xmm { - // Rule at src/isa/x64/inst.isle line 1566. - let expr0_0 = C::temp_writable_xmm(ctx); - let expr1_0 = MInst::XmmUninitializedValue { dst: expr0_0 }; - let expr2_0 = C::emit(ctx, &expr1_0); - let expr3_0 = C::writable_xmm_to_xmm(ctx, expr0_0); - return expr3_0; -} - -// Generated as internal constructor for term make_i64x2_from_lanes. -pub fn constructor_make_i64x2_from_lanes( - ctx: &mut C, - arg0: &GprMem, - arg1: &GprMem, -) -> Xmm { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 1573. - let expr0_0 = constructor_xmm_uninit_value(ctx); - let expr1_0: u8 = 0i128 as u8; - let expr2_0 = OperandSize::Size64; - let expr3_0 = constructor_x64_pinsrd(ctx, expr0_0, pattern0_0, expr1_0, &expr2_0); - let expr4_0: u8 = 1i128 as u8; - let expr5_0 = OperandSize::Size64; - let expr6_0 = constructor_x64_pinsrd(ctx, expr3_0, pattern1_0, expr4_0, &expr5_0); - return expr6_0; -} - -// Generated as internal constructor for term mov_rmi_to_xmm. -pub fn constructor_mov_rmi_to_xmm(ctx: &mut C, arg0: &RegMemImm) -> XmmMemImm { - let pattern0_0 = arg0; - match pattern0_0 { - &RegMemImm::Imm { simm32: pattern1_0 } => { - // Rule at src/isa/x64/inst.isle line 1582. - let expr0_0 = C::xmm_mem_imm_new(ctx, pattern0_0); - return expr0_0; - } - &RegMemImm::Reg { reg: pattern1_0 } => { - // Rule at src/isa/x64/inst.isle line 1583. - let expr0_0 = SseOpcode::Movd; - let expr1_0 = C::reg_to_gpr_mem(ctx, pattern1_0); - let expr2_0 = OperandSize::Size32; - let expr3_0 = constructor_gpr_to_xmm(ctx, &expr0_0, &expr1_0, &expr2_0); - let expr4_0 = C::xmm_to_xmm_mem_imm(ctx, expr3_0); - return expr4_0; - } - &RegMemImm::Mem { - addr: ref pattern1_0, - } => { - // Rule at src/isa/x64/inst.isle line 1581. - let expr0_0 = C::xmm_mem_imm_new(ctx, pattern0_0); - return expr0_0; - } - _ => {} - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "mov_rmi_to_xmm", "src/isa/x64/inst.isle line 1580" - ); -} - -// Generated as internal constructor for term load_ext_name. -pub fn constructor_load_ext_name(ctx: &mut C, arg0: ExternalName, arg1: i64) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 1600. - let expr0_0 = C::temp_writable_gpr(ctx); - let expr1_0 = C::writable_gpr_to_reg(ctx, expr0_0); - let expr2_0 = C::box_external_name(ctx, pattern0_0); - let expr3_0 = MInst::LoadExtName { - dst: expr1_0, - name: expr2_0, - offset: pattern1_0, - }; - let expr4_0 = C::emit(ctx, &expr3_0); - let expr5_0 = constructor_writable_gpr_to_r_reg(ctx, expr0_0); - return expr5_0; -} - -// Generated as internal constructor for term x64_load. -pub fn constructor_x64_load( - ctx: &mut C, - arg0: Type, - arg1: &SyntheticAmode, - arg2: &ExtKind, -) -> Reg { - let pattern0_0 = arg0; - if pattern0_0 == I64 { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - // Rule at src/isa/x64/inst.isle line 1612. - let expr0_0 = C::temp_writable_gpr(ctx); - let expr1_0 = MInst::Mov64MR { - src: pattern2_0.clone(), - dst: expr0_0, - }; - let expr2_0 = C::emit(ctx, &expr1_0); - let expr3_0 = constructor_writable_gpr_to_r_reg(ctx, expr0_0); - return expr3_0; - } - if pattern0_0 == F32 { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - // Rule at src/isa/x64/inst.isle line 1617. - let expr0_0 = SseOpcode::Movss; - let expr1_0 = constructor_synthetic_amode_to_xmm_mem(ctx, pattern2_0); - let expr2_0 = constructor_xmm_unary_rm_r(ctx, &expr0_0, &expr1_0); - let expr3_0 = C::xmm_to_reg(ctx, expr2_0); - return expr3_0; - } - if pattern0_0 == F64 { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - // Rule at src/isa/x64/inst.isle line 1621. - let expr0_0 = SseOpcode::Movsd; - let expr1_0 = constructor_synthetic_amode_to_xmm_mem(ctx, pattern2_0); - let expr2_0 = constructor_xmm_unary_rm_r(ctx, &expr0_0, &expr1_0); - let expr3_0 = C::xmm_to_reg(ctx, expr2_0); - return expr3_0; - } - if pattern0_0 == F32X4 { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - // Rule at src/isa/x64/inst.isle line 1625. - let expr0_0 = SseOpcode::Movups; - let expr1_0 = constructor_synthetic_amode_to_xmm_mem(ctx, pattern2_0); - let expr2_0 = constructor_xmm_unary_rm_r(ctx, &expr0_0, &expr1_0); - let expr3_0 = C::xmm_to_reg(ctx, expr2_0); - return expr3_0; - } - if pattern0_0 == F64X2 { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - // Rule at src/isa/x64/inst.isle line 1629. - let expr0_0 = SseOpcode::Movupd; - let expr1_0 = constructor_synthetic_amode_to_xmm_mem(ctx, pattern2_0); - let expr2_0 = constructor_xmm_unary_rm_r(ctx, &expr0_0, &expr1_0); - let expr3_0 = C::xmm_to_reg(ctx, expr2_0); - return expr3_0; - } - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::fits_in_32(ctx, pattern0_0) { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - if let &ExtKind::SignExtend = pattern3_0 { - // Rule at src/isa/x64/inst.isle line 1608. - let expr0_0 = C::ty_bytes(ctx, pattern1_0); - let expr1_0: u16 = 8i128 as u16; - let expr2_0 = C::ext_mode(ctx, expr0_0, expr1_0); - let expr3_0 = constructor_synthetic_amode_to_gpr_mem(ctx, pattern2_0); - let expr4_0 = constructor_x64_movsx(ctx, &expr2_0, &expr3_0); - let expr5_0 = C::gpr_to_reg(ctx, expr4_0); - return expr5_0; - } - } - let pattern0_0 = arg0; - if let Some((pattern1_0, pattern1_1)) = C::multi_lane(ctx, pattern0_0) { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - // Rule at src/isa/x64/inst.isle line 1633. - let expr0_0 = SseOpcode::Movdqu; - let expr1_0 = constructor_synthetic_amode_to_xmm_mem(ctx, pattern2_0); - let expr2_0 = constructor_xmm_unary_rm_r(ctx, &expr0_0, &expr1_0); - let expr3_0 = C::xmm_to_reg(ctx, expr2_0); - return expr3_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "x64_load", "src/isa/x64/inst.isle line 1606" - ); -} - -// Generated as internal constructor for term x64_mov. -pub fn constructor_x64_mov(ctx: &mut C, arg0: &Amode) -> Reg { - let pattern0_0 = arg0; - // Rule at src/isa/x64/inst.isle line 1637. - let expr0_0 = C::temp_writable_gpr(ctx); - let expr1_0 = C::amode_to_synthetic_amode(ctx, pattern0_0); - let expr2_0 = MInst::Mov64MR { - src: expr1_0, - dst: expr0_0, - }; - let expr3_0 = C::emit(ctx, &expr2_0); - let expr4_0 = constructor_writable_gpr_to_r_reg(ctx, expr0_0); - return expr4_0; -} - -// Generated as internal constructor for term x64_movzx. -pub fn constructor_x64_movzx(ctx: &mut C, arg0: &ExtMode, arg1: &GprMem) -> Gpr { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 1643. - let expr0_0 = C::temp_writable_gpr(ctx); - let expr1_0 = MInst::MovzxRmR { - ext_mode: pattern0_0.clone(), - src: pattern1_0.clone(), - dst: expr0_0, - }; - let expr2_0 = C::emit(ctx, &expr1_0); - let expr3_0 = C::writable_gpr_to_gpr(ctx, expr0_0); - return expr3_0; -} - -// Generated as internal constructor for term x64_movsx. -pub fn constructor_x64_movsx(ctx: &mut C, arg0: &ExtMode, arg1: &GprMem) -> Gpr { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 1649. - let expr0_0 = C::temp_writable_gpr(ctx); - let expr1_0 = MInst::MovsxRmR { - ext_mode: pattern0_0.clone(), - src: pattern1_0.clone(), - dst: expr0_0, - }; - let expr2_0 = C::emit(ctx, &expr1_0); - let expr3_0 = C::writable_gpr_to_gpr(ctx, expr0_0); - return expr3_0; -} - -// Generated as internal constructor for term x64_movss_load. -pub fn constructor_x64_movss_load(ctx: &mut C, arg0: &XmmMem) -> Xmm { - let pattern0_0 = arg0; - // Rule at src/isa/x64/inst.isle line 1655. - let expr0_0 = SseOpcode::Movss; - let expr1_0 = constructor_xmm_unary_rm_r(ctx, &expr0_0, pattern0_0); - return expr1_0; -} - -// Generated as internal constructor for term x64_movsd_load. -pub fn constructor_x64_movsd_load(ctx: &mut C, arg0: &XmmMem) -> Xmm { - let pattern0_0 = arg0; - // Rule at src/isa/x64/inst.isle line 1659. - let expr0_0 = SseOpcode::Movsd; - let expr1_0 = constructor_xmm_unary_rm_r(ctx, &expr0_0, pattern0_0); - return expr1_0; -} - -// Generated as internal constructor for term x64_movups. -pub fn constructor_x64_movups(ctx: &mut C, arg0: &XmmMem) -> Xmm { - let pattern0_0 = arg0; - // Rule at src/isa/x64/inst.isle line 1663. - let expr0_0 = SseOpcode::Movups; - let expr1_0 = constructor_xmm_unary_rm_r(ctx, &expr0_0, pattern0_0); - return expr1_0; -} - -// Generated as internal constructor for term x64_movupd. -pub fn constructor_x64_movupd(ctx: &mut C, arg0: &XmmMem) -> Xmm { - let pattern0_0 = arg0; - // Rule at src/isa/x64/inst.isle line 1667. - let expr0_0 = SseOpcode::Movupd; - let expr1_0 = constructor_xmm_unary_rm_r(ctx, &expr0_0, pattern0_0); - return expr1_0; -} - -// Generated as internal constructor for term x64_movd. -pub fn constructor_x64_movd(ctx: &mut C, arg0: Xmm) -> Gpr { - let pattern0_0 = arg0; - // Rule at src/isa/x64/inst.isle line 1671. - let expr0_0 = SseOpcode::Movd; - let expr1_0 = OperandSize::Size32; - let expr2_0 = constructor_xmm_to_gpr(ctx, &expr0_0, pattern0_0, &expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term x64_movdqu. -pub fn constructor_x64_movdqu(ctx: &mut C, arg0: &XmmMem) -> Xmm { - let pattern0_0 = arg0; - // Rule at src/isa/x64/inst.isle line 1675. - let expr0_0 = SseOpcode::Movdqu; - let expr1_0 = constructor_xmm_unary_rm_r(ctx, &expr0_0, pattern0_0); - return expr1_0; -} - -// Generated as internal constructor for term x64_movapd. -pub fn constructor_x64_movapd(ctx: &mut C, arg0: &XmmMem) -> Xmm { - let pattern0_0 = arg0; - // Rule at src/isa/x64/inst.isle line 1679. - let expr0_0 = SseOpcode::Movapd; - let expr1_0 = constructor_xmm_unary_rm_r(ctx, &expr0_0, pattern0_0); - return expr1_0; -} - -// Generated as internal constructor for term x64_pmovsxbw. -pub fn constructor_x64_pmovsxbw(ctx: &mut C, arg0: &XmmMem) -> Xmm { - let pattern0_0 = arg0; - // Rule at src/isa/x64/inst.isle line 1683. - let expr0_0 = SseOpcode::Pmovsxbw; - let expr1_0 = constructor_xmm_unary_rm_r(ctx, &expr0_0, pattern0_0); - return expr1_0; -} - -// Generated as internal constructor for term x64_pmovzxbw. -pub fn constructor_x64_pmovzxbw(ctx: &mut C, arg0: &XmmMem) -> Xmm { - let pattern0_0 = arg0; - // Rule at src/isa/x64/inst.isle line 1687. - let expr0_0 = SseOpcode::Pmovzxbw; - let expr1_0 = constructor_xmm_unary_rm_r(ctx, &expr0_0, pattern0_0); - return expr1_0; -} - -// Generated as internal constructor for term x64_pmovsxwd. -pub fn constructor_x64_pmovsxwd(ctx: &mut C, arg0: &XmmMem) -> Xmm { - let pattern0_0 = arg0; - // Rule at src/isa/x64/inst.isle line 1691. - let expr0_0 = SseOpcode::Pmovsxwd; - let expr1_0 = constructor_xmm_unary_rm_r(ctx, &expr0_0, pattern0_0); - return expr1_0; -} - -// Generated as internal constructor for term x64_pmovzxwd. -pub fn constructor_x64_pmovzxwd(ctx: &mut C, arg0: &XmmMem) -> Xmm { - let pattern0_0 = arg0; - // Rule at src/isa/x64/inst.isle line 1695. - let expr0_0 = SseOpcode::Pmovzxwd; - let expr1_0 = constructor_xmm_unary_rm_r(ctx, &expr0_0, pattern0_0); - return expr1_0; -} - -// Generated as internal constructor for term x64_pmovsxdq. -pub fn constructor_x64_pmovsxdq(ctx: &mut C, arg0: &XmmMem) -> Xmm { - let pattern0_0 = arg0; - // Rule at src/isa/x64/inst.isle line 1699. - let expr0_0 = SseOpcode::Pmovsxdq; - let expr1_0 = constructor_xmm_unary_rm_r(ctx, &expr0_0, pattern0_0); - return expr1_0; -} - -// Generated as internal constructor for term x64_pmovzxdq. -pub fn constructor_x64_pmovzxdq(ctx: &mut C, arg0: &XmmMem) -> Xmm { - let pattern0_0 = arg0; - // Rule at src/isa/x64/inst.isle line 1703. - let expr0_0 = SseOpcode::Pmovzxdq; - let expr1_0 = constructor_xmm_unary_rm_r(ctx, &expr0_0, pattern0_0); - return expr1_0; -} - -// Generated as internal constructor for term x64_movrm. -pub fn constructor_x64_movrm( - ctx: &mut C, - arg0: Type, - arg1: &SyntheticAmode, - arg2: Gpr, -) -> SideEffectNoResult { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/x64/inst.isle line 1707. - let expr0_0 = C::raw_operand_size_of_type(ctx, pattern0_0); - let expr1_0 = MInst::MovRM { - size: expr0_0, - src: pattern2_0, - dst: pattern1_0.clone(), - }; - let expr2_0 = SideEffectNoResult::Inst { inst: expr1_0 }; - return expr2_0; -} - -// Generated as internal constructor for term x64_xmm_movrm. -pub fn constructor_x64_xmm_movrm( - ctx: &mut C, - arg0: &SseOpcode, - arg1: &SyntheticAmode, - arg2: Xmm, -) -> SideEffectNoResult { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/x64/inst.isle line 1712. - let expr0_0 = C::xmm_to_reg(ctx, pattern2_0); - let expr1_0 = MInst::XmmMovRM { - op: pattern0_0.clone(), - src: expr0_0, - dst: pattern1_0.clone(), - }; - let expr2_0 = SideEffectNoResult::Inst { inst: expr1_0 }; - return expr2_0; -} - -// Generated as internal constructor for term x64_xmm_load_const. -pub fn constructor_x64_xmm_load_const( - ctx: &mut C, - arg0: Type, - arg1: VCodeConstant, -) -> Xmm { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 1717. - let expr0_0 = C::const_to_synthetic_amode(ctx, pattern1_0); - let expr1_0 = ExtKind::None; - let expr2_0 = constructor_x64_load(ctx, pattern0_0, &expr0_0, &expr1_0); - let expr3_0 = C::xmm_new(ctx, expr2_0); - return expr3_0; -} - -// Generated as internal constructor for term alu_rmi_r. -pub fn constructor_alu_rmi_r( - ctx: &mut C, - arg0: Type, - arg1: &AluRmiROpcode, - arg2: Gpr, - arg3: &GprMemImm, -) -> Gpr { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - // Rule at src/isa/x64/inst.isle line 1728. - let expr0_0 = C::temp_writable_gpr(ctx); - let expr1_0 = C::operand_size_of_type_32_64(ctx, pattern0_0); - let expr2_0 = MInst::AluRmiR { - size: expr1_0, - op: pattern1_0.clone(), - src1: pattern2_0, - src2: pattern3_0.clone(), - dst: expr0_0, - }; - let expr3_0 = C::emit(ctx, &expr2_0); - let expr4_0 = C::writable_gpr_to_gpr(ctx, expr0_0); - return expr4_0; -} - -// Generated as internal constructor for term x64_add. -pub fn constructor_x64_add( - ctx: &mut C, - arg0: Type, - arg1: Gpr, - arg2: &GprMemImm, -) -> Gpr { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/x64/inst.isle line 1736. - let expr0_0 = AluRmiROpcode::Add; - let expr1_0 = constructor_alu_rmi_r(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term x64_add_with_flags_paired. -pub fn constructor_x64_add_with_flags_paired( - ctx: &mut C, - arg0: Type, - arg1: Gpr, - arg2: &GprMemImm, -) -> ProducesFlags { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/x64/inst.isle line 1744. - let expr0_0 = C::temp_writable_gpr(ctx); - let expr1_0 = C::operand_size_of_type_32_64(ctx, pattern0_0); - let expr2_0 = AluRmiROpcode::Add; - let expr3_0 = MInst::AluRmiR { - size: expr1_0, - op: expr2_0, - src1: pattern1_0, - src2: pattern2_0.clone(), - dst: expr0_0, - }; - let expr4_0 = constructor_writable_gpr_to_r_reg(ctx, expr0_0); - let expr5_0 = ProducesFlags::ProducesFlagsReturnsResultWithConsumer { - inst: expr3_0, - result: expr4_0, - }; - return expr5_0; -} - -// Generated as internal constructor for term x64_adc_paired. -pub fn constructor_x64_adc_paired( - ctx: &mut C, - arg0: Type, - arg1: Gpr, - arg2: &GprMemImm, -) -> ConsumesFlags { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/x64/inst.isle line 1756. - let expr0_0 = C::temp_writable_gpr(ctx); - let expr1_0 = C::operand_size_of_type_32_64(ctx, pattern0_0); - let expr2_0 = AluRmiROpcode::Adc; - let expr3_0 = MInst::AluRmiR { - size: expr1_0, - op: expr2_0, - src1: pattern1_0, - src2: pattern2_0.clone(), - dst: expr0_0, - }; - let expr4_0 = constructor_writable_gpr_to_r_reg(ctx, expr0_0); - let expr5_0 = ConsumesFlags::ConsumesFlagsReturnsResultWithProducer { - inst: expr3_0, - result: expr4_0, - }; - return expr5_0; -} - -// Generated as internal constructor for term x64_sub. -pub fn constructor_x64_sub( - ctx: &mut C, - arg0: Type, - arg1: Gpr, - arg2: &GprMemImm, -) -> Gpr { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/x64/inst.isle line 1768. - let expr0_0 = AluRmiROpcode::Sub; - let expr1_0 = constructor_alu_rmi_r(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term x64_sub_with_flags_paired. -pub fn constructor_x64_sub_with_flags_paired( - ctx: &mut C, - arg0: Type, - arg1: Gpr, - arg2: &GprMemImm, -) -> ProducesFlags { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/x64/inst.isle line 1776. - let expr0_0 = C::temp_writable_gpr(ctx); - let expr1_0 = C::operand_size_of_type_32_64(ctx, pattern0_0); - let expr2_0 = AluRmiROpcode::Sub; - let expr3_0 = MInst::AluRmiR { - size: expr1_0, - op: expr2_0, - src1: pattern1_0, - src2: pattern2_0.clone(), - dst: expr0_0, - }; - let expr4_0 = constructor_writable_gpr_to_r_reg(ctx, expr0_0); - let expr5_0 = ProducesFlags::ProducesFlagsReturnsResultWithConsumer { - inst: expr3_0, - result: expr4_0, - }; - return expr5_0; -} - -// Generated as internal constructor for term x64_sbb_paired. -pub fn constructor_x64_sbb_paired( - ctx: &mut C, - arg0: Type, - arg1: Gpr, - arg2: &GprMemImm, -) -> ConsumesFlags { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/x64/inst.isle line 1788. - let expr0_0 = C::temp_writable_gpr(ctx); - let expr1_0 = C::operand_size_of_type_32_64(ctx, pattern0_0); - let expr2_0 = AluRmiROpcode::Sbb; - let expr3_0 = MInst::AluRmiR { - size: expr1_0, - op: expr2_0, - src1: pattern1_0, - src2: pattern2_0.clone(), - dst: expr0_0, - }; - let expr4_0 = constructor_writable_gpr_to_r_reg(ctx, expr0_0); - let expr5_0 = ConsumesFlags::ConsumesFlagsReturnsResultWithProducer { - inst: expr3_0, - result: expr4_0, - }; - return expr5_0; -} - -// Generated as internal constructor for term x64_mul. -pub fn constructor_x64_mul( - ctx: &mut C, - arg0: Type, - arg1: Gpr, - arg2: &GprMemImm, -) -> Gpr { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/x64/inst.isle line 1800. - let expr0_0 = AluRmiROpcode::Mul; - let expr1_0 = constructor_alu_rmi_r(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term x64_and. -pub fn constructor_x64_and( - ctx: &mut C, - arg0: Type, - arg1: Gpr, - arg2: &GprMemImm, -) -> Gpr { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/x64/inst.isle line 1808. - let expr0_0 = AluRmiROpcode::And; - let expr1_0 = constructor_alu_rmi_r(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term x64_and_with_flags_paired. -pub fn constructor_x64_and_with_flags_paired( - ctx: &mut C, - arg0: Type, - arg1: Gpr, - arg2: &GprMemImm, -) -> ProducesFlags { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/x64/inst.isle line 1815. - let expr0_0 = C::temp_writable_gpr(ctx); - let expr1_0 = C::operand_size_of_type_32_64(ctx, pattern0_0); - let expr2_0 = AluRmiROpcode::And; - let expr3_0 = MInst::AluRmiR { - size: expr1_0, - op: expr2_0, - src1: pattern1_0, - src2: pattern2_0.clone(), - dst: expr0_0, - }; - let expr4_0 = ProducesFlags::ProducesFlagsSideEffect { inst: expr3_0 }; - return expr4_0; -} - -// Generated as internal constructor for term x64_or. -pub fn constructor_x64_or(ctx: &mut C, arg0: Type, arg1: Gpr, arg2: &GprMemImm) -> Gpr { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/x64/inst.isle line 1826. - let expr0_0 = AluRmiROpcode::Or; - let expr1_0 = constructor_alu_rmi_r(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term x64_xor. -pub fn constructor_x64_xor( - ctx: &mut C, - arg0: Type, - arg1: Gpr, - arg2: &GprMemImm, -) -> Gpr { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/x64/inst.isle line 1834. - let expr0_0 = AluRmiROpcode::Xor; - let expr1_0 = constructor_alu_rmi_r(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term imm_i64. -pub fn constructor_imm_i64(ctx: &mut C, arg0: Type, arg1: i64) -> Reg { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 1844. - let expr0_0 = C::i64_as_u64(ctx, pattern1_0); - let expr1_0 = constructor_imm(ctx, pattern0_0, expr0_0); - return expr1_0; -} - -// Generated as internal constructor for term imm. -pub fn constructor_imm(ctx: &mut C, arg0: Type, arg1: u64) -> Reg { - let pattern0_0 = arg0; - if pattern0_0 == I64 { - let pattern2_0 = arg1; - if let Some(pattern3_0) = C::nonzero_u64_fits_in_u32(ctx, pattern2_0) { - // Rule at src/isa/x64/inst.isle line 1879. - let expr0_0 = C::temp_writable_gpr(ctx); - let expr1_0 = OperandSize::Size32; - let expr2_0 = MInst::Imm { - dst_size: expr1_0, - simm64: pattern3_0, - dst: expr0_0, - }; - let expr3_0 = C::emit(ctx, &expr2_0); - let expr4_0 = constructor_writable_gpr_to_r_reg(ctx, expr0_0); - return expr4_0; - } - } - if pattern0_0 == F32 { - let pattern2_0 = arg1; - let pattern3_0 = C::u64_is_zero(ctx, pattern2_0); - if pattern3_0 == true { - // Rule at src/isa/x64/inst.isle line 1908. - let expr0_0 = C::temp_writable_xmm(ctx); - let expr1_0 = C::writable_xmm_to_xmm(ctx, expr0_0); - let expr2_0 = SseOpcode::Xorps; - let expr3_0 = C::xmm_to_xmm_mem(ctx, expr1_0); - let expr4_0 = MInst::XmmRmR { - op: expr2_0, - src1: expr1_0, - src2: expr3_0, - dst: expr0_0, - }; - let expr5_0 = C::emit(ctx, &expr4_0); - let expr6_0 = C::xmm_to_reg(ctx, expr1_0); - return expr6_0; - } - if pattern3_0 == false { - // Rule at src/isa/x64/inst.isle line 1866. - let expr0_0 = SseOpcode::Movd; - let expr1_0: Type = I32; - let expr2_0 = constructor_imm(ctx, expr1_0, pattern2_0); - let expr3_0 = C::reg_to_gpr_mem(ctx, expr2_0); - let expr4_0 = OperandSize::Size32; - let expr5_0 = constructor_gpr_to_xmm(ctx, &expr0_0, &expr3_0, &expr4_0); - let expr6_0 = C::xmm_to_reg(ctx, expr5_0); - return expr6_0; - } - } - if pattern0_0 == F64 { - let pattern2_0 = arg1; - let pattern3_0 = C::u64_is_zero(ctx, pattern2_0); - if pattern3_0 == true { - // Rule at src/isa/x64/inst.isle line 1920. - let expr0_0 = C::temp_writable_xmm(ctx); - let expr1_0 = C::writable_xmm_to_xmm(ctx, expr0_0); - let expr2_0 = SseOpcode::Xorpd; - let expr3_0 = C::xmm_to_xmm_mem(ctx, expr1_0); - let expr4_0 = MInst::XmmRmR { - op: expr2_0, - src1: expr1_0, - src2: expr3_0, - dst: expr0_0, - }; - let expr5_0 = C::emit(ctx, &expr4_0); - let expr6_0 = C::xmm_to_reg(ctx, expr1_0); - return expr6_0; - } - if pattern3_0 == false { - // Rule at src/isa/x64/inst.isle line 1872. - let expr0_0 = SseOpcode::Movq; - let expr1_0: Type = I64; - let expr2_0 = constructor_imm(ctx, expr1_0, pattern2_0); - let expr3_0 = C::reg_to_gpr_mem(ctx, expr2_0); - let expr4_0 = OperandSize::Size64; - let expr5_0 = constructor_gpr_to_xmm(ctx, &expr0_0, &expr3_0, &expr4_0); - let expr6_0 = C::xmm_to_reg(ctx, expr5_0); - return expr6_0; - } - } - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::fits_in_64(ctx, pattern0_0) { - let pattern2_0 = arg1; - let pattern3_0 = C::u64_is_zero(ctx, pattern2_0); - if pattern3_0 == true { - // Rule at src/isa/x64/inst.isle line 1885. - let expr0_0 = C::temp_writable_gpr(ctx); - let expr1_0 = C::writable_gpr_to_gpr(ctx, expr0_0); - let expr2_0 = C::operand_size_of_type_32_64(ctx, pattern1_0); - let expr3_0 = AluRmiROpcode::Xor; - let expr4_0 = C::gpr_to_gpr_mem_imm(ctx, expr1_0); - let expr5_0 = MInst::AluRmiR { - size: expr2_0, - op: expr3_0, - src1: expr1_0, - src2: expr4_0, - dst: expr0_0, - }; - let expr6_0 = C::emit(ctx, &expr5_0); - let expr7_0 = C::gpr_to_reg(ctx, expr1_0); - return expr7_0; - } - if pattern3_0 == false { - // Rule at src/isa/x64/inst.isle line 1859. - let expr0_0 = C::temp_writable_gpr(ctx); - let expr1_0 = C::operand_size_of_type_32_64(ctx, pattern1_0); - let expr2_0 = MInst::Imm { - dst_size: expr1_0, - simm64: pattern2_0, - dst: expr0_0, - }; - let expr3_0 = C::emit(ctx, &expr2_0); - let expr4_0 = constructor_writable_gpr_to_r_reg(ctx, expr0_0); - return expr4_0; - } - } - let pattern0_0 = arg0; - if let Some((pattern1_0, pattern1_1)) = C::multi_lane(ctx, pattern0_0) { - let pattern2_0 = arg1; - if pattern2_0 == 0i128 as u64 { - // Rule at src/isa/x64/inst.isle line 1898. - let expr0_0 = C::temp_writable_xmm(ctx); - let expr1_0 = C::writable_xmm_to_xmm(ctx, expr0_0); - let expr2_0 = constructor_sse_xor_op(ctx, pattern0_0); - let expr3_0 = C::xmm_to_xmm_mem(ctx, expr1_0); - let expr4_0 = MInst::XmmRmR { - op: expr2_0, - src1: expr1_0, - src2: expr3_0, - dst: expr0_0, - }; - let expr5_0 = C::emit(ctx, &expr4_0); - let expr6_0 = C::xmm_to_reg(ctx, expr1_0); - return expr6_0; - } - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "imm", "src/isa/x64/inst.isle line 1856" - ); -} - -// Generated as internal constructor for term shift_r. -pub fn constructor_shift_r( - ctx: &mut C, - arg0: Type, - arg1: &ShiftKind, - arg2: Gpr, - arg3: &Imm8Gpr, -) -> Gpr { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - // Rule at src/isa/x64/inst.isle line 1933. - let expr0_0 = C::temp_writable_gpr(ctx); - let expr1_0 = C::raw_operand_size_of_type(ctx, pattern0_0); - let expr2_0 = MInst::ShiftR { - size: expr1_0, - kind: pattern1_0.clone(), - src: pattern2_0, - num_bits: pattern3_0.clone(), - dst: expr0_0, - }; - let expr3_0 = C::emit(ctx, &expr2_0); - let expr4_0 = C::writable_gpr_to_gpr(ctx, expr0_0); - return expr4_0; -} - -// Generated as internal constructor for term x64_rotl. -pub fn constructor_x64_rotl(ctx: &mut C, arg0: Type, arg1: Gpr, arg2: &Imm8Gpr) -> Gpr { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/x64/inst.isle line 1943. - let expr0_0 = ShiftKind::RotateLeft; - let expr1_0 = constructor_shift_r(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term x64_rotr. -pub fn constructor_x64_rotr(ctx: &mut C, arg0: Type, arg1: Gpr, arg2: &Imm8Gpr) -> Gpr { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/x64/inst.isle line 1948. - let expr0_0 = ShiftKind::RotateRight; - let expr1_0 = constructor_shift_r(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term x64_shl. -pub fn constructor_x64_shl(ctx: &mut C, arg0: Type, arg1: Gpr, arg2: &Imm8Gpr) -> Gpr { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/x64/inst.isle line 1953. - let expr0_0 = ShiftKind::ShiftLeft; - let expr1_0 = constructor_shift_r(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term x64_shr. -pub fn constructor_x64_shr(ctx: &mut C, arg0: Type, arg1: Gpr, arg2: &Imm8Gpr) -> Gpr { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/x64/inst.isle line 1958. - let expr0_0 = ShiftKind::ShiftRightLogical; - let expr1_0 = constructor_shift_r(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term x64_sar. -pub fn constructor_x64_sar(ctx: &mut C, arg0: Type, arg1: Gpr, arg2: &Imm8Gpr) -> Gpr { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/x64/inst.isle line 1963. - let expr0_0 = ShiftKind::ShiftRightArithmetic; - let expr1_0 = constructor_shift_r(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term x64_bswap. -pub fn constructor_x64_bswap(ctx: &mut C, arg0: Type, arg1: Gpr) -> Gpr { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 1970. - let expr0_0 = C::temp_writable_gpr(ctx); - let expr1_0 = C::operand_size_of_type_32_64(ctx, pattern0_0); - let expr2_0 = MInst::Bswap { - size: expr1_0, - src: pattern1_0, - dst: expr0_0, - }; - let expr3_0 = C::emit(ctx, &expr2_0); - let expr4_0 = C::writable_gpr_to_gpr(ctx, expr0_0); - return expr4_0; -} - -// Generated as internal constructor for term cmp_rmi_r. -pub fn constructor_cmp_rmi_r( - ctx: &mut C, - arg0: &OperandSize, - arg1: &CmpOpcode, - arg2: &GprMemImm, - arg3: Gpr, -) -> ProducesFlags { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - // Rule at src/isa/x64/inst.isle line 1978. - let expr0_0 = MInst::CmpRmiR { - size: pattern0_0.clone(), - opcode: pattern1_0.clone(), - src: pattern2_0.clone(), - dst: pattern3_0, - }; - let expr1_0 = ProducesFlags::ProducesFlagsSideEffect { inst: expr0_0 }; - return expr1_0; -} - -// Generated as internal constructor for term x64_cmp. -pub fn constructor_x64_cmp( - ctx: &mut C, - arg0: &OperandSize, - arg1: &GprMemImm, - arg2: Gpr, -) -> ProducesFlags { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/x64/inst.isle line 1987. - let expr0_0 = CmpOpcode::Cmp; - let expr1_0 = constructor_cmp_rmi_r(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term x64_cmp_imm. -pub fn constructor_x64_cmp_imm( - ctx: &mut C, - arg0: &OperandSize, - arg1: u32, - arg2: Gpr, -) -> ProducesFlags { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/x64/inst.isle line 1992. - let expr0_0 = CmpOpcode::Cmp; - let expr1_0 = RegMemImm::Imm { simm32: pattern1_0 }; - let expr2_0 = C::gpr_mem_imm_new(ctx, &expr1_0); - let expr3_0 = constructor_cmp_rmi_r(ctx, pattern0_0, &expr0_0, &expr2_0, pattern2_0); - return expr3_0; -} - -// Generated as internal constructor for term xmm_cmp_rm_r. -pub fn constructor_xmm_cmp_rm_r( - ctx: &mut C, - arg0: &SseOpcode, - arg1: &XmmMem, - arg2: Xmm, -) -> ProducesFlags { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/x64/inst.isle line 1997. - let expr0_0 = MInst::XmmCmpRmR { - op: pattern0_0.clone(), - src: pattern1_0.clone(), - dst: pattern2_0, - }; - let expr1_0 = ProducesFlags::ProducesFlagsSideEffect { inst: expr0_0 }; - return expr1_0; -} - -// Generated as internal constructor for term x64_ucomis. -pub fn constructor_x64_ucomis(ctx: &mut C, arg0: Value, arg1: Value) -> ProducesFlags { - let pattern0_0 = arg0; - let pattern1_0 = C::value_type(ctx, pattern0_0); - if pattern1_0 == F32 { - let pattern3_0 = arg1; - // Rule at src/isa/x64/inst.isle line 2003. - let expr0_0 = SseOpcode::Ucomiss; - let expr1_0 = constructor_put_in_xmm(ctx, pattern0_0); - let expr2_0 = C::xmm_to_xmm_mem(ctx, expr1_0); - let expr3_0 = constructor_put_in_xmm(ctx, pattern3_0); - let expr4_0 = constructor_xmm_cmp_rm_r(ctx, &expr0_0, &expr2_0, expr3_0); - return expr4_0; - } - if pattern1_0 == F64 { - let pattern3_0 = arg1; - // Rule at src/isa/x64/inst.isle line 2007. - let expr0_0 = SseOpcode::Ucomisd; - let expr1_0 = constructor_put_in_xmm(ctx, pattern0_0); - let expr2_0 = C::xmm_to_xmm_mem(ctx, expr1_0); - let expr3_0 = constructor_put_in_xmm(ctx, pattern3_0); - let expr4_0 = constructor_xmm_cmp_rm_r(ctx, &expr0_0, &expr2_0, expr3_0); - return expr4_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "x64_ucomis", "src/isa/x64/inst.isle line 2002" - ); -} - -// Generated as internal constructor for term x64_test. -pub fn constructor_x64_test( - ctx: &mut C, - arg0: &OperandSize, - arg1: &GprMemImm, - arg2: Gpr, -) -> ProducesFlags { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/x64/inst.isle line 2012. - let expr0_0 = CmpOpcode::Test; - let expr1_0 = constructor_cmp_rmi_r(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term x64_ptest. -pub fn constructor_x64_ptest(ctx: &mut C, arg0: &XmmMem, arg1: Xmm) -> ProducesFlags { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 2017. - let expr0_0 = SseOpcode::Ptest; - let expr1_0 = constructor_xmm_cmp_rm_r(ctx, &expr0_0, pattern0_0, pattern1_0); - return expr1_0; -} - -// Generated as internal constructor for term cmove. -pub fn constructor_cmove( - ctx: &mut C, - arg0: Type, - arg1: &CC, - arg2: &GprMem, - arg3: Gpr, -) -> ConsumesFlags { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - // Rule at src/isa/x64/inst.isle line 2024. - let expr0_0 = C::temp_writable_gpr(ctx); - let expr1_0 = C::operand_size_of_type_32_64(ctx, pattern0_0); - let expr2_0 = MInst::Cmove { - size: expr1_0, - cc: pattern1_0.clone(), - consequent: pattern2_0.clone(), - alternative: pattern3_0, - dst: expr0_0, - }; - let expr3_0 = constructor_writable_gpr_to_r_reg(ctx, expr0_0); - let expr4_0 = ConsumesFlags::ConsumesFlagsReturnsReg { - inst: expr2_0, - result: expr3_0, - }; - return expr4_0; -} - -// Generated as internal constructor for term cmove_xmm. -pub fn constructor_cmove_xmm( - ctx: &mut C, - arg0: Type, - arg1: &CC, - arg2: &XmmMem, - arg3: Xmm, -) -> ConsumesFlags { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - // Rule at src/isa/x64/inst.isle line 2032. - let expr0_0 = C::temp_writable_xmm(ctx); - let expr1_0 = MInst::XmmCmove { - ty: pattern0_0, - cc: pattern1_0.clone(), - consequent: pattern2_0.clone(), - alternative: pattern3_0, - dst: expr0_0, - }; - let expr2_0 = constructor_writable_xmm_to_r_reg(ctx, expr0_0); - let expr3_0 = ConsumesFlags::ConsumesFlagsReturnsReg { - inst: expr1_0, - result: expr2_0, - }; - return expr3_0; -} - -// Generated as internal constructor for term cmove_from_values. -pub fn constructor_cmove_from_values( - ctx: &mut C, - arg0: Type, - arg1: &CC, - arg2: Value, - arg3: Value, -) -> ConsumesFlags { - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::type_register_class(ctx, pattern0_0) { - match &pattern1_0 { - &RegisterClass::Xmm => { - let pattern3_0 = arg1; - let pattern4_0 = arg2; - let pattern5_0 = arg3; - // Rule at src/isa/x64/inst.isle line 2066. - let expr0_0 = C::put_in_xmm_mem(ctx, pattern4_0); - let expr1_0 = constructor_put_in_xmm(ctx, pattern5_0); - let expr2_0 = constructor_cmove_xmm(ctx, pattern0_0, pattern3_0, &expr0_0, expr1_0); - return expr2_0; - } - &RegisterClass::Gpr { - single_register: pattern2_0, - } => { - if pattern2_0 == true { - let pattern4_0 = arg1; - let pattern5_0 = arg2; - let pattern6_0 = arg3; - // Rule at src/isa/x64/inst.isle line 2063. - let expr0_0 = constructor_put_in_gpr_mem(ctx, pattern5_0); - let expr1_0 = constructor_put_in_gpr(ctx, pattern6_0); - let expr2_0 = constructor_cmove(ctx, pattern0_0, pattern4_0, &expr0_0, expr1_0); - return expr2_0; - } - if pattern2_0 == false { - if pattern0_0 == I128 { - let pattern5_0 = arg1; - let pattern6_0 = arg2; - let pattern7_0 = arg3; - // Rule at src/isa/x64/inst.isle line 2042. - let expr0_0 = C::put_in_regs(ctx, pattern6_0); - let expr1_0 = C::put_in_regs(ctx, pattern7_0); - let expr2_0 = C::temp_writable_gpr(ctx); - let expr3_0 = C::temp_writable_gpr(ctx); - let expr4_0 = OperandSize::Size64; - let expr5_0: usize = 0i128 as usize; - let expr6_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr5_0); - let expr7_0 = C::gpr_to_gpr_mem(ctx, expr6_0); - let expr8_0: usize = 0i128 as usize; - let expr9_0 = constructor_value_regs_get_gpr(ctx, expr1_0, expr8_0); - let expr10_0 = MInst::Cmove { - size: expr4_0, - cc: pattern5_0.clone(), - consequent: expr7_0, - alternative: expr9_0, - dst: expr2_0, - }; - let expr11_0: usize = 1i128 as usize; - let expr12_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr11_0); - let expr13_0 = C::gpr_to_gpr_mem(ctx, expr12_0); - let expr14_0: usize = 1i128 as usize; - let expr15_0 = constructor_value_regs_get_gpr(ctx, expr1_0, expr14_0); - let expr16_0 = MInst::Cmove { - size: expr4_0, - cc: pattern5_0.clone(), - consequent: expr13_0, - alternative: expr15_0, - dst: expr3_0, - }; - let expr17_0 = constructor_writable_gpr_to_r_reg(ctx, expr2_0); - let expr18_0 = constructor_writable_gpr_to_r_reg(ctx, expr3_0); - let expr19_0 = C::value_regs(ctx, expr17_0, expr18_0); - let expr20_0 = ConsumesFlags::ConsumesFlagsTwiceReturnsValueRegs { - inst1: expr10_0, - inst2: expr16_0, - result: expr19_0, - }; - return expr20_0; - } - } - } - _ => {} - } - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "cmove_from_values", "src/isa/x64/inst.isle line 2041" - ); -} - -// Generated as internal constructor for term cmove_or. -pub fn constructor_cmove_or( - ctx: &mut C, - arg0: Type, - arg1: &CC, - arg2: &CC, - arg3: &GprMem, - arg4: Gpr, -) -> ConsumesFlags { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - let pattern4_0 = arg4; - // Rule at src/isa/x64/inst.isle line 2073. - let expr0_0 = C::temp_writable_gpr(ctx); - let expr1_0 = C::temp_writable_gpr(ctx); - let expr2_0 = C::operand_size_of_type_32_64(ctx, pattern0_0); - let expr3_0 = MInst::Cmove { - size: expr2_0, - cc: pattern1_0.clone(), - consequent: pattern3_0.clone(), - alternative: pattern4_0, - dst: expr1_0, - }; - let expr4_0 = C::writable_gpr_to_gpr(ctx, expr1_0); - let expr5_0 = MInst::Cmove { - size: expr2_0, - cc: pattern2_0.clone(), - consequent: pattern3_0.clone(), - alternative: expr4_0, - dst: expr0_0, - }; - let expr6_0 = constructor_writable_gpr_to_value_regs(ctx, expr0_0); - let expr7_0 = ConsumesFlags::ConsumesFlagsTwiceReturnsValueRegs { - inst1: expr3_0, - inst2: expr5_0, - result: expr6_0, - }; - return expr7_0; -} - -// Generated as internal constructor for term cmove_or_xmm. -pub fn constructor_cmove_or_xmm( - ctx: &mut C, - arg0: Type, - arg1: &CC, - arg2: &CC, - arg3: &XmmMem, - arg4: Xmm, -) -> ConsumesFlags { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - let pattern4_0 = arg4; - // Rule at src/isa/x64/inst.isle line 2085. - let expr0_0 = C::temp_writable_xmm(ctx); - let expr1_0 = C::temp_writable_xmm(ctx); - let expr2_0 = MInst::XmmCmove { - ty: pattern0_0, - cc: pattern1_0.clone(), - consequent: pattern3_0.clone(), - alternative: pattern4_0, - dst: expr1_0, - }; - let expr3_0 = C::writable_xmm_to_xmm(ctx, expr1_0); - let expr4_0 = MInst::XmmCmove { - ty: pattern0_0, - cc: pattern2_0.clone(), - consequent: pattern3_0.clone(), - alternative: expr3_0, - dst: expr0_0, - }; - let expr5_0 = constructor_writable_xmm_to_value_regs(ctx, expr0_0); - let expr6_0 = ConsumesFlags::ConsumesFlagsTwiceReturnsValueRegs { - inst1: expr2_0, - inst2: expr4_0, - result: expr5_0, - }; - return expr6_0; -} - -// Generated as internal constructor for term cmove_or_from_values. -pub fn constructor_cmove_or_from_values( - ctx: &mut C, - arg0: Type, - arg1: &CC, - arg2: &CC, - arg3: Value, - arg4: Value, -) -> ConsumesFlags { - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::type_register_class(ctx, pattern0_0) { - match &pattern1_0 { - &RegisterClass::Xmm => { - let pattern3_0 = arg1; - let pattern4_0 = arg2; - let pattern5_0 = arg3; - let pattern6_0 = arg4; - // Rule at src/isa/x64/inst.isle line 2121. - let expr0_0 = C::put_in_xmm_mem(ctx, pattern5_0); - let expr1_0 = constructor_put_in_xmm(ctx, pattern6_0); - let expr2_0 = constructor_cmove_or_xmm( - ctx, pattern0_0, pattern3_0, pattern4_0, &expr0_0, expr1_0, - ); - return expr2_0; - } - &RegisterClass::Gpr { - single_register: pattern2_0, - } => { - if pattern2_0 == true { - let pattern4_0 = arg1; - let pattern5_0 = arg2; - let pattern6_0 = arg3; - let pattern7_0 = arg4; - // Rule at src/isa/x64/inst.isle line 2118. - let expr0_0 = constructor_put_in_gpr_mem(ctx, pattern6_0); - let expr1_0 = constructor_put_in_gpr(ctx, pattern7_0); - let expr2_0 = constructor_cmove_or( - ctx, pattern0_0, pattern4_0, pattern5_0, &expr0_0, expr1_0, - ); - return expr2_0; - } - if pattern2_0 == false { - if pattern0_0 == I128 { - let pattern5_0 = arg1; - let pattern6_0 = arg2; - let pattern7_0 = arg3; - let pattern8_0 = arg4; - // Rule at src/isa/x64/inst.isle line 2099. - let expr0_0 = C::put_in_regs(ctx, pattern7_0); - let expr1_0 = C::put_in_regs(ctx, pattern8_0); - let expr2_0 = C::temp_writable_gpr(ctx); - let expr3_0 = C::temp_writable_gpr(ctx); - let expr4_0 = C::temp_writable_gpr(ctx); - let expr5_0 = C::temp_writable_gpr(ctx); - let expr6_0 = OperandSize::Size64; - let expr7_0: usize = 0i128 as usize; - let expr8_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr7_0); - let expr9_0 = C::gpr_to_gpr_mem(ctx, expr8_0); - let expr10_0: usize = 0i128 as usize; - let expr11_0 = constructor_value_regs_get_gpr(ctx, expr1_0, expr10_0); - let expr12_0 = MInst::Cmove { - size: expr6_0, - cc: pattern5_0.clone(), - consequent: expr9_0, - alternative: expr11_0, - dst: expr4_0, - }; - let expr13_0: usize = 0i128 as usize; - let expr14_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr13_0); - let expr15_0 = C::gpr_to_gpr_mem(ctx, expr14_0); - let expr16_0 = C::writable_gpr_to_gpr(ctx, expr4_0); - let expr17_0 = MInst::Cmove { - size: expr6_0, - cc: pattern6_0.clone(), - consequent: expr15_0, - alternative: expr16_0, - dst: expr2_0, - }; - let expr18_0: usize = 1i128 as usize; - let expr19_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr18_0); - let expr20_0 = C::gpr_to_gpr_mem(ctx, expr19_0); - let expr21_0: usize = 1i128 as usize; - let expr22_0 = constructor_value_regs_get_gpr(ctx, expr1_0, expr21_0); - let expr23_0 = MInst::Cmove { - size: expr6_0, - cc: pattern5_0.clone(), - consequent: expr20_0, - alternative: expr22_0, - dst: expr5_0, - }; - let expr24_0: usize = 1i128 as usize; - let expr25_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr24_0); - let expr26_0 = C::gpr_to_gpr_mem(ctx, expr25_0); - let expr27_0 = C::writable_gpr_to_gpr(ctx, expr5_0); - let expr28_0 = MInst::Cmove { - size: expr6_0, - cc: pattern6_0.clone(), - consequent: expr26_0, - alternative: expr27_0, - dst: expr3_0, - }; - let expr29_0 = constructor_writable_gpr_to_r_reg(ctx, expr2_0); - let expr30_0 = constructor_writable_gpr_to_r_reg(ctx, expr3_0); - let expr31_0 = C::value_regs(ctx, expr29_0, expr30_0); - let expr32_0 = ConsumesFlags::ConsumesFlagsFourTimesReturnsValueRegs { - inst1: expr12_0, - inst2: expr17_0, - inst3: expr23_0, - inst4: expr28_0, - result: expr31_0, - }; - return expr32_0; - } - } - } - _ => {} - } - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "cmove_or_from_values", "src/isa/x64/inst.isle line 2098" - ); -} - -// Generated as internal constructor for term x64_setcc. -pub fn constructor_x64_setcc(ctx: &mut C, arg0: &CC) -> ConsumesFlags { - let pattern0_0 = arg0; - // Rule at src/isa/x64/inst.isle line 2126. - let expr0_0 = C::temp_writable_gpr(ctx); - let expr1_0 = MInst::Setcc { - cc: pattern0_0.clone(), - dst: expr0_0, - }; - let expr2_0 = constructor_writable_gpr_to_r_reg(ctx, expr0_0); - let expr3_0 = ConsumesFlags::ConsumesFlagsReturnsReg { - inst: expr1_0, - result: expr2_0, - }; - return expr3_0; -} - -// Generated as internal constructor for term x64_setcc_paired. -pub fn constructor_x64_setcc_paired(ctx: &mut C, arg0: &CC) -> ConsumesFlags { - let pattern0_0 = arg0; - // Rule at src/isa/x64/inst.isle line 2135. - let expr0_0 = C::temp_writable_gpr(ctx); - let expr1_0 = MInst::Setcc { - cc: pattern0_0.clone(), - dst: expr0_0, - }; - let expr2_0 = constructor_writable_gpr_to_r_reg(ctx, expr0_0); - let expr3_0 = ConsumesFlags::ConsumesFlagsReturnsResultWithProducer { - inst: expr1_0, - result: expr2_0, - }; - return expr3_0; -} - -// Generated as internal constructor for term xmm_rm_r. -pub fn constructor_xmm_rm_r( - ctx: &mut C, - arg0: Type, - arg1: &SseOpcode, - arg2: Xmm, - arg3: &XmmMem, -) -> Xmm { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - // Rule at src/isa/x64/inst.isle line 2143. - let expr0_0 = C::temp_writable_xmm(ctx); - let expr1_0 = MInst::XmmRmR { - op: pattern1_0.clone(), - src1: pattern2_0, - src2: pattern3_0.clone(), - dst: expr0_0, - }; - let expr2_0 = C::emit(ctx, &expr1_0); - let expr3_0 = C::writable_xmm_to_xmm(ctx, expr0_0); - return expr3_0; -} - -// Generated as internal constructor for term x64_paddb. -pub fn constructor_x64_paddb(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Xmm { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 2150. - let expr0_0: Type = I8X16; - let expr1_0 = SseOpcode::Paddb; - let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0); - return expr2_0; -} - -// Generated as internal constructor for term x64_paddw. -pub fn constructor_x64_paddw(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Xmm { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 2155. - let expr0_0: Type = I16X8; - let expr1_0 = SseOpcode::Paddw; - let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0); - return expr2_0; -} - -// Generated as internal constructor for term x64_paddd. -pub fn constructor_x64_paddd(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Xmm { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 2160. - let expr0_0: Type = I32X4; - let expr1_0 = SseOpcode::Paddd; - let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0); - return expr2_0; -} - -// Generated as internal constructor for term x64_paddq. -pub fn constructor_x64_paddq(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Xmm { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 2165. - let expr0_0: Type = I64X2; - let expr1_0 = SseOpcode::Paddq; - let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0); - return expr2_0; -} - -// Generated as internal constructor for term x64_paddsb. -pub fn constructor_x64_paddsb(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Xmm { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 2170. - let expr0_0: Type = I8X16; - let expr1_0 = SseOpcode::Paddsb; - let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0); - return expr2_0; -} - -// Generated as internal constructor for term x64_paddsw. -pub fn constructor_x64_paddsw(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Xmm { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 2175. - let expr0_0: Type = I16X8; - let expr1_0 = SseOpcode::Paddsw; - let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0); - return expr2_0; -} - -// Generated as internal constructor for term x64_paddusb. -pub fn constructor_x64_paddusb(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Xmm { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 2180. - let expr0_0: Type = I8X16; - let expr1_0 = SseOpcode::Paddusb; - let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0); - return expr2_0; -} - -// Generated as internal constructor for term x64_paddusw. -pub fn constructor_x64_paddusw(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Xmm { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 2185. - let expr0_0: Type = I16X8; - let expr1_0 = SseOpcode::Paddusw; - let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0); - return expr2_0; -} - -// Generated as internal constructor for term x64_psubb. -pub fn constructor_x64_psubb(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Xmm { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 2190. - let expr0_0: Type = I8X16; - let expr1_0 = SseOpcode::Psubb; - let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0); - return expr2_0; -} - -// Generated as internal constructor for term x64_psubw. -pub fn constructor_x64_psubw(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Xmm { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 2195. - let expr0_0: Type = I16X8; - let expr1_0 = SseOpcode::Psubw; - let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0); - return expr2_0; -} - -// Generated as internal constructor for term x64_psubd. -pub fn constructor_x64_psubd(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Xmm { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 2200. - let expr0_0: Type = I32X4; - let expr1_0 = SseOpcode::Psubd; - let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0); - return expr2_0; -} - -// Generated as internal constructor for term x64_psubq. -pub fn constructor_x64_psubq(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Xmm { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 2205. - let expr0_0: Type = I64X2; - let expr1_0 = SseOpcode::Psubq; - let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0); - return expr2_0; -} - -// Generated as internal constructor for term x64_psubsb. -pub fn constructor_x64_psubsb(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Xmm { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 2210. - let expr0_0: Type = I8X16; - let expr1_0 = SseOpcode::Psubsb; - let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0); - return expr2_0; -} - -// Generated as internal constructor for term x64_psubsw. -pub fn constructor_x64_psubsw(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Xmm { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 2215. - let expr0_0: Type = I16X8; - let expr1_0 = SseOpcode::Psubsw; - let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0); - return expr2_0; -} - -// Generated as internal constructor for term x64_psubusb. -pub fn constructor_x64_psubusb(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Xmm { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 2220. - let expr0_0: Type = I8X16; - let expr1_0 = SseOpcode::Psubusb; - let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0); - return expr2_0; -} - -// Generated as internal constructor for term x64_psubusw. -pub fn constructor_x64_psubusw(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Xmm { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 2225. - let expr0_0: Type = I16X8; - let expr1_0 = SseOpcode::Psubusw; - let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0); - return expr2_0; -} - -// Generated as internal constructor for term x64_pavgb. -pub fn constructor_x64_pavgb(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Xmm { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 2230. - let expr0_0: Type = I8X16; - let expr1_0 = SseOpcode::Pavgb; - let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0); - return expr2_0; -} - -// Generated as internal constructor for term x64_pavgw. -pub fn constructor_x64_pavgw(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Xmm { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 2235. - let expr0_0: Type = I16X8; - let expr1_0 = SseOpcode::Pavgw; - let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0); - return expr2_0; -} - -// Generated as internal constructor for term x64_pand. -pub fn constructor_x64_pand(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Xmm { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 2240. - let expr0_0: Type = F32X4; - let expr1_0 = SseOpcode::Pand; - let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0); - return expr2_0; -} - -// Generated as internal constructor for term x64_andps. -pub fn constructor_x64_andps(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Xmm { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 2245. - let expr0_0: Type = F32X4; - let expr1_0 = SseOpcode::Andps; - let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0); - return expr2_0; -} - -// Generated as internal constructor for term x64_andpd. -pub fn constructor_x64_andpd(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Xmm { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 2250. - let expr0_0: Type = F64X2; - let expr1_0 = SseOpcode::Andpd; - let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0); - return expr2_0; -} - -// Generated as internal constructor for term x64_por. -pub fn constructor_x64_por(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Xmm { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 2255. - let expr0_0: Type = F32X4; - let expr1_0 = SseOpcode::Por; - let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0); - return expr2_0; -} - -// Generated as internal constructor for term x64_orps. -pub fn constructor_x64_orps(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Xmm { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 2260. - let expr0_0: Type = F32X4; - let expr1_0 = SseOpcode::Orps; - let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0); - return expr2_0; -} - -// Generated as internal constructor for term x64_orpd. -pub fn constructor_x64_orpd(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Xmm { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 2265. - let expr0_0: Type = F64X2; - let expr1_0 = SseOpcode::Orpd; - let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0); - return expr2_0; -} - -// Generated as internal constructor for term x64_pxor. -pub fn constructor_x64_pxor(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Xmm { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 2270. - let expr0_0: Type = I8X16; - let expr1_0 = SseOpcode::Pxor; - let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0); - return expr2_0; -} - -// Generated as internal constructor for term x64_xorps. -pub fn constructor_x64_xorps(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Xmm { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 2275. - let expr0_0: Type = F32X4; - let expr1_0 = SseOpcode::Xorps; - let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0); - return expr2_0; -} - -// Generated as internal constructor for term x64_xorpd. -pub fn constructor_x64_xorpd(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Xmm { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 2280. - let expr0_0: Type = F64X2; - let expr1_0 = SseOpcode::Xorpd; - let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0); - return expr2_0; -} - -// Generated as internal constructor for term x64_pmullw. -pub fn constructor_x64_pmullw(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Xmm { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 2285. - let expr0_0: Type = I16X8; - let expr1_0 = SseOpcode::Pmullw; - let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0); - return expr2_0; -} - -// Generated as internal constructor for term x64_pmulld. -pub fn constructor_x64_pmulld(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Xmm { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 2290. - let expr0_0: Type = I16X8; - let expr1_0 = SseOpcode::Pmulld; - let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0); - return expr2_0; -} - -// Generated as internal constructor for term x64_pmulhw. -pub fn constructor_x64_pmulhw(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Xmm { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 2295. - let expr0_0: Type = I16X8; - let expr1_0 = SseOpcode::Pmulhw; - let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0); - return expr2_0; -} - -// Generated as internal constructor for term x64_pmulhrsw. -pub fn constructor_x64_pmulhrsw(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Xmm { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 2300. - let expr0_0: Type = I16X8; - let expr1_0 = SseOpcode::Pmulhrsw; - let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0); - return expr2_0; -} - -// Generated as internal constructor for term x64_pmulhuw. -pub fn constructor_x64_pmulhuw(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Xmm { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 2305. - let expr0_0: Type = I16X8; - let expr1_0 = SseOpcode::Pmulhuw; - let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0); - return expr2_0; -} - -// Generated as internal constructor for term x64_pmuldq. -pub fn constructor_x64_pmuldq(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Xmm { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 2310. - let expr0_0: Type = I16X8; - let expr1_0 = SseOpcode::Pmuldq; - let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0); - return expr2_0; -} - -// Generated as internal constructor for term x64_pmuludq. -pub fn constructor_x64_pmuludq(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Xmm { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 2315. - let expr0_0: Type = I64X2; - let expr1_0 = SseOpcode::Pmuludq; - let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0); - return expr2_0; -} - -// Generated as internal constructor for term x64_punpckhwd. -pub fn constructor_x64_punpckhwd(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Xmm { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 2320. - let expr0_0: Type = I16X8; - let expr1_0 = SseOpcode::Punpckhwd; - let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0); - return expr2_0; -} - -// Generated as internal constructor for term x64_punpcklwd. -pub fn constructor_x64_punpcklwd(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Xmm { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 2325. - let expr0_0: Type = I16X8; - let expr1_0 = SseOpcode::Punpcklwd; - let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0); - return expr2_0; -} - -// Generated as internal constructor for term x64_unpcklps. -pub fn constructor_x64_unpcklps(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Xmm { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 2330. - let expr0_0: Type = I16X8; - let expr1_0 = SseOpcode::Unpcklps; - let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0); - return expr2_0; -} - -// Generated as internal constructor for term x64_andnps. -pub fn constructor_x64_andnps(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Xmm { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 2335. - let expr0_0: Type = F32X4; - let expr1_0 = SseOpcode::Andnps; - let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0); - return expr2_0; -} - -// Generated as internal constructor for term x64_andnpd. -pub fn constructor_x64_andnpd(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Xmm { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 2340. - let expr0_0: Type = F64X2; - let expr1_0 = SseOpcode::Andnpd; - let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0); - return expr2_0; -} - -// Generated as internal constructor for term x64_pandn. -pub fn constructor_x64_pandn(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Xmm { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 2345. - let expr0_0: Type = F64X2; - let expr1_0 = SseOpcode::Pandn; - let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0); - return expr2_0; -} - -// Generated as internal constructor for term x64_addss. -pub fn constructor_x64_addss(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Xmm { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 2350. - let expr0_0: Type = F32; - let expr1_0 = SseOpcode::Addss; - let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0); - return expr2_0; -} - -// Generated as internal constructor for term x64_addsd. -pub fn constructor_x64_addsd(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Xmm { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 2355. - let expr0_0: Type = F64; - let expr1_0 = SseOpcode::Addsd; - let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0); - return expr2_0; -} - -// Generated as internal constructor for term x64_addps. -pub fn constructor_x64_addps(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Xmm { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 2360. - let expr0_0: Type = F32; - let expr1_0 = SseOpcode::Addps; - let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0); - return expr2_0; -} - -// Generated as internal constructor for term x64_addpd. -pub fn constructor_x64_addpd(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Xmm { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 2365. - let expr0_0: Type = F32; - let expr1_0 = SseOpcode::Addpd; - let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0); - return expr2_0; -} - -// Generated as internal constructor for term x64_subss. -pub fn constructor_x64_subss(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Xmm { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 2370. - let expr0_0: Type = F32; - let expr1_0 = SseOpcode::Subss; - let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0); - return expr2_0; -} - -// Generated as internal constructor for term x64_subsd. -pub fn constructor_x64_subsd(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Xmm { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 2375. - let expr0_0: Type = F64; - let expr1_0 = SseOpcode::Subsd; - let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0); - return expr2_0; -} - -// Generated as internal constructor for term x64_subps. -pub fn constructor_x64_subps(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Xmm { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 2380. - let expr0_0: Type = F32; - let expr1_0 = SseOpcode::Subps; - let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0); - return expr2_0; -} - -// Generated as internal constructor for term x64_subpd. -pub fn constructor_x64_subpd(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Xmm { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 2385. - let expr0_0: Type = F32; - let expr1_0 = SseOpcode::Subpd; - let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0); - return expr2_0; -} - -// Generated as internal constructor for term x64_mulss. -pub fn constructor_x64_mulss(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Xmm { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 2390. - let expr0_0: Type = F32; - let expr1_0 = SseOpcode::Mulss; - let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0); - return expr2_0; -} - -// Generated as internal constructor for term x64_mulsd. -pub fn constructor_x64_mulsd(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Xmm { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 2395. - let expr0_0: Type = F64; - let expr1_0 = SseOpcode::Mulsd; - let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0); - return expr2_0; -} - -// Generated as internal constructor for term x64_mulps. -pub fn constructor_x64_mulps(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Xmm { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 2400. - let expr0_0: Type = F32; - let expr1_0 = SseOpcode::Mulps; - let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0); - return expr2_0; -} - -// Generated as internal constructor for term x64_mulpd. -pub fn constructor_x64_mulpd(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Xmm { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 2405. - let expr0_0: Type = F32; - let expr1_0 = SseOpcode::Mulpd; - let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0); - return expr2_0; -} - -// Generated as internal constructor for term x64_divss. -pub fn constructor_x64_divss(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Xmm { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 2410. - let expr0_0: Type = F32; - let expr1_0 = SseOpcode::Divss; - let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0); - return expr2_0; -} - -// Generated as internal constructor for term x64_divsd. -pub fn constructor_x64_divsd(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Xmm { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 2415. - let expr0_0: Type = F64; - let expr1_0 = SseOpcode::Divsd; - let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0); - return expr2_0; -} - -// Generated as internal constructor for term x64_divps. -pub fn constructor_x64_divps(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Xmm { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 2420. - let expr0_0: Type = F32; - let expr1_0 = SseOpcode::Divps; - let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0); - return expr2_0; -} - -// Generated as internal constructor for term x64_divpd. -pub fn constructor_x64_divpd(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Xmm { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 2425. - let expr0_0: Type = F32; - let expr1_0 = SseOpcode::Divpd; - let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0); - return expr2_0; -} - -// Generated as internal constructor for term sse_blend_op. -pub fn constructor_sse_blend_op(ctx: &mut C, arg0: Type) -> SseOpcode { - let pattern0_0 = arg0; - if pattern0_0 == F32X4 { - // Rule at src/isa/x64/inst.isle line 2429. - let expr0_0 = SseOpcode::Blendvps; - return expr0_0; - } - if pattern0_0 == F64X2 { - // Rule at src/isa/x64/inst.isle line 2430. - let expr0_0 = SseOpcode::Blendvpd; - return expr0_0; - } - let pattern0_0 = arg0; - if let Some((pattern1_0, pattern1_1)) = C::multi_lane(ctx, pattern0_0) { - // Rule at src/isa/x64/inst.isle line 2433. - let expr0_0 = SseOpcode::Pblendvb; - return expr0_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "sse_blend_op", "src/isa/x64/inst.isle line 2428" - ); -} - -// Generated as internal constructor for term sse_mov_op. -pub fn constructor_sse_mov_op(ctx: &mut C, arg0: Type) -> SseOpcode { - let pattern0_0 = arg0; - if pattern0_0 == F32X4 { - // Rule at src/isa/x64/inst.isle line 2436. - let expr0_0 = SseOpcode::Movaps; - return expr0_0; - } - if pattern0_0 == F64X2 { - // Rule at src/isa/x64/inst.isle line 2437. - let expr0_0 = SseOpcode::Movapd; - return expr0_0; - } - let pattern0_0 = arg0; - if let Some((pattern1_0, pattern1_1)) = C::multi_lane(ctx, pattern0_0) { - // Rule at src/isa/x64/inst.isle line 2440. - let expr0_0 = SseOpcode::Movdqa; - return expr0_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "sse_mov_op", "src/isa/x64/inst.isle line 2435" - ); -} - -// Generated as internal constructor for term xmm_rm_r_blend. -pub fn constructor_xmm_rm_r_blend( - ctx: &mut C, - arg0: &SseOpcode, - arg1: Xmm, - arg2: &XmmMem, - arg3: Xmm, -) -> Xmm { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - // Rule at src/isa/x64/inst.isle line 2443. - let expr0_0 = C::temp_writable_xmm(ctx); - let expr1_0 = MInst::XmmRmRBlend { - op: pattern0_0.clone(), - src1: pattern1_0, - src2: pattern2_0.clone(), - mask: pattern3_0, - dst: expr0_0, - }; - let expr2_0 = C::emit(ctx, &expr1_0); - let expr3_0 = C::writable_xmm_to_xmm(ctx, expr0_0); - return expr3_0; -} - -// Generated as internal constructor for term x64_blend. -pub fn constructor_x64_blend( - ctx: &mut C, - arg0: Type, - arg1: Xmm, - arg2: &XmmMem, - arg3: Xmm, -) -> Xmm { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - // Rule at src/isa/x64/inst.isle line 2450. - let expr0_0 = constructor_sse_blend_op(ctx, pattern0_0); - let expr1_0 = constructor_xmm_rm_r_blend(ctx, &expr0_0, pattern3_0, pattern2_0, pattern1_0); - return expr1_0; -} - -// Generated as internal constructor for term x64_blendvpd. -pub fn constructor_x64_blendvpd( - ctx: &mut C, - arg0: Xmm, - arg1: &XmmMem, - arg2: Xmm, -) -> Xmm { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/x64/inst.isle line 2455. - let expr0_0 = SseOpcode::Blendvpd; - let expr1_0 = constructor_xmm_rm_r_blend(ctx, &expr0_0, pattern0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term x64_movsd_regmove. -pub fn constructor_x64_movsd_regmove(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Xmm { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 2460. - let expr0_0: Type = I8X16; - let expr1_0 = SseOpcode::Movsd; - let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0); - return expr2_0; -} - -// Generated as internal constructor for term x64_movlhps. -pub fn constructor_x64_movlhps(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Xmm { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 2465. - let expr0_0: Type = I8X16; - let expr1_0 = SseOpcode::Movlhps; - let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0); - return expr2_0; -} - -// Generated as internal constructor for term x64_pmaxs. -pub fn constructor_x64_pmaxs(ctx: &mut C, arg0: Type, arg1: Xmm, arg2: &XmmMem) -> Xmm { - let pattern0_0 = arg0; - if pattern0_0 == I8X16 { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - // Rule at src/isa/x64/inst.isle line 2470. - let expr0_0 = constructor_x64_pmaxsb(ctx, pattern2_0, pattern3_0); - return expr0_0; - } - if pattern0_0 == I16X8 { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - // Rule at src/isa/x64/inst.isle line 2471. - let expr0_0 = constructor_x64_pmaxsw(ctx, pattern2_0, pattern3_0); - return expr0_0; - } - if pattern0_0 == I32X4 { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - // Rule at src/isa/x64/inst.isle line 2472. - let expr0_0 = constructor_x64_pmaxsd(ctx, pattern2_0, pattern3_0); - return expr0_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "x64_pmaxs", "src/isa/x64/inst.isle line 2469" - ); -} - -// Generated as internal constructor for term x64_pmaxsb. -pub fn constructor_x64_pmaxsb(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Xmm { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 2475. - let expr0_0: Type = I8X16; - let expr1_0 = SseOpcode::Pmaxsb; - let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0); - return expr2_0; -} - -// Generated as internal constructor for term x64_pmaxsw. -pub fn constructor_x64_pmaxsw(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Xmm { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 2477. - let expr0_0: Type = I8X16; - let expr1_0 = SseOpcode::Pmaxsw; - let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0); - return expr2_0; -} - -// Generated as internal constructor for term x64_pmaxsd. -pub fn constructor_x64_pmaxsd(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Xmm { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 2479. - let expr0_0: Type = I8X16; - let expr1_0 = SseOpcode::Pmaxsd; - let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0); - return expr2_0; -} - -// Generated as internal constructor for term x64_pmins. -pub fn constructor_x64_pmins(ctx: &mut C, arg0: Type, arg1: Xmm, arg2: &XmmMem) -> Xmm { - let pattern0_0 = arg0; - if pattern0_0 == I8X16 { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - // Rule at src/isa/x64/inst.isle line 2483. - let expr0_0 = constructor_x64_pminsb(ctx, pattern2_0, pattern3_0); - return expr0_0; - } - if pattern0_0 == I16X8 { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - // Rule at src/isa/x64/inst.isle line 2484. - let expr0_0 = constructor_x64_pminsw(ctx, pattern2_0, pattern3_0); - return expr0_0; - } - if pattern0_0 == I32X4 { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - // Rule at src/isa/x64/inst.isle line 2485. - let expr0_0 = constructor_x64_pminsd(ctx, pattern2_0, pattern3_0); - return expr0_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "x64_pmins", "src/isa/x64/inst.isle line 2482" - ); -} - -// Generated as internal constructor for term x64_pminsb. -pub fn constructor_x64_pminsb(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Xmm { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 2488. - let expr0_0: Type = I8X16; - let expr1_0 = SseOpcode::Pminsb; - let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0); - return expr2_0; -} - -// Generated as internal constructor for term x64_pminsw. -pub fn constructor_x64_pminsw(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Xmm { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 2490. - let expr0_0: Type = I16X8; - let expr1_0 = SseOpcode::Pminsw; - let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0); - return expr2_0; -} - -// Generated as internal constructor for term x64_pminsd. -pub fn constructor_x64_pminsd(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Xmm { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 2492. - let expr0_0: Type = I32X4; - let expr1_0 = SseOpcode::Pminsd; - let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0); - return expr2_0; -} - -// Generated as internal constructor for term x64_pmaxu. -pub fn constructor_x64_pmaxu(ctx: &mut C, arg0: Type, arg1: Xmm, arg2: &XmmMem) -> Xmm { - let pattern0_0 = arg0; - if pattern0_0 == I8X16 { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - // Rule at src/isa/x64/inst.isle line 2496. - let expr0_0 = constructor_x64_pmaxub(ctx, pattern2_0, pattern3_0); - return expr0_0; - } - if pattern0_0 == I16X8 { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - // Rule at src/isa/x64/inst.isle line 2497. - let expr0_0 = constructor_x64_pmaxuw(ctx, pattern2_0, pattern3_0); - return expr0_0; - } - if pattern0_0 == I32X4 { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - // Rule at src/isa/x64/inst.isle line 2498. - let expr0_0 = constructor_x64_pmaxud(ctx, pattern2_0, pattern3_0); - return expr0_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "x64_pmaxu", "src/isa/x64/inst.isle line 2495" - ); -} - -// Generated as internal constructor for term x64_pmaxub. -pub fn constructor_x64_pmaxub(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Xmm { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 2501. - let expr0_0: Type = I8X16; - let expr1_0 = SseOpcode::Pmaxub; - let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0); - return expr2_0; -} - -// Generated as internal constructor for term x64_pmaxuw. -pub fn constructor_x64_pmaxuw(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Xmm { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 2503. - let expr0_0: Type = I8X16; - let expr1_0 = SseOpcode::Pmaxuw; - let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0); - return expr2_0; -} - -// Generated as internal constructor for term x64_pmaxud. -pub fn constructor_x64_pmaxud(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Xmm { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 2505. - let expr0_0: Type = I8X16; - let expr1_0 = SseOpcode::Pmaxud; - let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0); - return expr2_0; -} - -// Generated as internal constructor for term x64_pminu. -pub fn constructor_x64_pminu(ctx: &mut C, arg0: Type, arg1: Xmm, arg2: &XmmMem) -> Xmm { - let pattern0_0 = arg0; - if pattern0_0 == I8X16 { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - // Rule at src/isa/x64/inst.isle line 2509. - let expr0_0 = constructor_x64_pminub(ctx, pattern2_0, pattern3_0); - return expr0_0; - } - if pattern0_0 == I16X8 { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - // Rule at src/isa/x64/inst.isle line 2510. - let expr0_0 = constructor_x64_pminuw(ctx, pattern2_0, pattern3_0); - return expr0_0; - } - if pattern0_0 == I32X4 { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - // Rule at src/isa/x64/inst.isle line 2511. - let expr0_0 = constructor_x64_pminud(ctx, pattern2_0, pattern3_0); - return expr0_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "x64_pminu", "src/isa/x64/inst.isle line 2508" - ); -} - -// Generated as internal constructor for term x64_pminub. -pub fn constructor_x64_pminub(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Xmm { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 2514. - let expr0_0: Type = I8X16; - let expr1_0 = SseOpcode::Pminub; - let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0); - return expr2_0; -} - -// Generated as internal constructor for term x64_pminuw. -pub fn constructor_x64_pminuw(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Xmm { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 2516. - let expr0_0: Type = I8X16; - let expr1_0 = SseOpcode::Pminuw; - let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0); - return expr2_0; -} - -// Generated as internal constructor for term x64_pminud. -pub fn constructor_x64_pminud(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Xmm { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 2518. - let expr0_0: Type = I8X16; - let expr1_0 = SseOpcode::Pminud; - let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0); - return expr2_0; -} - -// Generated as internal constructor for term x64_punpcklbw. -pub fn constructor_x64_punpcklbw(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Xmm { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 2522. - let expr0_0: Type = I8X16; - let expr1_0 = SseOpcode::Punpcklbw; - let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0); - return expr2_0; -} - -// Generated as internal constructor for term x64_punpckhbw. -pub fn constructor_x64_punpckhbw(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Xmm { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 2527. - let expr0_0: Type = I8X16; - let expr1_0 = SseOpcode::Punpckhbw; - let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0); - return expr2_0; -} - -// Generated as internal constructor for term x64_packsswb. -pub fn constructor_x64_packsswb(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Xmm { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 2532. - let expr0_0: Type = I8X16; - let expr1_0 = SseOpcode::Packsswb; - let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0); - return expr2_0; -} - -// Generated as internal constructor for term x64_packssdw. -pub fn constructor_x64_packssdw(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Xmm { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 2537. - let expr0_0: Type = I16X8; - let expr1_0 = SseOpcode::Packssdw; - let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0); - return expr2_0; -} - -// Generated as internal constructor for term x64_packuswb. -pub fn constructor_x64_packuswb(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Xmm { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 2542. - let expr0_0: Type = I16X8; - let expr1_0 = SseOpcode::Packuswb; - let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0); - return expr2_0; -} - -// Generated as internal constructor for term x64_packusdw. -pub fn constructor_x64_packusdw(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Xmm { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 2547. - let expr0_0: Type = I16X8; - let expr1_0 = SseOpcode::Packusdw; - let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0); - return expr2_0; -} - -// Generated as internal constructor for term xmm_rm_r_imm. -pub fn constructor_xmm_rm_r_imm( - ctx: &mut C, - arg0: &SseOpcode, - arg1: Reg, - arg2: &RegMem, - arg3: u8, - arg4: &OperandSize, -) -> Xmm { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - let pattern4_0 = arg4; - // Rule at src/isa/x64/inst.isle line 2552. - let expr0_0 = C::temp_writable_xmm(ctx); - let expr1_0 = C::writable_xmm_to_reg(ctx, expr0_0); - let expr2_0 = MInst::XmmRmRImm { - op: pattern0_0.clone(), - src1: pattern1_0, - src2: pattern2_0.clone(), - dst: expr1_0, - imm: pattern3_0, - size: pattern4_0.clone(), - }; - let expr3_0 = C::emit(ctx, &expr2_0); - let expr4_0 = C::writable_xmm_to_xmm(ctx, expr0_0); - return expr4_0; -} - -// Generated as internal constructor for term x64_palignr. -pub fn constructor_x64_palignr( - ctx: &mut C, - arg0: Xmm, - arg1: &XmmMem, - arg2: u8, - arg3: &OperandSize, -) -> Xmm { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - // Rule at src/isa/x64/inst.isle line 2564. - let expr0_0 = SseOpcode::Palignr; - let expr1_0 = C::xmm_to_reg(ctx, pattern0_0); - let expr2_0 = C::xmm_mem_to_reg_mem(ctx, pattern1_0); - let expr3_0 = - constructor_xmm_rm_r_imm(ctx, &expr0_0, expr1_0, &expr2_0, pattern2_0, pattern3_0); - return expr3_0; -} - -// Generated as internal constructor for term x64_cmpp. -pub fn constructor_x64_cmpp( - ctx: &mut C, - arg0: Type, - arg1: Xmm, - arg2: &XmmMem, - arg3: &FcmpImm, -) -> Xmm { - let pattern0_0 = arg0; - if pattern0_0 == F32X4 { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - let pattern4_0 = arg3; - // Rule at src/isa/x64/inst.isle line 2573. - let expr0_0 = constructor_x64_cmpps(ctx, pattern2_0, pattern3_0, pattern4_0); - return expr0_0; - } - if pattern0_0 == F64X2 { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - let pattern4_0 = arg3; - // Rule at src/isa/x64/inst.isle line 2574. - let expr0_0 = constructor_x64_cmppd(ctx, pattern2_0, pattern3_0, pattern4_0); - return expr0_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "x64_cmpp", "src/isa/x64/inst.isle line 2572" - ); -} - -// Generated as internal constructor for term x64_cmpps. -pub fn constructor_x64_cmpps( - ctx: &mut C, - arg0: Xmm, - arg1: &XmmMem, - arg2: &FcmpImm, -) -> Xmm { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/x64/inst.isle line 2577. - let expr0_0 = SseOpcode::Cmpps; - let expr1_0 = C::xmm_to_reg(ctx, pattern0_0); - let expr2_0 = C::xmm_mem_to_reg_mem(ctx, pattern1_0); - let expr3_0 = C::encode_fcmp_imm(ctx, pattern2_0); - let expr4_0 = OperandSize::Size32; - let expr5_0 = constructor_xmm_rm_r_imm(ctx, &expr0_0, expr1_0, &expr2_0, expr3_0, &expr4_0); - return expr5_0; -} - -// Generated as internal constructor for term x64_cmppd. -pub fn constructor_x64_cmppd( - ctx: &mut C, - arg0: Xmm, - arg1: &XmmMem, - arg2: &FcmpImm, -) -> Xmm { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/x64/inst.isle line 2588. - let expr0_0 = SseOpcode::Cmppd; - let expr1_0 = C::xmm_to_reg(ctx, pattern0_0); - let expr2_0 = C::xmm_mem_to_reg_mem(ctx, pattern1_0); - let expr3_0 = C::encode_fcmp_imm(ctx, pattern2_0); - let expr4_0 = OperandSize::Size32; - let expr5_0 = constructor_xmm_rm_r_imm(ctx, &expr0_0, expr1_0, &expr2_0, expr3_0, &expr4_0); - return expr5_0; -} - -// Generated as internal constructor for term x64_pinsrb. -pub fn constructor_x64_pinsrb(ctx: &mut C, arg0: Xmm, arg1: &GprMem, arg2: u8) -> Xmm { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/x64/inst.isle line 2597. - let expr0_0 = SseOpcode::Pinsrb; - let expr1_0 = C::xmm_to_reg(ctx, pattern0_0); - let expr2_0 = C::gpr_mem_to_reg_mem(ctx, pattern1_0); - let expr3_0 = OperandSize::Size32; - let expr4_0 = constructor_xmm_rm_r_imm(ctx, &expr0_0, expr1_0, &expr2_0, pattern2_0, &expr3_0); - return expr4_0; -} - -// Generated as internal constructor for term x64_pinsrw. -pub fn constructor_x64_pinsrw(ctx: &mut C, arg0: Xmm, arg1: &GprMem, arg2: u8) -> Xmm { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/x64/inst.isle line 2606. - let expr0_0 = SseOpcode::Pinsrw; - let expr1_0 = C::xmm_to_reg(ctx, pattern0_0); - let expr2_0 = C::gpr_mem_to_reg_mem(ctx, pattern1_0); - let expr3_0 = OperandSize::Size32; - let expr4_0 = constructor_xmm_rm_r_imm(ctx, &expr0_0, expr1_0, &expr2_0, pattern2_0, &expr3_0); - return expr4_0; -} - -// Generated as internal constructor for term x64_pinsrd. -pub fn constructor_x64_pinsrd( - ctx: &mut C, - arg0: Xmm, - arg1: &GprMem, - arg2: u8, - arg3: &OperandSize, -) -> Xmm { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - // Rule at src/isa/x64/inst.isle line 2615. - let expr0_0 = SseOpcode::Pinsrd; - let expr1_0 = C::xmm_to_reg(ctx, pattern0_0); - let expr2_0 = C::gpr_mem_to_reg_mem(ctx, pattern1_0); - let expr3_0 = - constructor_xmm_rm_r_imm(ctx, &expr0_0, expr1_0, &expr2_0, pattern2_0, pattern3_0); - return expr3_0; -} - -// Generated as internal constructor for term xmm_unary_rm_r_imm. -pub fn constructor_xmm_unary_rm_r_imm( - ctx: &mut C, - arg0: &SseOpcode, - arg1: &XmmMem, - arg2: u8, -) -> Xmm { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/x64/inst.isle line 2624. - let expr0_0 = C::temp_writable_xmm(ctx); - let expr1_0 = MInst::XmmUnaryRmRImm { - op: pattern0_0.clone(), - src: pattern1_0.clone(), - imm: pattern2_0, - dst: expr0_0, - }; - let expr2_0 = C::emit(ctx, &expr1_0); - let expr3_0 = C::writable_xmm_to_xmm(ctx, expr0_0); - return expr3_0; -} - -// Generated as internal constructor for term x64_roundss. -pub fn constructor_x64_roundss(ctx: &mut C, arg0: &XmmMem, arg1: &RoundImm) -> Xmm { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 2631. - let expr0_0 = SseOpcode::Roundss; - let expr1_0 = C::encode_round_imm(ctx, pattern1_0); - let expr2_0 = constructor_xmm_unary_rm_r_imm(ctx, &expr0_0, pattern0_0, expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term x64_roundsd. -pub fn constructor_x64_roundsd(ctx: &mut C, arg0: &XmmMem, arg1: &RoundImm) -> Xmm { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 2636. - let expr0_0 = SseOpcode::Roundsd; - let expr1_0 = C::encode_round_imm(ctx, pattern1_0); - let expr2_0 = constructor_xmm_unary_rm_r_imm(ctx, &expr0_0, pattern0_0, expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term x64_roundps. -pub fn constructor_x64_roundps(ctx: &mut C, arg0: &XmmMem, arg1: &RoundImm) -> Xmm { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 2641. - let expr0_0 = SseOpcode::Roundps; - let expr1_0 = C::encode_round_imm(ctx, pattern1_0); - let expr2_0 = constructor_xmm_unary_rm_r_imm(ctx, &expr0_0, pattern0_0, expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term x64_roundpd. -pub fn constructor_x64_roundpd(ctx: &mut C, arg0: &XmmMem, arg1: &RoundImm) -> Xmm { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 2646. - let expr0_0 = SseOpcode::Roundpd; - let expr1_0 = C::encode_round_imm(ctx, pattern1_0); - let expr2_0 = constructor_xmm_unary_rm_r_imm(ctx, &expr0_0, pattern0_0, expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term x64_pmaddwd. -pub fn constructor_x64_pmaddwd(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Xmm { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 2651. - let expr0_0 = C::temp_writable_xmm(ctx); - let expr1_0 = SseOpcode::Pmaddwd; - let expr2_0 = MInst::XmmRmR { - op: expr1_0, - src1: pattern0_0, - src2: pattern1_0.clone(), - dst: expr0_0, - }; - let expr3_0 = C::emit(ctx, &expr2_0); - let expr4_0 = C::writable_xmm_to_xmm(ctx, expr0_0); - return expr4_0; -} - -// Generated as internal constructor for term x64_pmaddubsw. -pub fn constructor_x64_pmaddubsw(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Xmm { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 2660. - let expr0_0: Type = I8X16; - let expr1_0 = SseOpcode::Pmaddubsw; - let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0); - return expr2_0; -} - -// Generated as internal constructor for term x64_insertps. -pub fn constructor_x64_insertps( - ctx: &mut C, - arg0: Xmm, - arg1: &XmmMem, - arg2: u8, -) -> Xmm { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/x64/inst.isle line 2665. - let expr0_0 = SseOpcode::Insertps; - let expr1_0 = C::xmm_to_reg(ctx, pattern0_0); - let expr2_0 = C::xmm_mem_to_reg_mem(ctx, pattern1_0); - let expr3_0 = OperandSize::Size32; - let expr4_0 = constructor_xmm_rm_r_imm(ctx, &expr0_0, expr1_0, &expr2_0, pattern2_0, &expr3_0); - return expr4_0; -} - -// Generated as internal constructor for term x64_pshufd. -pub fn constructor_x64_pshufd( - ctx: &mut C, - arg0: &XmmMem, - arg1: u8, - arg2: &OperandSize, -) -> Xmm { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/x64/inst.isle line 2674. - let expr0_0 = C::temp_writable_xmm(ctx); - let expr1_0 = SseOpcode::Pshufd; - let expr2_0 = constructor_writable_xmm_to_r_reg(ctx, expr0_0); - let expr3_0 = C::xmm_mem_to_reg_mem(ctx, pattern0_0); - let expr4_0 = C::writable_xmm_to_reg(ctx, expr0_0); - let expr5_0 = MInst::XmmRmRImm { - op: expr1_0, - src1: expr2_0, - src2: expr3_0, - dst: expr4_0, - imm: pattern1_0, - size: pattern2_0.clone(), - }; - let expr6_0 = C::emit(ctx, &expr5_0); - let expr7_0 = C::writable_xmm_to_xmm(ctx, expr0_0); - return expr7_0; -} - -// Generated as internal constructor for term x64_pshufb. -pub fn constructor_x64_pshufb(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Xmm { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 2686. - let expr0_0 = C::temp_writable_xmm(ctx); - let expr1_0 = SseOpcode::Pshufb; - let expr2_0 = MInst::XmmRmR { - op: expr1_0, - src1: pattern0_0, - src2: pattern1_0.clone(), - dst: expr0_0, - }; - let expr3_0 = C::emit(ctx, &expr2_0); - let expr4_0 = C::writable_xmm_to_xmm(ctx, expr0_0); - return expr4_0; -} - -// Generated as internal constructor for term x64_shufps. -pub fn constructor_x64_shufps(ctx: &mut C, arg0: Xmm, arg1: &XmmMem, arg2: u8) -> Xmm { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/x64/inst.isle line 2696. - let expr0_0 = SseOpcode::Shufps; - let expr1_0 = C::xmm_to_reg(ctx, pattern0_0); - let expr2_0 = C::xmm_mem_to_reg_mem(ctx, pattern1_0); - let expr3_0 = OperandSize::Size32; - let expr4_0 = constructor_xmm_rm_r_imm(ctx, &expr0_0, expr1_0, &expr2_0, pattern2_0, &expr3_0); - return expr4_0; -} - -// Generated as internal constructor for term xmm_unary_rm_r. -pub fn constructor_xmm_unary_rm_r(ctx: &mut C, arg0: &SseOpcode, arg1: &XmmMem) -> Xmm { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 2705. - let expr0_0 = C::temp_writable_xmm(ctx); - let expr1_0 = MInst::XmmUnaryRmR { - op: pattern0_0.clone(), - src: pattern1_0.clone(), - dst: expr0_0, - }; - let expr2_0 = C::emit(ctx, &expr1_0); - let expr3_0 = C::writable_xmm_to_xmm(ctx, expr0_0); - return expr3_0; -} - -// Generated as internal constructor for term x64_pabsb. -pub fn constructor_x64_pabsb(ctx: &mut C, arg0: &XmmMem) -> Xmm { - let pattern0_0 = arg0; - // Rule at src/isa/x64/inst.isle line 2712. - let expr0_0 = SseOpcode::Pabsb; - let expr1_0 = constructor_xmm_unary_rm_r(ctx, &expr0_0, pattern0_0); - return expr1_0; -} - -// Generated as internal constructor for term x64_pabsw. -pub fn constructor_x64_pabsw(ctx: &mut C, arg0: &XmmMem) -> Xmm { - let pattern0_0 = arg0; - // Rule at src/isa/x64/inst.isle line 2717. - let expr0_0 = SseOpcode::Pabsw; - let expr1_0 = constructor_xmm_unary_rm_r(ctx, &expr0_0, pattern0_0); - return expr1_0; -} - -// Generated as internal constructor for term x64_pabsd. -pub fn constructor_x64_pabsd(ctx: &mut C, arg0: &XmmMem) -> Xmm { - let pattern0_0 = arg0; - // Rule at src/isa/x64/inst.isle line 2722. - let expr0_0 = SseOpcode::Pabsd; - let expr1_0 = constructor_xmm_unary_rm_r(ctx, &expr0_0, pattern0_0); - return expr1_0; -} - -// Generated as internal constructor for term xmm_unary_rm_r_evex. -pub fn constructor_xmm_unary_rm_r_evex( - ctx: &mut C, - arg0: &Avx512Opcode, - arg1: &XmmMem, -) -> Xmm { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 2727. - let expr0_0 = C::temp_writable_xmm(ctx); - let expr1_0 = MInst::XmmUnaryRmREvex { - op: pattern0_0.clone(), - src: pattern1_0.clone(), - dst: expr0_0, - }; - let expr2_0 = C::emit(ctx, &expr1_0); - let expr3_0 = C::writable_xmm_to_xmm(ctx, expr0_0); - return expr3_0; -} - -// Generated as internal constructor for term x64_vcvtudq2ps. -pub fn constructor_x64_vcvtudq2ps(ctx: &mut C, arg0: &XmmMem) -> Xmm { - let pattern0_0 = arg0; - // Rule at src/isa/x64/inst.isle line 2734. - let expr0_0 = Avx512Opcode::Vcvtudq2ps; - let expr1_0 = constructor_xmm_unary_rm_r_evex(ctx, &expr0_0, pattern0_0); - return expr1_0; -} - -// Generated as internal constructor for term x64_vpabsq. -pub fn constructor_x64_vpabsq(ctx: &mut C, arg0: &XmmMem) -> Xmm { - let pattern0_0 = arg0; - // Rule at src/isa/x64/inst.isle line 2739. - let expr0_0 = Avx512Opcode::Vpabsq; - let expr1_0 = constructor_xmm_unary_rm_r_evex(ctx, &expr0_0, pattern0_0); - return expr1_0; -} - -// Generated as internal constructor for term x64_vpopcntb. -pub fn constructor_x64_vpopcntb(ctx: &mut C, arg0: &XmmMem) -> Xmm { - let pattern0_0 = arg0; - // Rule at src/isa/x64/inst.isle line 2744. - let expr0_0 = Avx512Opcode::Vpopcntb; - let expr1_0 = constructor_xmm_unary_rm_r_evex(ctx, &expr0_0, pattern0_0); - return expr1_0; -} - -// Generated as internal constructor for term xmm_rm_r_evex. -pub fn constructor_xmm_rm_r_evex( - ctx: &mut C, - arg0: &Avx512Opcode, - arg1: &XmmMem, - arg2: Xmm, -) -> Xmm { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/x64/inst.isle line 2749. - let expr0_0 = C::temp_writable_xmm(ctx); - let expr1_0 = MInst::XmmRmREvex { - op: pattern0_0.clone(), - src1: pattern1_0.clone(), - src2: pattern2_0, - dst: expr0_0, - }; - let expr2_0 = C::emit(ctx, &expr1_0); - let expr3_0 = C::writable_xmm_to_xmm(ctx, expr0_0); - return expr3_0; -} - -// Generated as internal constructor for term x64_vpmullq. -pub fn constructor_x64_vpmullq(ctx: &mut C, arg0: &XmmMem, arg1: Xmm) -> Xmm { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 2761. - let expr0_0 = Avx512Opcode::Vpmullq; - let expr1_0 = constructor_xmm_rm_r_evex(ctx, &expr0_0, pattern0_0, pattern1_0); - return expr1_0; -} - -// Generated as internal constructor for term x64_vpermi2b. -pub fn constructor_x64_vpermi2b(ctx: &mut C, arg0: Xmm, arg1: Xmm, arg2: Xmm) -> Xmm { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/x64/inst.isle line 2770. - let expr0_0 = C::temp_writable_xmm(ctx); - let expr1_0 = Avx512Opcode::Vpermi2b; - let expr2_0 = C::xmm_to_xmm_mem(ctx, pattern0_0); - let expr3_0 = MInst::XmmRmREvex3 { - op: expr1_0, - src1: expr2_0, - src2: pattern1_0, - src3: pattern2_0, - dst: expr0_0, - }; - let expr4_0 = C::emit(ctx, &expr3_0); - let expr5_0 = C::writable_xmm_to_xmm(ctx, expr0_0); - return expr5_0; -} - -// Generated as internal constructor for term mul_hi. -pub fn constructor_mul_hi( - ctx: &mut C, - arg0: Type, - arg1: bool, - arg2: Gpr, - arg3: &GprMem, -) -> ValueRegs { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - // Rule at src/isa/x64/inst.isle line 2783. - let expr0_0 = C::temp_writable_gpr(ctx); - let expr1_0 = C::temp_writable_gpr(ctx); - let expr2_0 = C::raw_operand_size_of_type(ctx, pattern0_0); - let expr3_0 = MInst::MulHi { - size: expr2_0, - signed: pattern1_0, - src1: pattern2_0, - src2: pattern3_0.clone(), - dst_lo: expr0_0, - dst_hi: expr1_0, - }; - let expr4_0 = C::emit(ctx, &expr3_0); - let expr5_0 = C::writable_gpr_to_gpr(ctx, expr0_0); - let expr6_0 = C::writable_gpr_to_gpr(ctx, expr1_0); - let expr7_0 = constructor_value_gprs(ctx, expr5_0, expr6_0); - return expr7_0; -} - -// Generated as internal constructor for term mulhi_u. -pub fn constructor_mulhi_u( - ctx: &mut C, - arg0: Type, - arg1: Gpr, - arg2: &GprMem, -) -> ValueRegs { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/x64/inst.isle line 2798. - let expr0_0: bool = false; - let expr1_0 = constructor_mul_hi(ctx, pattern0_0, expr0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term xmm_rmi_xmm. -pub fn constructor_xmm_rmi_xmm( - ctx: &mut C, - arg0: &SseOpcode, - arg1: Xmm, - arg2: &XmmMemImm, -) -> Xmm { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/x64/inst.isle line 2803. - let expr0_0 = C::temp_writable_xmm(ctx); - let expr1_0 = MInst::XmmRmiReg { - opcode: pattern0_0.clone(), - src1: pattern1_0, - src2: pattern2_0.clone(), - dst: expr0_0, - }; - let expr2_0 = C::emit(ctx, &expr1_0); - let expr3_0 = C::writable_xmm_to_xmm(ctx, expr0_0); - return expr3_0; -} - -// Generated as internal constructor for term x64_psllw. -pub fn constructor_x64_psllw(ctx: &mut C, arg0: Xmm, arg1: &XmmMemImm) -> Xmm { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 2813. - let expr0_0 = SseOpcode::Psllw; - let expr1_0 = constructor_xmm_rmi_xmm(ctx, &expr0_0, pattern0_0, pattern1_0); - return expr1_0; -} - -// Generated as internal constructor for term x64_pslld. -pub fn constructor_x64_pslld(ctx: &mut C, arg0: Xmm, arg1: &XmmMemImm) -> Xmm { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 2818. - let expr0_0 = SseOpcode::Pslld; - let expr1_0 = constructor_xmm_rmi_xmm(ctx, &expr0_0, pattern0_0, pattern1_0); - return expr1_0; -} - -// Generated as internal constructor for term x64_psllq. -pub fn constructor_x64_psllq(ctx: &mut C, arg0: Xmm, arg1: &XmmMemImm) -> Xmm { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 2823. - let expr0_0 = SseOpcode::Psllq; - let expr1_0 = constructor_xmm_rmi_xmm(ctx, &expr0_0, pattern0_0, pattern1_0); - return expr1_0; -} - -// Generated as internal constructor for term x64_psrlw. -pub fn constructor_x64_psrlw(ctx: &mut C, arg0: Xmm, arg1: &XmmMemImm) -> Xmm { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 2828. - let expr0_0 = SseOpcode::Psrlw; - let expr1_0 = constructor_xmm_rmi_xmm(ctx, &expr0_0, pattern0_0, pattern1_0); - return expr1_0; -} - -// Generated as internal constructor for term x64_psrld. -pub fn constructor_x64_psrld(ctx: &mut C, arg0: Xmm, arg1: &XmmMemImm) -> Xmm { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 2833. - let expr0_0 = SseOpcode::Psrld; - let expr1_0 = constructor_xmm_rmi_xmm(ctx, &expr0_0, pattern0_0, pattern1_0); - return expr1_0; -} - -// Generated as internal constructor for term x64_psrlq. -pub fn constructor_x64_psrlq(ctx: &mut C, arg0: Xmm, arg1: &XmmMemImm) -> Xmm { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 2838. - let expr0_0 = SseOpcode::Psrlq; - let expr1_0 = constructor_xmm_rmi_xmm(ctx, &expr0_0, pattern0_0, pattern1_0); - return expr1_0; -} - -// Generated as internal constructor for term x64_psraw. -pub fn constructor_x64_psraw(ctx: &mut C, arg0: Xmm, arg1: &XmmMemImm) -> Xmm { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 2843. - let expr0_0 = SseOpcode::Psraw; - let expr1_0 = constructor_xmm_rmi_xmm(ctx, &expr0_0, pattern0_0, pattern1_0); - return expr1_0; -} - -// Generated as internal constructor for term x64_psrad. -pub fn constructor_x64_psrad(ctx: &mut C, arg0: Xmm, arg1: &XmmMemImm) -> Xmm { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 2848. - let expr0_0 = SseOpcode::Psrad; - let expr1_0 = constructor_xmm_rmi_xmm(ctx, &expr0_0, pattern0_0, pattern1_0); - return expr1_0; -} - -// Generated as internal constructor for term x64_pextrb. -pub fn constructor_x64_pextrb(ctx: &mut C, arg0: Type, arg1: Xmm, arg2: u8) -> Gpr { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/x64/inst.isle line 2853. - let expr0_0 = C::temp_writable_gpr(ctx); - let expr1_0 = SseOpcode::Pextrb; - let expr2_0 = constructor_writable_gpr_to_r_reg(ctx, expr0_0); - let expr3_0 = C::xmm_to_reg(ctx, pattern1_0); - let expr4_0 = constructor_xmm_to_reg_mem(ctx, expr3_0); - let expr5_0 = C::xmm_mem_to_reg_mem(ctx, &expr4_0); - let expr6_0 = C::writable_gpr_to_reg(ctx, expr0_0); - let expr7_0 = C::lane_type(ctx, pattern0_0); - let expr8_0 = C::operand_size_of_type_32_64(ctx, expr7_0); - let expr9_0 = MInst::XmmRmRImm { - op: expr1_0, - src1: expr2_0, - src2: expr5_0, - dst: expr6_0, - imm: pattern2_0, - size: expr8_0, - }; - let expr10_0 = C::emit(ctx, &expr9_0); - let expr11_0 = C::writable_gpr_to_gpr(ctx, expr0_0); - return expr11_0; -} - -// Generated as internal constructor for term x64_pextrw. -pub fn constructor_x64_pextrw(ctx: &mut C, arg0: Type, arg1: Xmm, arg2: u8) -> Gpr { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/x64/inst.isle line 2865. - let expr0_0 = C::temp_writable_gpr(ctx); - let expr1_0 = SseOpcode::Pextrw; - let expr2_0 = constructor_writable_gpr_to_r_reg(ctx, expr0_0); - let expr3_0 = C::xmm_to_reg(ctx, pattern1_0); - let expr4_0 = constructor_xmm_to_reg_mem(ctx, expr3_0); - let expr5_0 = C::xmm_mem_to_reg_mem(ctx, &expr4_0); - let expr6_0 = C::writable_gpr_to_reg(ctx, expr0_0); - let expr7_0 = C::lane_type(ctx, pattern0_0); - let expr8_0 = C::operand_size_of_type_32_64(ctx, expr7_0); - let expr9_0 = MInst::XmmRmRImm { - op: expr1_0, - src1: expr2_0, - src2: expr5_0, - dst: expr6_0, - imm: pattern2_0, - size: expr8_0, - }; - let expr10_0 = C::emit(ctx, &expr9_0); - let expr11_0 = C::writable_gpr_to_gpr(ctx, expr0_0); - return expr11_0; -} - -// Generated as internal constructor for term x64_pextrd. -pub fn constructor_x64_pextrd(ctx: &mut C, arg0: Type, arg1: Xmm, arg2: u8) -> Gpr { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/x64/inst.isle line 2877. - let expr0_0 = C::temp_writable_gpr(ctx); - let expr1_0 = SseOpcode::Pextrd; - let expr2_0 = constructor_writable_gpr_to_r_reg(ctx, expr0_0); - let expr3_0 = C::xmm_to_reg(ctx, pattern1_0); - let expr4_0 = constructor_xmm_to_reg_mem(ctx, expr3_0); - let expr5_0 = C::xmm_mem_to_reg_mem(ctx, &expr4_0); - let expr6_0 = C::writable_gpr_to_reg(ctx, expr0_0); - let expr7_0 = C::lane_type(ctx, pattern0_0); - let expr8_0 = C::operand_size_of_type_32_64(ctx, expr7_0); - let expr9_0 = MInst::XmmRmRImm { - op: expr1_0, - src1: expr2_0, - src2: expr5_0, - dst: expr6_0, - imm: pattern2_0, - size: expr8_0, - }; - let expr10_0 = C::emit(ctx, &expr9_0); - let expr11_0 = C::writable_gpr_to_gpr(ctx, expr0_0); - return expr11_0; -} - -// Generated as internal constructor for term xmm_to_gpr. -pub fn constructor_xmm_to_gpr( - ctx: &mut C, - arg0: &SseOpcode, - arg1: Xmm, - arg2: &OperandSize, -) -> Gpr { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/x64/inst.isle line 2889. - let expr0_0 = C::temp_writable_gpr(ctx); - let expr1_0 = MInst::XmmToGpr { - op: pattern0_0.clone(), - src: pattern1_0, - dst: expr0_0, - dst_size: pattern2_0.clone(), - }; - let expr2_0 = C::emit(ctx, &expr1_0); - let expr3_0 = C::writable_gpr_to_gpr(ctx, expr0_0); - return expr3_0; -} - -// Generated as internal constructor for term x64_pmovmskb. -pub fn constructor_x64_pmovmskb(ctx: &mut C, arg0: &OperandSize, arg1: Xmm) -> Gpr { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 2896. - let expr0_0 = SseOpcode::Pmovmskb; - let expr1_0 = constructor_xmm_to_gpr(ctx, &expr0_0, pattern1_0, pattern0_0); - return expr1_0; -} - -// Generated as internal constructor for term x64_movmskps. -pub fn constructor_x64_movmskps(ctx: &mut C, arg0: &OperandSize, arg1: Xmm) -> Gpr { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 2901. - let expr0_0 = SseOpcode::Movmskps; - let expr1_0 = constructor_xmm_to_gpr(ctx, &expr0_0, pattern1_0, pattern0_0); - return expr1_0; -} - -// Generated as internal constructor for term x64_movmskpd. -pub fn constructor_x64_movmskpd(ctx: &mut C, arg0: &OperandSize, arg1: Xmm) -> Gpr { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 2906. - let expr0_0 = SseOpcode::Movmskpd; - let expr1_0 = constructor_xmm_to_gpr(ctx, &expr0_0, pattern1_0, pattern0_0); - return expr1_0; -} - -// Generated as internal constructor for term gpr_to_xmm. -pub fn constructor_gpr_to_xmm( - ctx: &mut C, - arg0: &SseOpcode, - arg1: &GprMem, - arg2: &OperandSize, -) -> Xmm { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/x64/inst.isle line 2911. - let expr0_0 = C::temp_writable_xmm(ctx); - let expr1_0 = MInst::GprToXmm { - op: pattern0_0.clone(), - src: pattern1_0.clone(), - dst: expr0_0, - src_size: pattern2_0.clone(), - }; - let expr2_0 = C::emit(ctx, &expr1_0); - let expr3_0 = C::writable_xmm_to_xmm(ctx, expr0_0); - return expr3_0; -} - -// Generated as internal constructor for term x64_not. -pub fn constructor_x64_not(ctx: &mut C, arg0: Type, arg1: Gpr) -> Gpr { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 2918. - let expr0_0 = C::temp_writable_gpr(ctx); - let expr1_0 = C::operand_size_of_type_32_64(ctx, pattern0_0); - let expr2_0 = MInst::Not { - size: expr1_0, - src: pattern1_0, - dst: expr0_0, - }; - let expr3_0 = C::emit(ctx, &expr2_0); - let expr4_0 = C::writable_gpr_to_gpr(ctx, expr0_0); - return expr4_0; -} - -// Generated as internal constructor for term x64_neg. -pub fn constructor_x64_neg(ctx: &mut C, arg0: Type, arg1: Gpr) -> Gpr { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 2926. - let expr0_0 = C::temp_writable_gpr(ctx); - let expr1_0 = C::raw_operand_size_of_type(ctx, pattern0_0); - let expr2_0 = MInst::Neg { - size: expr1_0, - src: pattern1_0, - dst: expr0_0, - }; - let expr3_0 = C::emit(ctx, &expr2_0); - let expr4_0 = C::writable_gpr_to_gpr(ctx, expr0_0); - return expr4_0; -} - -// Generated as internal constructor for term x64_neg_paired. -pub fn constructor_x64_neg_paired(ctx: &mut C, arg0: Type, arg1: Gpr) -> ProducesFlags { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 2934. - let expr0_0 = C::temp_writable_gpr(ctx); - let expr1_0 = C::raw_operand_size_of_type(ctx, pattern0_0); - let expr2_0 = MInst::Neg { - size: expr1_0, - src: pattern1_0, - dst: expr0_0, - }; - let expr3_0 = constructor_writable_gpr_to_r_reg(ctx, expr0_0); - let expr4_0 = ProducesFlags::ProducesFlagsReturnsResultWithConsumer { - inst: expr2_0, - result: expr3_0, - }; - return expr4_0; -} - -// Generated as internal constructor for term x64_lea. -pub fn constructor_x64_lea(ctx: &mut C, arg0: &SyntheticAmode) -> Gpr { - let pattern0_0 = arg0; - // Rule at src/isa/x64/inst.isle line 2941. - let expr0_0 = C::temp_writable_gpr(ctx); - let expr1_0 = MInst::LoadEffectiveAddress { - addr: pattern0_0.clone(), - dst: expr0_0, - }; - let expr2_0 = C::emit(ctx, &expr1_0); - let expr3_0 = C::writable_gpr_to_gpr(ctx, expr0_0); - return expr3_0; -} - -// Generated as internal constructor for term x64_ud2. -pub fn constructor_x64_ud2(ctx: &mut C, arg0: &TrapCode) -> SideEffectNoResult { - let pattern0_0 = arg0; - // Rule at src/isa/x64/inst.isle line 2948. - let expr0_0 = MInst::Ud2 { - trap_code: pattern0_0.clone(), - }; - let expr1_0 = SideEffectNoResult::Inst { inst: expr0_0 }; - return expr1_0; -} - -// Generated as internal constructor for term x64_hlt. -pub fn constructor_x64_hlt(ctx: &mut C) -> SideEffectNoResult { - // Rule at src/isa/x64/inst.isle line 2953. - let expr0_0 = MInst::Hlt; - let expr1_0 = SideEffectNoResult::Inst { inst: expr0_0 }; - return expr1_0; -} - -// Generated as internal constructor for term x64_lzcnt. -pub fn constructor_x64_lzcnt(ctx: &mut C, arg0: Type, arg1: Gpr) -> Gpr { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 2958. - let expr0_0 = C::temp_writable_gpr(ctx); - let expr1_0 = C::operand_size_of_type_32_64(ctx, pattern0_0); - let expr2_0 = UnaryRmROpcode::Lzcnt; - let expr3_0 = C::gpr_to_gpr_mem(ctx, pattern1_0); - let expr4_0 = MInst::UnaryRmR { - size: expr1_0, - op: expr2_0, - src: expr3_0, - dst: expr0_0, - }; - let expr5_0 = C::emit(ctx, &expr4_0); - let expr6_0 = C::writable_gpr_to_gpr(ctx, expr0_0); - return expr6_0; -} - -// Generated as internal constructor for term x64_tzcnt. -pub fn constructor_x64_tzcnt(ctx: &mut C, arg0: Type, arg1: Gpr) -> Gpr { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 2966. - let expr0_0 = C::temp_writable_gpr(ctx); - let expr1_0 = C::operand_size_of_type_32_64(ctx, pattern0_0); - let expr2_0 = UnaryRmROpcode::Tzcnt; - let expr3_0 = C::gpr_to_gpr_mem(ctx, pattern1_0); - let expr4_0 = MInst::UnaryRmR { - size: expr1_0, - op: expr2_0, - src: expr3_0, - dst: expr0_0, - }; - let expr5_0 = C::emit(ctx, &expr4_0); - let expr6_0 = C::writable_gpr_to_gpr(ctx, expr0_0); - return expr6_0; -} - -// Generated as internal constructor for term x64_bsr. -pub fn constructor_x64_bsr(ctx: &mut C, arg0: Type, arg1: Gpr) -> ProducesFlags { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 2974. - let expr0_0 = C::temp_writable_gpr(ctx); - let expr1_0 = C::operand_size_of_type_32_64(ctx, pattern0_0); - let expr2_0 = UnaryRmROpcode::Bsr; - let expr3_0 = C::gpr_to_gpr_mem(ctx, pattern1_0); - let expr4_0 = MInst::UnaryRmR { - size: expr1_0, - op: expr2_0, - src: expr3_0, - dst: expr0_0, - }; - let expr5_0 = constructor_writable_gpr_to_r_reg(ctx, expr0_0); - let expr6_0 = ProducesFlags::ProducesFlagsReturnsReg { - inst: expr4_0, - result: expr5_0, - }; - return expr6_0; -} - -// Generated as internal constructor for term bsr_or_else. -pub fn constructor_bsr_or_else(ctx: &mut C, arg0: Type, arg1: Gpr, arg2: Gpr) -> Gpr { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/x64/inst.isle line 2983. - let expr0_0 = constructor_x64_bsr(ctx, pattern0_0, pattern1_0); - let expr1_0 = constructor_produces_flags_get_reg(ctx, &expr0_0); - let expr2_0 = C::gpr_new(ctx, expr1_0); - let expr3_0 = CC::Z; - let expr4_0 = C::gpr_to_gpr_mem(ctx, pattern2_0); - let expr5_0 = constructor_cmove(ctx, pattern0_0, &expr3_0, &expr4_0, expr2_0); - let expr6_0 = constructor_produces_flags_ignore(ctx, &expr0_0); - let expr7_0 = constructor_with_flags_reg(ctx, &expr6_0, &expr5_0); - let expr8_0 = C::gpr_new(ctx, expr7_0); - return expr8_0; -} - -// Generated as internal constructor for term x64_bsf. -pub fn constructor_x64_bsf(ctx: &mut C, arg0: Type, arg1: Gpr) -> ProducesFlags { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 2994. - let expr0_0 = C::temp_writable_gpr(ctx); - let expr1_0 = C::operand_size_of_type_32_64(ctx, pattern0_0); - let expr2_0 = UnaryRmROpcode::Bsf; - let expr3_0 = C::gpr_to_gpr_mem(ctx, pattern1_0); - let expr4_0 = MInst::UnaryRmR { - size: expr1_0, - op: expr2_0, - src: expr3_0, - dst: expr0_0, - }; - let expr5_0 = constructor_writable_gpr_to_r_reg(ctx, expr0_0); - let expr6_0 = ProducesFlags::ProducesFlagsReturnsReg { - inst: expr4_0, - result: expr5_0, - }; - return expr6_0; -} - -// Generated as internal constructor for term bsf_or_else. -pub fn constructor_bsf_or_else(ctx: &mut C, arg0: Type, arg1: Gpr, arg2: Gpr) -> Gpr { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/x64/inst.isle line 3003. - let expr0_0 = constructor_x64_bsf(ctx, pattern0_0, pattern1_0); - let expr1_0 = constructor_produces_flags_get_reg(ctx, &expr0_0); - let expr2_0 = C::gpr_new(ctx, expr1_0); - let expr3_0 = CC::Z; - let expr4_0 = C::gpr_to_gpr_mem(ctx, pattern2_0); - let expr5_0 = constructor_cmove(ctx, pattern0_0, &expr3_0, &expr4_0, expr2_0); - let expr6_0 = constructor_produces_flags_ignore(ctx, &expr0_0); - let expr7_0 = constructor_with_flags_reg(ctx, &expr6_0, &expr5_0); - let expr8_0 = C::gpr_new(ctx, expr7_0); - return expr8_0; -} - -// Generated as internal constructor for term x64_popcnt. -pub fn constructor_x64_popcnt(ctx: &mut C, arg0: Type, arg1: Gpr) -> Gpr { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 3014. - let expr0_0 = C::temp_writable_gpr(ctx); - let expr1_0 = C::operand_size_of_type_32_64(ctx, pattern0_0); - let expr2_0 = UnaryRmROpcode::Popcnt; - let expr3_0 = C::gpr_to_gpr_mem(ctx, pattern1_0); - let expr4_0 = MInst::UnaryRmR { - size: expr1_0, - op: expr2_0, - src: expr3_0, - dst: expr0_0, - }; - let expr5_0 = C::emit(ctx, &expr4_0); - let expr6_0 = C::writable_gpr_to_gpr(ctx, expr0_0); - return expr6_0; -} - -// Generated as internal constructor for term xmm_min_max_seq. -pub fn constructor_xmm_min_max_seq( - ctx: &mut C, - arg0: Type, - arg1: bool, - arg2: Xmm, - arg3: Xmm, -) -> Xmm { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - // Rule at src/isa/x64/inst.isle line 3022. - let expr0_0 = C::temp_writable_xmm(ctx); - let expr1_0 = C::operand_size_of_type_32_64(ctx, pattern0_0); - let expr2_0 = MInst::XmmMinMaxSeq { - size: expr1_0, - is_min: pattern1_0, - lhs: pattern2_0, - rhs: pattern3_0, - dst: expr0_0, - }; - let expr3_0 = C::emit(ctx, &expr2_0); - let expr4_0 = C::writable_xmm_to_xmm(ctx, expr0_0); - return expr4_0; -} - -// Generated as internal constructor for term x64_minss. -pub fn constructor_x64_minss(ctx: &mut C, arg0: Xmm, arg1: Xmm) -> Xmm { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 3030. - let expr0_0 = C::temp_writable_xmm(ctx); - let expr1_0 = SseOpcode::Minss; - let expr2_0 = C::xmm_to_xmm_mem(ctx, pattern1_0); - let expr3_0 = MInst::XmmRmR { - op: expr1_0, - src1: pattern0_0, - src2: expr2_0, - dst: expr0_0, - }; - let expr4_0 = C::emit(ctx, &expr3_0); - let expr5_0 = C::writable_xmm_to_xmm(ctx, expr0_0); - return expr5_0; -} - -// Generated as internal constructor for term x64_minsd. -pub fn constructor_x64_minsd(ctx: &mut C, arg0: Xmm, arg1: Xmm) -> Xmm { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 3037. - let expr0_0 = C::temp_writable_xmm(ctx); - let expr1_0 = SseOpcode::Minsd; - let expr2_0 = C::xmm_to_xmm_mem(ctx, pattern1_0); - let expr3_0 = MInst::XmmRmR { - op: expr1_0, - src1: pattern0_0, - src2: expr2_0, - dst: expr0_0, - }; - let expr4_0 = C::emit(ctx, &expr3_0); - let expr5_0 = C::writable_xmm_to_xmm(ctx, expr0_0); - return expr5_0; -} - -// Generated as internal constructor for term x64_minps. -pub fn constructor_x64_minps(ctx: &mut C, arg0: Xmm, arg1: Xmm) -> Xmm { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 3045. - let expr0_0 = C::temp_writable_xmm(ctx); - let expr1_0 = SseOpcode::Minps; - let expr2_0 = C::xmm_to_xmm_mem(ctx, pattern1_0); - let expr3_0 = MInst::XmmRmR { - op: expr1_0, - src1: pattern0_0, - src2: expr2_0, - dst: expr0_0, - }; - let expr4_0 = C::emit(ctx, &expr3_0); - let expr5_0 = C::writable_xmm_to_xmm(ctx, expr0_0); - return expr5_0; -} - -// Generated as internal constructor for term x64_minpd. -pub fn constructor_x64_minpd(ctx: &mut C, arg0: Xmm, arg1: Xmm) -> Xmm { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 3052. - let expr0_0 = C::temp_writable_xmm(ctx); - let expr1_0 = SseOpcode::Minpd; - let expr2_0 = C::xmm_to_xmm_mem(ctx, pattern1_0); - let expr3_0 = MInst::XmmRmR { - op: expr1_0, - src1: pattern0_0, - src2: expr2_0, - dst: expr0_0, - }; - let expr4_0 = C::emit(ctx, &expr3_0); - let expr5_0 = C::writable_xmm_to_xmm(ctx, expr0_0); - return expr5_0; -} - -// Generated as internal constructor for term x64_maxss. -pub fn constructor_x64_maxss(ctx: &mut C, arg0: Xmm, arg1: Xmm) -> Xmm { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 3059. - let expr0_0 = C::temp_writable_xmm(ctx); - let expr1_0 = SseOpcode::Maxss; - let expr2_0 = C::xmm_to_xmm_mem(ctx, pattern1_0); - let expr3_0 = MInst::XmmRmR { - op: expr1_0, - src1: pattern0_0, - src2: expr2_0, - dst: expr0_0, - }; - let expr4_0 = C::emit(ctx, &expr3_0); - let expr5_0 = C::writable_xmm_to_xmm(ctx, expr0_0); - return expr5_0; -} - -// Generated as internal constructor for term x64_maxsd. -pub fn constructor_x64_maxsd(ctx: &mut C, arg0: Xmm, arg1: Xmm) -> Xmm { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 3066. - let expr0_0 = C::temp_writable_xmm(ctx); - let expr1_0 = SseOpcode::Maxsd; - let expr2_0 = C::xmm_to_xmm_mem(ctx, pattern1_0); - let expr3_0 = MInst::XmmRmR { - op: expr1_0, - src1: pattern0_0, - src2: expr2_0, - dst: expr0_0, - }; - let expr4_0 = C::emit(ctx, &expr3_0); - let expr5_0 = C::writable_xmm_to_xmm(ctx, expr0_0); - return expr5_0; -} - -// Generated as internal constructor for term x64_maxps. -pub fn constructor_x64_maxps(ctx: &mut C, arg0: Xmm, arg1: Xmm) -> Xmm { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 3073. - let expr0_0 = C::temp_writable_xmm(ctx); - let expr1_0 = SseOpcode::Maxps; - let expr2_0 = C::xmm_to_xmm_mem(ctx, pattern1_0); - let expr3_0 = MInst::XmmRmR { - op: expr1_0, - src1: pattern0_0, - src2: expr2_0, - dst: expr0_0, - }; - let expr4_0 = C::emit(ctx, &expr3_0); - let expr5_0 = C::writable_xmm_to_xmm(ctx, expr0_0); - return expr5_0; -} - -// Generated as internal constructor for term x64_maxpd. -pub fn constructor_x64_maxpd(ctx: &mut C, arg0: Xmm, arg1: Xmm) -> Xmm { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 3080. - let expr0_0 = C::temp_writable_xmm(ctx); - let expr1_0 = SseOpcode::Maxpd; - let expr2_0 = C::xmm_to_xmm_mem(ctx, pattern1_0); - let expr3_0 = MInst::XmmRmR { - op: expr1_0, - src1: pattern0_0, - src2: expr2_0, - dst: expr0_0, - }; - let expr4_0 = C::emit(ctx, &expr3_0); - let expr5_0 = C::writable_xmm_to_xmm(ctx, expr0_0); - return expr5_0; -} - -// Generated as internal constructor for term xmm_rmr_vex. -pub fn constructor_xmm_rmr_vex( - ctx: &mut C, - arg0: &AvxOpcode, - arg1: Xmm, - arg2: Xmm, - arg3: &XmmMem, -) -> Xmm { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - // Rule at src/isa/x64/inst.isle line 3088. - let expr0_0 = C::temp_writable_xmm(ctx); - let expr1_0 = MInst::XmmRmRVex { - op: pattern0_0.clone(), - src1: pattern1_0, - src2: pattern2_0, - src3: pattern3_0.clone(), - dst: expr0_0, - }; - let expr2_0 = C::emit(ctx, &expr1_0); - let expr3_0 = C::writable_xmm_to_xmm(ctx, expr0_0); - return expr3_0; -} - -// Generated as internal constructor for term x64_vfmadd213ss. -pub fn constructor_x64_vfmadd213ss( - ctx: &mut C, - arg0: Xmm, - arg1: Xmm, - arg2: Xmm, -) -> Xmm { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/x64/inst.isle line 3101. - let expr0_0 = AvxOpcode::Vfmadd213ss; - let expr1_0 = C::xmm_to_xmm_mem(ctx, pattern2_0); - let expr2_0 = constructor_xmm_rmr_vex(ctx, &expr0_0, pattern0_0, pattern1_0, &expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term x64_vfmadd213sd. -pub fn constructor_x64_vfmadd213sd( - ctx: &mut C, - arg0: Xmm, - arg1: Xmm, - arg2: Xmm, -) -> Xmm { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/x64/inst.isle line 3108. - let expr0_0 = AvxOpcode::Vfmadd213sd; - let expr1_0 = C::xmm_to_xmm_mem(ctx, pattern2_0); - let expr2_0 = constructor_xmm_rmr_vex(ctx, &expr0_0, pattern0_0, pattern1_0, &expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term x64_vfmadd213ps. -pub fn constructor_x64_vfmadd213ps( - ctx: &mut C, - arg0: Xmm, - arg1: Xmm, - arg2: Xmm, -) -> Xmm { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/x64/inst.isle line 3115. - let expr0_0 = AvxOpcode::Vfmadd213ps; - let expr1_0 = C::xmm_to_xmm_mem(ctx, pattern2_0); - let expr2_0 = constructor_xmm_rmr_vex(ctx, &expr0_0, pattern0_0, pattern1_0, &expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term x64_vfmadd213pd. -pub fn constructor_x64_vfmadd213pd( - ctx: &mut C, - arg0: Xmm, - arg1: Xmm, - arg2: Xmm, -) -> Xmm { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/x64/inst.isle line 3122. - let expr0_0 = AvxOpcode::Vfmadd213pd; - let expr1_0 = C::xmm_to_xmm_mem(ctx, pattern2_0); - let expr2_0 = constructor_xmm_rmr_vex(ctx, &expr0_0, pattern0_0, pattern1_0, &expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term x64_sqrtss. -pub fn constructor_x64_sqrtss(ctx: &mut C, arg0: Xmm) -> Xmm { - let pattern0_0 = arg0; - // Rule at src/isa/x64/inst.isle line 3128. - let expr0_0 = C::temp_writable_xmm(ctx); - let expr1_0 = SseOpcode::Sqrtss; - let expr2_0 = C::xmm_to_xmm_mem(ctx, pattern0_0); - let expr3_0 = MInst::XmmUnaryRmR { - op: expr1_0, - src: expr2_0, - dst: expr0_0, - }; - let expr4_0 = C::emit(ctx, &expr3_0); - let expr5_0 = C::writable_xmm_to_xmm(ctx, expr0_0); - return expr5_0; -} - -// Generated as internal constructor for term x64_sqrtsd. -pub fn constructor_x64_sqrtsd(ctx: &mut C, arg0: Xmm) -> Xmm { - let pattern0_0 = arg0; - // Rule at src/isa/x64/inst.isle line 3135. - let expr0_0 = C::temp_writable_xmm(ctx); - let expr1_0 = SseOpcode::Sqrtsd; - let expr2_0 = C::xmm_to_xmm_mem(ctx, pattern0_0); - let expr3_0 = MInst::XmmUnaryRmR { - op: expr1_0, - src: expr2_0, - dst: expr0_0, - }; - let expr4_0 = C::emit(ctx, &expr3_0); - let expr5_0 = C::writable_xmm_to_xmm(ctx, expr0_0); - return expr5_0; -} - -// Generated as internal constructor for term x64_sqrtps. -pub fn constructor_x64_sqrtps(ctx: &mut C, arg0: Xmm) -> Xmm { - let pattern0_0 = arg0; - // Rule at src/isa/x64/inst.isle line 3142. - let expr0_0 = C::temp_writable_xmm(ctx); - let expr1_0 = SseOpcode::Sqrtps; - let expr2_0 = C::xmm_to_xmm_mem(ctx, pattern0_0); - let expr3_0 = MInst::XmmUnaryRmR { - op: expr1_0, - src: expr2_0, - dst: expr0_0, - }; - let expr4_0 = C::emit(ctx, &expr3_0); - let expr5_0 = C::writable_xmm_to_xmm(ctx, expr0_0); - return expr5_0; -} - -// Generated as internal constructor for term x64_sqrtpd. -pub fn constructor_x64_sqrtpd(ctx: &mut C, arg0: Xmm) -> Xmm { - let pattern0_0 = arg0; - // Rule at src/isa/x64/inst.isle line 3149. - let expr0_0 = C::temp_writable_xmm(ctx); - let expr1_0 = SseOpcode::Sqrtpd; - let expr2_0 = C::xmm_to_xmm_mem(ctx, pattern0_0); - let expr3_0 = MInst::XmmUnaryRmR { - op: expr1_0, - src: expr2_0, - dst: expr0_0, - }; - let expr4_0 = C::emit(ctx, &expr3_0); - let expr5_0 = C::writable_xmm_to_xmm(ctx, expr0_0); - return expr5_0; -} - -// Generated as internal constructor for term x64_cvtss2sd. -pub fn constructor_x64_cvtss2sd(ctx: &mut C, arg0: Xmm) -> Xmm { - let pattern0_0 = arg0; - // Rule at src/isa/x64/inst.isle line 3156. - let expr0_0 = C::temp_writable_xmm(ctx); - let expr1_0 = SseOpcode::Cvtss2sd; - let expr2_0 = C::xmm_to_xmm_mem(ctx, pattern0_0); - let expr3_0 = MInst::XmmUnaryRmR { - op: expr1_0, - src: expr2_0, - dst: expr0_0, - }; - let expr4_0 = C::emit(ctx, &expr3_0); - let expr5_0 = C::writable_xmm_to_xmm(ctx, expr0_0); - return expr5_0; -} - -// Generated as internal constructor for term x64_cvtsd2ss. -pub fn constructor_x64_cvtsd2ss(ctx: &mut C, arg0: Xmm) -> Xmm { - let pattern0_0 = arg0; - // Rule at src/isa/x64/inst.isle line 3163. - let expr0_0 = C::temp_writable_xmm(ctx); - let expr1_0 = SseOpcode::Cvtsd2ss; - let expr2_0 = C::xmm_to_xmm_mem(ctx, pattern0_0); - let expr3_0 = MInst::XmmUnaryRmR { - op: expr1_0, - src: expr2_0, - dst: expr0_0, - }; - let expr4_0 = C::emit(ctx, &expr3_0); - let expr5_0 = C::writable_xmm_to_xmm(ctx, expr0_0); - return expr5_0; -} - -// Generated as internal constructor for term x64_cvtdq2ps. -pub fn constructor_x64_cvtdq2ps(ctx: &mut C, arg0: Xmm) -> Xmm { - let pattern0_0 = arg0; - // Rule at src/isa/x64/inst.isle line 3170. - let expr0_0 = C::temp_writable_xmm(ctx); - let expr1_0 = SseOpcode::Cvtdq2ps; - let expr2_0 = C::xmm_to_xmm_mem(ctx, pattern0_0); - let expr3_0 = MInst::XmmUnaryRmR { - op: expr1_0, - src: expr2_0, - dst: expr0_0, - }; - let expr4_0 = C::emit(ctx, &expr3_0); - let expr5_0 = C::writable_xmm_to_xmm(ctx, expr0_0); - return expr5_0; -} - -// Generated as internal constructor for term x64_cvtps2pd. -pub fn constructor_x64_cvtps2pd(ctx: &mut C, arg0: Xmm) -> Xmm { - let pattern0_0 = arg0; - // Rule at src/isa/x64/inst.isle line 3177. - let expr0_0 = C::temp_writable_xmm(ctx); - let expr1_0 = SseOpcode::Cvtps2pd; - let expr2_0 = C::xmm_to_xmm_mem(ctx, pattern0_0); - let expr3_0 = MInst::XmmUnaryRmR { - op: expr1_0, - src: expr2_0, - dst: expr0_0, - }; - let expr4_0 = C::emit(ctx, &expr3_0); - let expr5_0 = C::writable_xmm_to_xmm(ctx, expr0_0); - return expr5_0; -} - -// Generated as internal constructor for term x64_cvtpd2ps. -pub fn constructor_x64_cvtpd2ps(ctx: &mut C, arg0: Xmm) -> Xmm { - let pattern0_0 = arg0; - // Rule at src/isa/x64/inst.isle line 3184. - let expr0_0 = C::temp_writable_xmm(ctx); - let expr1_0 = SseOpcode::Cvtpd2ps; - let expr2_0 = C::xmm_to_xmm_mem(ctx, pattern0_0); - let expr3_0 = MInst::XmmUnaryRmR { - op: expr1_0, - src: expr2_0, - dst: expr0_0, - }; - let expr4_0 = C::emit(ctx, &expr3_0); - let expr5_0 = C::writable_xmm_to_xmm(ctx, expr0_0); - return expr5_0; -} - -// Generated as internal constructor for term x64_cvtdq2pd. -pub fn constructor_x64_cvtdq2pd(ctx: &mut C, arg0: Type, arg1: Xmm) -> Xmm { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 3191. - let expr0_0 = C::temp_writable_xmm(ctx); - let expr1_0 = SseOpcode::Cvtdq2pd; - let expr2_0 = C::xmm_to_xmm_mem(ctx, pattern1_0); - let expr3_0 = MInst::XmmUnaryRmR { - op: expr1_0, - src: expr2_0, - dst: expr0_0, - }; - let expr4_0 = C::emit(ctx, &expr3_0); - let expr5_0 = C::writable_xmm_to_xmm(ctx, expr0_0); - return expr5_0; -} - -// Generated as internal constructor for term x64_cvtsi2ss. -pub fn constructor_x64_cvtsi2ss(ctx: &mut C, arg0: Type, arg1: &GprMem) -> Xmm { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 3198. - let expr0_0 = C::temp_writable_xmm(ctx); - let expr1_0 = C::raw_operand_size_of_type(ctx, pattern0_0); - let expr2_0 = SseOpcode::Cvtsi2ss; - let expr3_0 = MInst::GprToXmm { - op: expr2_0, - src: pattern1_0.clone(), - dst: expr0_0, - src_size: expr1_0, - }; - let expr4_0 = C::emit(ctx, &expr3_0); - let expr5_0 = C::writable_xmm_to_xmm(ctx, expr0_0); - return expr5_0; -} - -// Generated as internal constructor for term x64_cvtsi2sd. -pub fn constructor_x64_cvtsi2sd(ctx: &mut C, arg0: Type, arg1: &GprMem) -> Xmm { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 3206. - let expr0_0 = C::temp_writable_xmm(ctx); - let expr1_0 = C::raw_operand_size_of_type(ctx, pattern0_0); - let expr2_0 = SseOpcode::Cvtsi2sd; - let expr3_0 = MInst::GprToXmm { - op: expr2_0, - src: pattern1_0.clone(), - dst: expr0_0, - src_size: expr1_0, - }; - let expr4_0 = C::emit(ctx, &expr3_0); - let expr5_0 = C::writable_xmm_to_xmm(ctx, expr0_0); - return expr5_0; -} - -// Generated as internal constructor for term x64_cvttps2dq. -pub fn constructor_x64_cvttps2dq(ctx: &mut C, arg0: Type, arg1: &XmmMem) -> Xmm { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 3214. - let expr0_0 = SseOpcode::Cvttps2dq; - let expr1_0 = constructor_xmm_unary_rm_r(ctx, &expr0_0, pattern1_0); - return expr1_0; -} - -// Generated as internal constructor for term x64_cvttpd2dq. -pub fn constructor_x64_cvttpd2dq(ctx: &mut C, arg0: &XmmMem) -> Xmm { - let pattern0_0 = arg0; - // Rule at src/isa/x64/inst.isle line 3219. - let expr0_0 = SseOpcode::Cvttpd2dq; - let expr1_0 = constructor_xmm_unary_rm_r(ctx, &expr0_0, pattern0_0); - return expr1_0; -} - -// Generated as internal constructor for term cvt_u64_to_float_seq. -pub fn constructor_cvt_u64_to_float_seq(ctx: &mut C, arg0: Type, arg1: Gpr) -> Xmm { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 3223. - let expr0_0 = C::raw_operand_size_of_type(ctx, pattern0_0); - let expr1_0 = C::temp_writable_xmm(ctx); - let expr2_0 = C::temp_writable_gpr(ctx); - let expr3_0 = C::temp_writable_gpr(ctx); - let expr4_0 = MInst::CvtUint64ToFloatSeq { - dst_size: expr0_0, - src: pattern1_0, - dst: expr1_0, - tmp_gpr1: expr2_0, - tmp_gpr2: expr3_0, - }; - let expr5_0 = C::emit(ctx, &expr4_0); - let expr6_0 = C::writable_xmm_to_xmm(ctx, expr1_0); - return expr6_0; -} - -// Generated as internal constructor for term cvt_float_to_uint_seq. -pub fn constructor_cvt_float_to_uint_seq( - ctx: &mut C, - arg0: Type, - arg1: Value, - arg2: bool, -) -> Gpr { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = C::value_type(ctx, pattern1_0); - let pattern3_0 = arg2; - // Rule at src/isa/x64/inst.isle line 3232. - let expr0_0 = C::raw_operand_size_of_type(ctx, pattern0_0); - let expr1_0 = C::raw_operand_size_of_type(ctx, pattern2_0); - let expr2_0 = C::temp_writable_gpr(ctx); - let expr3_0 = C::temp_writable_xmm(ctx); - let expr4_0 = C::temp_writable_xmm(ctx); - let expr5_0 = C::temp_writable_gpr(ctx); - let expr6_0 = constructor_put_in_xmm(ctx, pattern1_0); - let expr7_0 = MInst::CvtFloatToUintSeq { - dst_size: expr0_0, - src_size: expr1_0, - is_saturating: pattern3_0, - src: expr6_0, - dst: expr2_0, - tmp_gpr: expr5_0, - tmp_xmm: expr3_0, - tmp_xmm2: expr4_0, - }; - let expr8_0 = C::emit(ctx, &expr7_0); - let expr9_0 = C::writable_gpr_to_gpr(ctx, expr2_0); - return expr9_0; -} - -// Generated as internal constructor for term cvt_float_to_sint_seq. -pub fn constructor_cvt_float_to_sint_seq( - ctx: &mut C, - arg0: Type, - arg1: Value, - arg2: bool, -) -> Gpr { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = C::value_type(ctx, pattern1_0); - let pattern3_0 = arg2; - // Rule at src/isa/x64/inst.isle line 3244. - let expr0_0 = C::raw_operand_size_of_type(ctx, pattern0_0); - let expr1_0 = C::raw_operand_size_of_type(ctx, pattern2_0); - let expr2_0 = C::temp_writable_gpr(ctx); - let expr3_0 = C::temp_writable_xmm(ctx); - let expr4_0 = C::temp_writable_gpr(ctx); - let expr5_0 = constructor_put_in_xmm(ctx, pattern1_0); - let expr6_0 = MInst::CvtFloatToSintSeq { - dst_size: expr0_0, - src_size: expr1_0, - is_saturating: pattern3_0, - src: expr5_0, - dst: expr2_0, - tmp_gpr: expr4_0, - tmp_xmm: expr3_0, - }; - let expr7_0 = C::emit(ctx, &expr6_0); - let expr8_0 = C::writable_gpr_to_gpr(ctx, expr2_0); - return expr8_0; -} - -// Generated as internal constructor for term x64_pcmpeq. -pub fn constructor_x64_pcmpeq( - ctx: &mut C, - arg0: Type, - arg1: Xmm, - arg2: &XmmMem, -) -> Xmm { - let pattern0_0 = arg0; - if pattern0_0 == I8X16 { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - // Rule at src/isa/x64/inst.isle line 3262. - let expr0_0 = constructor_x64_pcmpeqb(ctx, pattern2_0, pattern3_0); - return expr0_0; - } - if pattern0_0 == I16X8 { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - // Rule at src/isa/x64/inst.isle line 3263. - let expr0_0 = constructor_x64_pcmpeqw(ctx, pattern2_0, pattern3_0); - return expr0_0; - } - if pattern0_0 == I32X4 { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - // Rule at src/isa/x64/inst.isle line 3264. - let expr0_0 = constructor_x64_pcmpeqd(ctx, pattern2_0, pattern3_0); - return expr0_0; - } - if pattern0_0 == I64X2 { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - // Rule at src/isa/x64/inst.isle line 3265. - let expr0_0 = constructor_x64_pcmpeqq(ctx, pattern2_0, pattern3_0); - return expr0_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "x64_pcmpeq", "src/isa/x64/inst.isle line 3261" - ); -} - -// Generated as internal constructor for term x64_pcmpeqb. -pub fn constructor_x64_pcmpeqb(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Xmm { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 3268. - let expr0_0: Type = I8X16; - let expr1_0 = SseOpcode::Pcmpeqb; - let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0); - return expr2_0; -} - -// Generated as internal constructor for term x64_pcmpeqw. -pub fn constructor_x64_pcmpeqw(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Xmm { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 3270. - let expr0_0: Type = I16X8; - let expr1_0 = SseOpcode::Pcmpeqw; - let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0); - return expr2_0; -} - -// Generated as internal constructor for term x64_pcmpeqd. -pub fn constructor_x64_pcmpeqd(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Xmm { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 3272. - let expr0_0: Type = I32X4; - let expr1_0 = SseOpcode::Pcmpeqd; - let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0); - return expr2_0; -} - -// Generated as internal constructor for term x64_pcmpeqq. -pub fn constructor_x64_pcmpeqq(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Xmm { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 3274. - let expr0_0: Type = I64X2; - let expr1_0 = SseOpcode::Pcmpeqq; - let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0); - return expr2_0; -} - -// Generated as internal constructor for term x64_pcmpgt. -pub fn constructor_x64_pcmpgt( - ctx: &mut C, - arg0: Type, - arg1: Xmm, - arg2: &XmmMem, -) -> Xmm { - let pattern0_0 = arg0; - if pattern0_0 == I8X16 { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - // Rule at src/isa/x64/inst.isle line 3278. - let expr0_0 = constructor_x64_pcmpgtb(ctx, pattern2_0, pattern3_0); - return expr0_0; - } - if pattern0_0 == I16X8 { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - // Rule at src/isa/x64/inst.isle line 3279. - let expr0_0 = constructor_x64_pcmpgtw(ctx, pattern2_0, pattern3_0); - return expr0_0; - } - if pattern0_0 == I32X4 { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - // Rule at src/isa/x64/inst.isle line 3280. - let expr0_0 = constructor_x64_pcmpgtd(ctx, pattern2_0, pattern3_0); - return expr0_0; - } - if pattern0_0 == I64X2 { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - // Rule at src/isa/x64/inst.isle line 3281. - let expr0_0 = constructor_x64_pcmpgtq(ctx, pattern2_0, pattern3_0); - return expr0_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "x64_pcmpgt", "src/isa/x64/inst.isle line 3277" - ); -} - -// Generated as internal constructor for term x64_pcmpgtb. -pub fn constructor_x64_pcmpgtb(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Xmm { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 3284. - let expr0_0: Type = I8X16; - let expr1_0 = SseOpcode::Pcmpgtb; - let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0); - return expr2_0; -} - -// Generated as internal constructor for term x64_pcmpgtw. -pub fn constructor_x64_pcmpgtw(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Xmm { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 3286. - let expr0_0: Type = I16X8; - let expr1_0 = SseOpcode::Pcmpgtw; - let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0); - return expr2_0; -} - -// Generated as internal constructor for term x64_pcmpgtd. -pub fn constructor_x64_pcmpgtd(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Xmm { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 3288. - let expr0_0: Type = I32X4; - let expr1_0 = SseOpcode::Pcmpgtd; - let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0); - return expr2_0; -} - -// Generated as internal constructor for term x64_pcmpgtq. -pub fn constructor_x64_pcmpgtq(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Xmm { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 3290. - let expr0_0: Type = I64X2; - let expr1_0 = SseOpcode::Pcmpgtq; - let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0); - return expr2_0; -} - -// Generated as internal constructor for term alu_rm. -pub fn constructor_alu_rm( - ctx: &mut C, - arg0: Type, - arg1: &AluRmiROpcode, - arg2: &Amode, - arg3: Gpr, -) -> SideEffectNoResult { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - // Rule at src/isa/x64/inst.isle line 3294. - let expr0_0 = C::operand_size_of_type_32_64(ctx, pattern0_0); - let expr1_0 = C::amode_to_synthetic_amode(ctx, pattern2_0); - let expr2_0 = MInst::AluRM { - size: expr0_0, - op: pattern1_0.clone(), - src1_dst: expr1_0, - src2: pattern3_0, - }; - let expr3_0 = SideEffectNoResult::Inst { inst: expr2_0 }; - return expr3_0; -} - -// Generated as internal constructor for term x64_add_mem. -pub fn constructor_x64_add_mem( - ctx: &mut C, - arg0: Type, - arg1: &Amode, - arg2: Gpr, -) -> SideEffectNoResult { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/x64/inst.isle line 3299. - let expr0_0 = AluRmiROpcode::Add; - let expr1_0 = constructor_alu_rm(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term x64_sub_mem. -pub fn constructor_x64_sub_mem( - ctx: &mut C, - arg0: Type, - arg1: &Amode, - arg2: Gpr, -) -> SideEffectNoResult { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/x64/inst.isle line 3303. - let expr0_0 = AluRmiROpcode::Sub; - let expr1_0 = constructor_alu_rm(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term x64_and_mem. -pub fn constructor_x64_and_mem( - ctx: &mut C, - arg0: Type, - arg1: &Amode, - arg2: Gpr, -) -> SideEffectNoResult { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/x64/inst.isle line 3307. - let expr0_0 = AluRmiROpcode::And; - let expr1_0 = constructor_alu_rm(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term x64_or_mem. -pub fn constructor_x64_or_mem( - ctx: &mut C, - arg0: Type, - arg1: &Amode, - arg2: Gpr, -) -> SideEffectNoResult { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/x64/inst.isle line 3311. - let expr0_0 = AluRmiROpcode::Or; - let expr1_0 = constructor_alu_rm(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term x64_xor_mem. -pub fn constructor_x64_xor_mem( - ctx: &mut C, - arg0: Type, - arg1: &Amode, - arg2: Gpr, -) -> SideEffectNoResult { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/x64/inst.isle line 3315. - let expr0_0 = AluRmiROpcode::Xor; - let expr1_0 = constructor_alu_rm(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0); - return expr1_0; -} - -// Generated as internal constructor for term trap_if. -pub fn constructor_trap_if(ctx: &mut C, arg0: &CC, arg1: &TrapCode) -> ConsumesFlags { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 3320. - let expr0_0 = MInst::TrapIf { - cc: pattern0_0.clone(), - trap_code: pattern1_0.clone(), - }; - let expr1_0 = ConsumesFlags::ConsumesFlagsSideEffect { inst: expr0_0 }; - return expr1_0; -} - -// Generated as internal constructor for term trap_if_and. -pub fn constructor_trap_if_and( - ctx: &mut C, - arg0: &CC, - arg1: &CC, - arg2: &TrapCode, -) -> ConsumesFlags { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/x64/inst.isle line 3325. - let expr0_0 = MInst::TrapIfAnd { - cc1: pattern0_0.clone(), - cc2: pattern1_0.clone(), - trap_code: pattern2_0.clone(), - }; - let expr1_0 = ConsumesFlags::ConsumesFlagsSideEffect { inst: expr0_0 }; - return expr1_0; -} - -// Generated as internal constructor for term trap_if_or. -pub fn constructor_trap_if_or( - ctx: &mut C, - arg0: &CC, - arg1: &CC, - arg2: &TrapCode, -) -> ConsumesFlags { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/x64/inst.isle line 3330. - let expr0_0 = MInst::TrapIfOr { - cc1: pattern0_0.clone(), - cc2: pattern1_0.clone(), - trap_code: pattern2_0.clone(), - }; - let expr1_0 = ConsumesFlags::ConsumesFlagsSideEffect { inst: expr0_0 }; - return expr1_0; -} - -// Generated as internal constructor for term trap_if_icmp. -pub fn constructor_trap_if_icmp( - ctx: &mut C, - arg0: &IcmpCondResult, - arg1: &TrapCode, -) -> SideEffectNoResult { - let pattern0_0 = arg0; - if let &IcmpCondResult::Condition { - producer: ref pattern1_0, - cc: ref pattern1_1, - } = pattern0_0 - { - let pattern2_0 = arg1; - // Rule at src/isa/x64/inst.isle line 3334. - let expr0_0 = constructor_trap_if(ctx, pattern1_1, pattern2_0); - let expr1_0 = constructor_with_flags_side_effect(ctx, pattern1_0, &expr0_0); - return expr1_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "trap_if_icmp", "src/isa/x64/inst.isle line 3333" - ); -} - -// Generated as internal constructor for term trap_if_fcmp. -pub fn constructor_trap_if_fcmp( - ctx: &mut C, - arg0: &FcmpCondResult, - arg1: &TrapCode, -) -> SideEffectNoResult { - let pattern0_0 = arg0; - match pattern0_0 { - &FcmpCondResult::Condition { - producer: ref pattern1_0, - cc: ref pattern1_1, - } => { - let pattern2_0 = arg1; - // Rule at src/isa/x64/inst.isle line 3338. - let expr0_0 = constructor_trap_if(ctx, pattern1_1, pattern2_0); - let expr1_0 = constructor_with_flags_side_effect(ctx, pattern1_0, &expr0_0); - return expr1_0; - } - &FcmpCondResult::AndCondition { - producer: ref pattern1_0, - cc1: ref pattern1_1, - cc2: ref pattern1_2, - } => { - let pattern2_0 = arg1; - // Rule at src/isa/x64/inst.isle line 3340. - let expr0_0 = constructor_trap_if_and(ctx, pattern1_1, pattern1_2, pattern2_0); - let expr1_0 = constructor_with_flags_side_effect(ctx, pattern1_0, &expr0_0); - return expr1_0; - } - &FcmpCondResult::OrCondition { - producer: ref pattern1_0, - cc1: ref pattern1_1, - cc2: ref pattern1_2, - } => { - let pattern2_0 = arg1; - // Rule at src/isa/x64/inst.isle line 3342. - let expr0_0 = constructor_trap_if_or(ctx, pattern1_1, pattern1_2, pattern2_0); - let expr1_0 = constructor_with_flags_side_effect(ctx, pattern1_0, &expr0_0); - return expr1_0; - } - _ => {} - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "trap_if_fcmp", "src/isa/x64/inst.isle line 3337" - ); -} - -// Generated as internal constructor for term jmp_known. -pub fn constructor_jmp_known(ctx: &mut C, arg0: MachLabel) -> SideEffectNoResult { - let pattern0_0 = arg0; - // Rule at src/isa/x64/inst.isle line 3349. - let expr0_0 = MInst::JmpKnown { dst: pattern0_0 }; - let expr1_0 = SideEffectNoResult::Inst { inst: expr0_0 }; - return expr1_0; -} - -// Generated as internal constructor for term jmp_if. -pub fn constructor_jmp_if(ctx: &mut C, arg0: &CC, arg1: MachLabel) -> ConsumesFlags { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 3353. - let expr0_0 = MInst::JmpIf { - cc: pattern0_0.clone(), - taken: pattern1_0, - }; - let expr1_0 = ConsumesFlags::ConsumesFlagsSideEffect { inst: expr0_0 }; - return expr1_0; -} - -// Generated as internal constructor for term jmp_cond. -pub fn constructor_jmp_cond( - ctx: &mut C, - arg0: &CC, - arg1: MachLabel, - arg2: MachLabel, -) -> ConsumesFlags { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/x64/inst.isle line 3358. - let expr0_0 = MInst::JmpCond { - cc: pattern0_0.clone(), - taken: pattern1_0, - not_taken: pattern2_0, - }; - let expr1_0 = ConsumesFlags::ConsumesFlagsSideEffect { inst: expr0_0 }; - return expr1_0; -} - -// Generated as internal constructor for term jmp_cond_icmp. -pub fn constructor_jmp_cond_icmp( - ctx: &mut C, - arg0: &IcmpCondResult, - arg1: MachLabel, - arg2: MachLabel, -) -> SideEffectNoResult { - let pattern0_0 = arg0; - if let &IcmpCondResult::Condition { - producer: ref pattern1_0, - cc: ref pattern1_1, - } = pattern0_0 - { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - // Rule at src/isa/x64/inst.isle line 3363. - let expr0_0 = constructor_jmp_cond(ctx, pattern1_1, pattern2_0, pattern3_0); - let expr1_0 = constructor_with_flags_side_effect(ctx, pattern1_0, &expr0_0); - return expr1_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "jmp_cond_icmp", "src/isa/x64/inst.isle line 3362" - ); -} - -// Generated as internal constructor for term jmp_cond_fcmp. -pub fn constructor_jmp_cond_fcmp( - ctx: &mut C, - arg0: &FcmpCondResult, - arg1: MachLabel, - arg2: MachLabel, -) -> SideEffectNoResult { - let pattern0_0 = arg0; - match pattern0_0 { - &FcmpCondResult::Condition { - producer: ref pattern1_0, - cc: ref pattern1_1, - } => { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - // Rule at src/isa/x64/inst.isle line 3368. - let expr0_0 = constructor_jmp_cond(ctx, pattern1_1, pattern2_0, pattern3_0); - let expr1_0 = constructor_with_flags_side_effect(ctx, pattern1_0, &expr0_0); - return expr1_0; - } - &FcmpCondResult::AndCondition { - producer: ref pattern1_0, - cc1: ref pattern1_1, - cc2: ref pattern1_2, - } => { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - // Rule at src/isa/x64/inst.isle line 3370. - let expr0_0 = C::cc_invert(ctx, pattern1_1); - let expr1_0 = constructor_jmp_if(ctx, &expr0_0, pattern3_0); - let expr2_0 = C::cc_invert(ctx, pattern1_2); - let expr3_0 = constructor_jmp_cond(ctx, &expr2_0, pattern3_0, pattern2_0); - let expr4_0 = constructor_consumes_flags_concat(ctx, &expr1_0, &expr3_0); - let expr5_0 = constructor_with_flags_side_effect(ctx, pattern1_0, &expr4_0); - return expr5_0; - } - &FcmpCondResult::OrCondition { - producer: ref pattern1_0, - cc1: ref pattern1_1, - cc2: ref pattern1_2, - } => { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - // Rule at src/isa/x64/inst.isle line 3375. - let expr0_0 = constructor_jmp_if(ctx, pattern1_1, pattern2_0); - let expr1_0 = constructor_jmp_cond(ctx, pattern1_2, pattern2_0, pattern3_0); - let expr2_0 = constructor_consumes_flags_concat(ctx, &expr0_0, &expr1_0); - let expr3_0 = constructor_with_flags_side_effect(ctx, pattern1_0, &expr2_0); - return expr3_0; - } - _ => {} - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "jmp_cond_fcmp", "src/isa/x64/inst.isle line 3367" - ); -} - -// Generated as internal constructor for term jmp_table_seq. -pub fn constructor_jmp_table_seq( - ctx: &mut C, - arg0: Type, - arg1: Gpr, - arg2: MachLabel, - arg3: &BoxVecMachLabel, -) -> SideEffectNoResult { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - // Rule at src/isa/x64/inst.isle line 3395. - let expr0_0 = C::temp_writable_gpr(ctx); - let expr1_0 = C::temp_writable_gpr(ctx); - let expr2_0 = C::raw_operand_size_of_type(ctx, pattern0_0); - let expr3_0 = C::jump_table_size(ctx, pattern3_0); - let expr4_0 = RegMemImm::Imm { simm32: expr3_0 }; - let expr5_0 = C::gpr_mem_imm_new(ctx, &expr4_0); - let expr6_0 = constructor_x64_cmp(ctx, &expr2_0, &expr5_0, pattern1_0); - let expr7_0 = C::gpr_to_reg(ctx, pattern1_0); - let expr8_0 = C::writable_gpr_to_reg(ctx, expr0_0); - let expr9_0 = C::writable_gpr_to_reg(ctx, expr1_0); - let expr10_0 = MInst::JmpTableSeq { - idx: expr7_0, - tmp1: expr8_0, - tmp2: expr9_0, - default_target: pattern2_0, - targets: pattern3_0.clone(), - }; - let expr11_0 = ConsumesFlags::ConsumesFlagsSideEffect { inst: expr10_0 }; - let expr12_0 = constructor_with_flags_side_effect(ctx, &expr6_0, &expr11_0); - return expr12_0; -} - -// Generated as internal constructor for term icmp_cond_result. -pub fn constructor_icmp_cond_result( - ctx: &mut C, - arg0: &ProducesFlags, - arg1: &CC, -) -> IcmpCondResult { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 3439. - let expr0_0 = IcmpCondResult::Condition { - producer: pattern0_0.clone(), - cc: pattern1_0.clone(), - }; - return expr0_0; -} - -// Generated as internal constructor for term invert_icmp_cond_result. -pub fn constructor_invert_icmp_cond_result( - ctx: &mut C, - arg0: &IcmpCondResult, -) -> IcmpCondResult { - let pattern0_0 = arg0; - if let &IcmpCondResult::Condition { - producer: ref pattern1_0, - cc: ref pattern1_1, - } = pattern0_0 - { - // Rule at src/isa/x64/inst.isle line 3442. - let expr0_0 = C::cc_invert(ctx, pattern1_1); - let expr1_0 = constructor_icmp_cond_result(ctx, pattern1_0, &expr0_0); - return expr1_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "invert_icmp_cond_result", "src/isa/x64/inst.isle line 3441" - ); -} - -// Generated as internal constructor for term lower_icmp_bool. -pub fn constructor_lower_icmp_bool(ctx: &mut C, arg0: &IcmpCondResult) -> ValueRegs { - let pattern0_0 = arg0; - if let &IcmpCondResult::Condition { - producer: ref pattern1_0, - cc: ref pattern1_1, - } = pattern0_0 - { - // Rule at src/isa/x64/inst.isle line 3447. - let expr0_0 = constructor_x64_setcc(ctx, pattern1_1); - let expr1_0 = constructor_with_flags(ctx, pattern1_0, &expr0_0); - return expr1_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "lower_icmp_bool", "src/isa/x64/inst.isle line 3446" - ); -} - -// Generated as internal constructor for term select_icmp. -pub fn constructor_select_icmp( - ctx: &mut C, - arg0: &IcmpCondResult, - arg1: Value, - arg2: Value, -) -> ValueRegs { - let pattern0_0 = arg0; - if let &IcmpCondResult::Condition { - producer: ref pattern1_0, - cc: ref pattern1_1, - } = pattern0_0 - { - let pattern2_0 = arg1; - let pattern3_0 = C::value_type(ctx, pattern2_0); - if let Some(pattern4_0) = C::type_register_class(ctx, pattern3_0) { - if let &RegisterClass::Gpr { - single_register: pattern5_0, - } = &pattern4_0 - { - if pattern5_0 == true { - let pattern7_0 = arg2; - // Rule at src/isa/x64/inst.isle line 3456. - let expr0_0 = constructor_put_in_gpr(ctx, pattern2_0); - let expr1_0 = C::gpr_to_gpr_mem(ctx, expr0_0); - let expr2_0 = constructor_put_in_gpr(ctx, pattern7_0); - let expr3_0 = constructor_cmove(ctx, pattern3_0, pattern1_1, &expr1_0, expr2_0); - let expr4_0 = constructor_with_flags(ctx, pattern1_0, &expr3_0); - return expr4_0; - } - } - } - } - let pattern0_0 = arg0; - if let &IcmpCondResult::Condition { - producer: ref pattern1_0, - cc: ref pattern1_1, - } = pattern0_0 - { - let pattern2_0 = arg1; - let pattern3_0 = C::value_type(ctx, pattern2_0); - let pattern4_0 = arg2; - // Rule at src/isa/x64/inst.isle line 3460. - let expr0_0 = - constructor_cmove_from_values(ctx, pattern3_0, pattern1_1, pattern2_0, pattern4_0); - let expr1_0 = constructor_with_flags(ctx, pattern1_0, &expr0_0); - return expr1_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "select_icmp", "src/isa/x64/inst.isle line 3451" - ); -} - -// Generated as internal constructor for term emit_cmp. -pub fn constructor_emit_cmp( - ctx: &mut C, - arg0: &IntCC, - arg1: Value, - arg2: Value, -) -> IcmpCondResult { - let pattern0_0 = arg0; - match pattern0_0 { - &IntCC::Equal => { - let pattern2_0 = arg1; - let pattern3_0 = C::value_type(ctx, pattern2_0); - if pattern3_0 == I128 { - let pattern5_0 = arg2; - // Rule at src/isa/x64/inst.isle line 3481. - let expr0_0 = C::put_in_regs(ctx, pattern2_0); - let expr1_0: usize = 0i128 as usize; - let expr2_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr1_0); - let expr3_0 = C::put_in_regs(ctx, pattern2_0); - let expr4_0: usize = 1i128 as usize; - let expr5_0 = constructor_value_regs_get_gpr(ctx, expr3_0, expr4_0); - let expr6_0 = C::put_in_regs(ctx, pattern5_0); - let expr7_0: usize = 0i128 as usize; - let expr8_0 = constructor_value_regs_get_gpr(ctx, expr6_0, expr7_0); - let expr9_0 = C::put_in_regs(ctx, pattern5_0); - let expr10_0: usize = 1i128 as usize; - let expr11_0 = constructor_value_regs_get_gpr(ctx, expr9_0, expr10_0); - let expr12_0 = OperandSize::Size64; - let expr13_0 = C::gpr_to_gpr_mem_imm(ctx, expr8_0); - let expr14_0 = constructor_x64_cmp(ctx, &expr12_0, &expr13_0, expr2_0); - let expr15_0 = CC::Z; - let expr16_0 = constructor_x64_setcc(ctx, &expr15_0); - let expr17_0 = constructor_with_flags_reg(ctx, &expr14_0, &expr16_0); - let expr18_0 = OperandSize::Size64; - let expr19_0 = C::gpr_to_gpr_mem_imm(ctx, expr11_0); - let expr20_0 = constructor_x64_cmp(ctx, &expr18_0, &expr19_0, expr5_0); - let expr21_0 = CC::Z; - let expr22_0 = constructor_x64_setcc(ctx, &expr21_0); - let expr23_0 = constructor_with_flags_reg(ctx, &expr20_0, &expr22_0); - let expr24_0: Type = I64; - let expr25_0 = C::gpr_new(ctx, expr17_0); - let expr26_0 = constructor_reg_to_gpr_mem_imm(ctx, expr23_0); - let expr27_0 = constructor_x64_and(ctx, expr24_0, expr25_0, &expr26_0); - let expr28_0 = C::gpr_to_reg(ctx, expr27_0); - let expr29_0 = OperandSize::Size64; - let expr30_0: u32 = 1i128 as u32; - let expr31_0 = RegMemImm::Imm { simm32: expr30_0 }; - let expr32_0 = C::gpr_mem_imm_new(ctx, &expr31_0); - let expr33_0 = C::gpr_new(ctx, expr28_0); - let expr34_0 = constructor_x64_test(ctx, &expr29_0, &expr32_0, expr33_0); - let expr35_0 = CC::NZ; - let expr36_0 = constructor_icmp_cond_result(ctx, &expr34_0, &expr35_0); - return expr36_0; - } - } - &IntCC::NotEqual => { - let pattern2_0 = arg1; - let pattern3_0 = C::value_type(ctx, pattern2_0); - if pattern3_0 == I128 { - let pattern5_0 = arg2; - // Rule at src/isa/x64/inst.isle line 3502. - let expr0_0 = C::put_in_regs(ctx, pattern2_0); - let expr1_0: usize = 0i128 as usize; - let expr2_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr1_0); - let expr3_0 = C::put_in_regs(ctx, pattern2_0); - let expr4_0: usize = 1i128 as usize; - let expr5_0 = constructor_value_regs_get_gpr(ctx, expr3_0, expr4_0); - let expr6_0 = C::put_in_regs(ctx, pattern5_0); - let expr7_0: usize = 0i128 as usize; - let expr8_0 = constructor_value_regs_get_gpr(ctx, expr6_0, expr7_0); - let expr9_0 = C::put_in_regs(ctx, pattern5_0); - let expr10_0: usize = 1i128 as usize; - let expr11_0 = constructor_value_regs_get_gpr(ctx, expr9_0, expr10_0); - let expr12_0 = OperandSize::Size64; - let expr13_0 = C::gpr_to_gpr_mem_imm(ctx, expr8_0); - let expr14_0 = constructor_x64_cmp(ctx, &expr12_0, &expr13_0, expr2_0); - let expr15_0 = CC::NZ; - let expr16_0 = constructor_x64_setcc(ctx, &expr15_0); - let expr17_0 = constructor_with_flags_reg(ctx, &expr14_0, &expr16_0); - let expr18_0 = OperandSize::Size64; - let expr19_0 = C::gpr_to_gpr_mem_imm(ctx, expr11_0); - let expr20_0 = constructor_x64_cmp(ctx, &expr18_0, &expr19_0, expr5_0); - let expr21_0 = CC::NZ; - let expr22_0 = constructor_x64_setcc(ctx, &expr21_0); - let expr23_0 = constructor_with_flags_reg(ctx, &expr20_0, &expr22_0); - let expr24_0: Type = I64; - let expr25_0 = C::gpr_new(ctx, expr17_0); - let expr26_0 = constructor_reg_to_gpr_mem_imm(ctx, expr23_0); - let expr27_0 = constructor_x64_or(ctx, expr24_0, expr25_0, &expr26_0); - let expr28_0 = C::gpr_to_reg(ctx, expr27_0); - let expr29_0 = OperandSize::Size64; - let expr30_0: u32 = 1i128 as u32; - let expr31_0 = RegMemImm::Imm { simm32: expr30_0 }; - let expr32_0 = C::gpr_mem_imm_new(ctx, &expr31_0); - let expr33_0 = C::gpr_new(ctx, expr28_0); - let expr34_0 = constructor_x64_test(ctx, &expr29_0, &expr32_0, expr33_0); - let expr35_0 = CC::NZ; - let expr36_0 = constructor_icmp_cond_result(ctx, &expr34_0, &expr35_0); - return expr36_0; - } - } - _ => {} - } - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = C::value_type(ctx, pattern1_0); - if pattern2_0 == I128 { - let pattern4_0 = arg2; - // Rule at src/isa/x64/inst.isle line 3517. - let expr0_0 = C::put_in_regs(ctx, pattern1_0); - let expr1_0: usize = 0i128 as usize; - let expr2_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr1_0); - let expr3_0 = C::put_in_regs(ctx, pattern1_0); - let expr4_0: usize = 1i128 as usize; - let expr5_0 = constructor_value_regs_get_gpr(ctx, expr3_0, expr4_0); - let expr6_0 = C::put_in_regs(ctx, pattern4_0); - let expr7_0: usize = 0i128 as usize; - let expr8_0 = constructor_value_regs_get_gpr(ctx, expr6_0, expr7_0); - let expr9_0 = C::put_in_regs(ctx, pattern4_0); - let expr10_0: usize = 1i128 as usize; - let expr11_0 = constructor_value_regs_get_gpr(ctx, expr9_0, expr10_0); - let expr12_0 = OperandSize::Size64; - let expr13_0 = C::gpr_to_gpr_mem_imm(ctx, expr11_0); - let expr14_0 = constructor_x64_cmp(ctx, &expr12_0, &expr13_0, expr5_0); - let expr15_0 = C::intcc_without_eq(ctx, pattern0_0); - let expr16_0 = C::intcc_to_cc(ctx, &expr15_0); - let expr17_0 = constructor_x64_setcc(ctx, &expr16_0); - let expr18_0 = CC::Z; - let expr19_0 = constructor_x64_setcc(ctx, &expr18_0); - let expr20_0 = constructor_consumes_flags_concat(ctx, &expr17_0, &expr19_0); - let expr21_0 = constructor_with_flags(ctx, &expr14_0, &expr20_0); - let expr22_0: usize = 0i128 as usize; - let expr23_0 = C::value_regs_get(ctx, expr21_0, expr22_0); - let expr24_0: usize = 1i128 as usize; - let expr25_0 = C::value_regs_get(ctx, expr21_0, expr24_0); - let expr26_0 = OperandSize::Size64; - let expr27_0 = C::gpr_to_gpr_mem_imm(ctx, expr8_0); - let expr28_0 = constructor_x64_cmp(ctx, &expr26_0, &expr27_0, expr2_0); - let expr29_0 = C::intcc_unsigned(ctx, pattern0_0); - let expr30_0 = C::intcc_to_cc(ctx, &expr29_0); - let expr31_0 = constructor_x64_setcc(ctx, &expr30_0); - let expr32_0 = constructor_with_flags_reg(ctx, &expr28_0, &expr31_0); - let expr33_0: Type = I64; - let expr34_0 = C::gpr_new(ctx, expr25_0); - let expr35_0 = constructor_reg_to_gpr_mem_imm(ctx, expr32_0); - let expr36_0 = constructor_x64_and(ctx, expr33_0, expr34_0, &expr35_0); - let expr37_0 = C::gpr_to_reg(ctx, expr36_0); - let expr38_0: Type = I64; - let expr39_0 = C::gpr_new(ctx, expr23_0); - let expr40_0 = constructor_reg_to_gpr_mem_imm(ctx, expr37_0); - let expr41_0 = constructor_x64_or(ctx, expr38_0, expr39_0, &expr40_0); - let expr42_0 = C::gpr_to_reg(ctx, expr41_0); - let expr43_0 = OperandSize::Size64; - let expr44_0: u32 = 1i128 as u32; - let expr45_0 = RegMemImm::Imm { simm32: expr44_0 }; - let expr46_0 = C::gpr_mem_imm_new(ctx, &expr45_0); - let expr47_0 = C::gpr_new(ctx, expr42_0); - let expr48_0 = constructor_x64_test(ctx, &expr43_0, &expr46_0, expr47_0); - let expr49_0 = CC::NZ; - let expr50_0 = constructor_icmp_cond_result(ctx, &expr48_0, &expr49_0); - return expr50_0; - } - let pattern0_0 = arg0; - let pattern1_0 = arg1; - if let Some(pattern2_0) = C::simm32_from_value(ctx, pattern1_0) { - let pattern3_0 = C::value_type(ctx, pattern1_0); - let pattern4_0 = arg2; - // Rule at src/isa/x64/inst.isle line 3475. - let expr0_0 = C::raw_operand_size_of_type(ctx, pattern3_0); - let expr1_0 = constructor_put_in_gpr(ctx, pattern4_0); - let expr2_0 = constructor_x64_cmp(ctx, &expr0_0, &pattern2_0, expr1_0); - let expr3_0 = C::intcc_reverse(ctx, pattern0_0); - let expr4_0 = C::intcc_to_cc(ctx, &expr3_0); - let expr5_0 = constructor_icmp_cond_result(ctx, &expr2_0, &expr4_0); - return expr5_0; - } - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = C::value_type(ctx, pattern1_0); - let pattern3_0 = arg2; - // Rule at src/isa/x64/inst.isle line 3468. - let expr0_0 = C::raw_operand_size_of_type(ctx, pattern2_0); - let expr1_0 = constructor_put_in_gpr_mem_imm(ctx, pattern3_0); - let expr2_0 = constructor_put_in_gpr(ctx, pattern1_0); - let expr3_0 = constructor_x64_cmp(ctx, &expr0_0, &expr1_0, expr2_0); - let expr4_0 = C::intcc_to_cc(ctx, pattern0_0); - let expr5_0 = constructor_icmp_cond_result(ctx, &expr3_0, &expr4_0); - return expr5_0; -} - -// Generated as internal constructor for term lower_fcmp_bool. -pub fn constructor_lower_fcmp_bool(ctx: &mut C, arg0: &FcmpCondResult) -> ValueRegs { - let pattern0_0 = arg0; - match pattern0_0 { - &FcmpCondResult::Condition { - producer: ref pattern1_0, - cc: ref pattern1_1, - } => { - // Rule at src/isa/x64/inst.isle line 3552. - let expr0_0 = constructor_x64_setcc(ctx, pattern1_1); - let expr1_0 = constructor_with_flags(ctx, pattern1_0, &expr0_0); - return expr1_0; - } - &FcmpCondResult::AndCondition { - producer: ref pattern1_0, - cc1: ref pattern1_1, - cc2: ref pattern1_2, - } => { - // Rule at src/isa/x64/inst.isle line 3555. - let expr0_0 = constructor_x64_setcc(ctx, pattern1_1); - let expr1_0 = constructor_x64_setcc(ctx, pattern1_2); - let expr2_0 = constructor_consumes_flags_concat(ctx, &expr0_0, &expr1_0); - let expr3_0 = constructor_with_flags(ctx, pattern1_0, &expr2_0); - let expr4_0: usize = 0i128 as usize; - let expr5_0 = constructor_value_regs_get_gpr(ctx, expr3_0, expr4_0); - let expr6_0: usize = 1i128 as usize; - let expr7_0 = constructor_value_regs_get_gpr(ctx, expr3_0, expr6_0); - let expr8_0: Type = I8; - let expr9_0 = C::gpr_to_gpr_mem_imm(ctx, expr7_0); - let expr10_0 = constructor_x64_and(ctx, expr8_0, expr5_0, &expr9_0); - let expr11_0 = C::gpr_to_reg(ctx, expr10_0); - let expr12_0 = C::value_reg(ctx, expr11_0); - return expr12_0; - } - &FcmpCondResult::OrCondition { - producer: ref pattern1_0, - cc1: ref pattern1_1, - cc2: ref pattern1_2, - } => { - // Rule at src/isa/x64/inst.isle line 3564. - let expr0_0 = constructor_x64_setcc(ctx, pattern1_1); - let expr1_0 = constructor_x64_setcc(ctx, pattern1_2); - let expr2_0 = constructor_consumes_flags_concat(ctx, &expr0_0, &expr1_0); - let expr3_0 = constructor_with_flags(ctx, pattern1_0, &expr2_0); - let expr4_0: usize = 0i128 as usize; - let expr5_0 = constructor_value_regs_get_gpr(ctx, expr3_0, expr4_0); - let expr6_0: usize = 1i128 as usize; - let expr7_0 = constructor_value_regs_get_gpr(ctx, expr3_0, expr6_0); - let expr8_0: Type = I8; - let expr9_0 = C::gpr_to_gpr_mem_imm(ctx, expr7_0); - let expr10_0 = constructor_x64_or(ctx, expr8_0, expr5_0, &expr9_0); - let expr11_0 = C::gpr_to_reg(ctx, expr10_0); - let expr12_0 = C::value_reg(ctx, expr11_0); - return expr12_0; - } - _ => {} - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "lower_fcmp_bool", "src/isa/x64/inst.isle line 3550" - ); -} - -// Generated as internal constructor for term emit_fcmp. -pub fn constructor_emit_fcmp( - ctx: &mut C, - arg0: &FloatCC, - arg1: Value, - arg2: Value, -) -> FcmpCondResult { - let pattern0_0 = arg0; - match pattern0_0 { - &FloatCC::Equal => { - let pattern2_0 = arg1; - let pattern3_0 = C::value_type(ctx, pattern2_0); - if let Some(pattern4_0) = C::ty_scalar_float(ctx, pattern3_0) { - let pattern5_0 = arg2; - // Rule at src/isa/x64/inst.isle line 3591. - let expr0_0 = constructor_x64_ucomis(ctx, pattern5_0, pattern2_0); - let expr1_0 = CC::NP; - let expr2_0 = CC::Z; - let expr3_0 = FcmpCondResult::AndCondition { - producer: expr0_0, - cc1: expr1_0, - cc2: expr2_0, - }; - return expr3_0; - } - } - &FloatCC::GreaterThan => { - let pattern2_0 = arg1; - let pattern3_0 = C::value_type(ctx, pattern2_0); - if let Some(pattern4_0) = C::ty_scalar_float(ctx, pattern3_0) { - let pattern5_0 = arg2; - // Rule at src/isa/x64/inst.isle line 3607. - let expr0_0 = constructor_x64_ucomis(ctx, pattern5_0, pattern2_0); - let expr1_0 = CC::NBE; - let expr2_0 = FcmpCondResult::Condition { - producer: expr0_0, - cc: expr1_0, - }; - return expr2_0; - } - } - &FloatCC::GreaterThanOrEqual => { - let pattern2_0 = arg1; - let pattern3_0 = C::value_type(ctx, pattern2_0); - if let Some(pattern4_0) = C::ty_scalar_float(ctx, pattern3_0) { - let pattern5_0 = arg2; - // Rule at src/isa/x64/inst.isle line 3609. - let expr0_0 = constructor_x64_ucomis(ctx, pattern5_0, pattern2_0); - let expr1_0 = CC::NB; - let expr2_0 = FcmpCondResult::Condition { - producer: expr0_0, - cc: expr1_0, - }; - return expr2_0; - } - } - &FloatCC::LessThan => { - let pattern2_0 = arg1; - let pattern3_0 = C::value_type(ctx, pattern2_0); - if let Some(pattern4_0) = C::ty_scalar_float(ctx, pattern3_0) { - let pattern5_0 = arg2; - // Rule at src/isa/x64/inst.isle line 3619. - let expr0_0 = constructor_x64_ucomis(ctx, pattern2_0, pattern5_0); - let expr1_0 = CC::NBE; - let expr2_0 = FcmpCondResult::Condition { - producer: expr0_0, - cc: expr1_0, - }; - return expr2_0; - } - } - &FloatCC::LessThanOrEqual => { - let pattern2_0 = arg1; - let pattern3_0 = C::value_type(ctx, pattern2_0); - if let Some(pattern4_0) = C::ty_scalar_float(ctx, pattern3_0) { - let pattern5_0 = arg2; - // Rule at src/isa/x64/inst.isle line 3622. - let expr0_0 = constructor_x64_ucomis(ctx, pattern2_0, pattern5_0); - let expr1_0 = CC::NB; - let expr2_0 = FcmpCondResult::Condition { - producer: expr0_0, - cc: expr1_0, - }; - return expr2_0; - } - } - &FloatCC::NotEqual => { - let pattern2_0 = arg1; - let pattern3_0 = C::value_type(ctx, pattern2_0); - if let Some(pattern4_0) = C::ty_scalar_float(ctx, pattern3_0) { - let pattern5_0 = arg2; - // Rule at src/isa/x64/inst.isle line 3594. - let expr0_0 = constructor_x64_ucomis(ctx, pattern5_0, pattern2_0); - let expr1_0 = CC::P; - let expr2_0 = CC::NZ; - let expr3_0 = FcmpCondResult::OrCondition { - producer: expr0_0, - cc1: expr1_0, - cc2: expr2_0, - }; - return expr3_0; - } - } - &FloatCC::Ordered => { - let pattern2_0 = arg1; - let pattern3_0 = C::value_type(ctx, pattern2_0); - if let Some(pattern4_0) = C::ty_scalar_float(ctx, pattern3_0) { - let pattern5_0 = arg2; - // Rule at src/isa/x64/inst.isle line 3599. - let expr0_0 = constructor_x64_ucomis(ctx, pattern5_0, pattern2_0); - let expr1_0 = CC::NP; - let expr2_0 = FcmpCondResult::Condition { - producer: expr0_0, - cc: expr1_0, - }; - return expr2_0; - } - } - &FloatCC::OrderedNotEqual => { - let pattern2_0 = arg1; - let pattern3_0 = C::value_type(ctx, pattern2_0); - if let Some(pattern4_0) = C::ty_scalar_float(ctx, pattern3_0) { - let pattern5_0 = arg2; - // Rule at src/isa/x64/inst.isle line 3603. - let expr0_0 = constructor_x64_ucomis(ctx, pattern5_0, pattern2_0); - let expr1_0 = CC::NZ; - let expr2_0 = FcmpCondResult::Condition { - producer: expr0_0, - cc: expr1_0, - }; - return expr2_0; - } - } - &FloatCC::Unordered => { - let pattern2_0 = arg1; - let pattern3_0 = C::value_type(ctx, pattern2_0); - if let Some(pattern4_0) = C::ty_scalar_float(ctx, pattern3_0) { - let pattern5_0 = arg2; - // Rule at src/isa/x64/inst.isle line 3601. - let expr0_0 = constructor_x64_ucomis(ctx, pattern5_0, pattern2_0); - let expr1_0 = CC::P; - let expr2_0 = FcmpCondResult::Condition { - producer: expr0_0, - cc: expr1_0, - }; - return expr2_0; - } - } - &FloatCC::UnorderedOrEqual => { - let pattern2_0 = arg1; - let pattern3_0 = C::value_type(ctx, pattern2_0); - if let Some(pattern4_0) = C::ty_scalar_float(ctx, pattern3_0) { - let pattern5_0 = arg2; - // Rule at src/isa/x64/inst.isle line 3605. - let expr0_0 = constructor_x64_ucomis(ctx, pattern5_0, pattern2_0); - let expr1_0 = CC::Z; - let expr2_0 = FcmpCondResult::Condition { - producer: expr0_0, - cc: expr1_0, - }; - return expr2_0; - } - } - &FloatCC::UnorderedOrGreaterThan => { - let pattern2_0 = arg1; - let pattern3_0 = C::value_type(ctx, pattern2_0); - if let Some(pattern4_0) = C::ty_scalar_float(ctx, pattern3_0) { - let pattern5_0 = arg2; - // Rule at src/isa/x64/inst.isle line 3625. - let expr0_0 = constructor_x64_ucomis(ctx, pattern2_0, pattern5_0); - let expr1_0 = CC::B; - let expr2_0 = FcmpCondResult::Condition { - producer: expr0_0, - cc: expr1_0, - }; - return expr2_0; - } - } - &FloatCC::UnorderedOrGreaterThanOrEqual => { - let pattern2_0 = arg1; - let pattern3_0 = C::value_type(ctx, pattern2_0); - if let Some(pattern4_0) = C::ty_scalar_float(ctx, pattern3_0) { - let pattern5_0 = arg2; - // Rule at src/isa/x64/inst.isle line 3628. - let expr0_0 = constructor_x64_ucomis(ctx, pattern2_0, pattern5_0); - let expr1_0 = CC::BE; - let expr2_0 = FcmpCondResult::Condition { - producer: expr0_0, - cc: expr1_0, - }; - return expr2_0; - } - } - &FloatCC::UnorderedOrLessThan => { - let pattern2_0 = arg1; - let pattern3_0 = C::value_type(ctx, pattern2_0); - if let Some(pattern4_0) = C::ty_scalar_float(ctx, pattern3_0) { - let pattern5_0 = arg2; - // Rule at src/isa/x64/inst.isle line 3611. - let expr0_0 = constructor_x64_ucomis(ctx, pattern5_0, pattern2_0); - let expr1_0 = CC::B; - let expr2_0 = FcmpCondResult::Condition { - producer: expr0_0, - cc: expr1_0, - }; - return expr2_0; - } - } - &FloatCC::UnorderedOrLessThanOrEqual => { - let pattern2_0 = arg1; - let pattern3_0 = C::value_type(ctx, pattern2_0); - if let Some(pattern4_0) = C::ty_scalar_float(ctx, pattern3_0) { - let pattern5_0 = arg2; - // Rule at src/isa/x64/inst.isle line 3613. - let expr0_0 = constructor_x64_ucomis(ctx, pattern5_0, pattern2_0); - let expr1_0 = CC::BE; - let expr2_0 = FcmpCondResult::Condition { - producer: expr0_0, - cc: expr1_0, - }; - return expr2_0; - } - } - _ => {} - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "emit_fcmp", "src/isa/x64/inst.isle line 3589" - ); -} - -// Generated as internal constructor for term x64_mfence. -pub fn constructor_x64_mfence(ctx: &mut C) -> SideEffectNoResult { - // Rule at src/isa/x64/inst.isle line 3641. - let expr0_0 = FenceKind::MFence; - let expr1_0 = MInst::Fence { kind: expr0_0 }; - let expr2_0 = SideEffectNoResult::Inst { inst: expr1_0 }; - return expr2_0; -} - -// Generated as internal constructor for term x64_cmpxchg. -pub fn constructor_x64_cmpxchg( - ctx: &mut C, - arg0: Type, - arg1: Gpr, - arg2: Gpr, - arg3: &SyntheticAmode, -) -> Gpr { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - // Rule at src/isa/x64/inst.isle line 3645. - let expr0_0 = C::temp_writable_gpr(ctx); - let expr1_0 = C::gpr_to_reg(ctx, pattern2_0); - let expr2_0 = C::gpr_to_reg(ctx, pattern1_0); - let expr3_0 = C::writable_gpr_to_reg(ctx, expr0_0); - let expr4_0 = MInst::LockCmpxchg { - ty: pattern0_0, - replacement: expr1_0, - expected: expr2_0, - mem: pattern3_0.clone(), - dst_old: expr3_0, - }; - let expr5_0 = C::emit(ctx, &expr4_0); - let expr6_0 = C::writable_gpr_to_gpr(ctx, expr0_0); - return expr6_0; -} - -// Generated as internal constructor for term x64_atomic_rmw_seq. -pub fn constructor_x64_atomic_rmw_seq( - ctx: &mut C, - arg0: Type, - arg1: &MachAtomicRmwOp, - arg2: &SyntheticAmode, - arg3: Gpr, -) -> Gpr { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - let pattern3_0 = arg3; - // Rule at src/isa/x64/inst.isle line 3651. - let expr0_0 = C::temp_writable_gpr(ctx); - let expr1_0 = C::temp_writable_gpr(ctx); - let expr2_0 = C::gpr_to_reg(ctx, pattern3_0); - let expr3_0 = C::writable_gpr_to_reg(ctx, expr1_0); - let expr4_0 = C::writable_gpr_to_reg(ctx, expr0_0); - let expr5_0 = MInst::AtomicRmwSeq { - ty: pattern0_0, - op: pattern1_0.clone(), - mem: pattern2_0.clone(), - operand: expr2_0, - temp: expr3_0, - dst_old: expr4_0, - }; - let expr6_0 = C::emit(ctx, &expr5_0); - let expr7_0 = C::writable_gpr_to_gpr(ctx, expr0_0); - return expr7_0; -} - -// Generated as internal constructor for term bitcast_xmm_to_gpr. -pub fn constructor_bitcast_xmm_to_gpr(ctx: &mut C, arg0: Type, arg1: Xmm) -> Gpr { - let pattern0_0 = arg0; - if pattern0_0 == F32 { - let pattern2_0 = arg1; - // Rule at src/isa/x64/inst.isle line 3666. - let expr0_0 = SseOpcode::Movd; - let expr1_0 = OperandSize::Size32; - let expr2_0 = constructor_xmm_to_gpr(ctx, &expr0_0, pattern2_0, &expr1_0); - return expr2_0; - } - if pattern0_0 == F64 { - let pattern2_0 = arg1; - // Rule at src/isa/x64/inst.isle line 3668. - let expr0_0 = SseOpcode::Movq; - let expr1_0 = OperandSize::Size64; - let expr2_0 = constructor_xmm_to_gpr(ctx, &expr0_0, pattern2_0, &expr1_0); - return expr2_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "bitcast_xmm_to_gpr", "src/isa/x64/inst.isle line 3665" - ); -} - -// Generated as internal constructor for term bitcast_gpr_to_xmm. -pub fn constructor_bitcast_gpr_to_xmm(ctx: &mut C, arg0: Type, arg1: Gpr) -> Xmm { - let pattern0_0 = arg0; - if pattern0_0 == I32 { - let pattern2_0 = arg1; - // Rule at src/isa/x64/inst.isle line 3672. - let expr0_0 = SseOpcode::Movd; - let expr1_0 = C::gpr_to_gpr_mem(ctx, pattern2_0); - let expr2_0 = OperandSize::Size32; - let expr3_0 = constructor_gpr_to_xmm(ctx, &expr0_0, &expr1_0, &expr2_0); - return expr3_0; - } - if pattern0_0 == I64 { - let pattern2_0 = arg1; - // Rule at src/isa/x64/inst.isle line 3674. - let expr0_0 = SseOpcode::Movq; - let expr1_0 = C::gpr_to_gpr_mem(ctx, pattern2_0); - let expr2_0 = OperandSize::Size64; - let expr3_0 = constructor_gpr_to_xmm(ctx, &expr0_0, &expr1_0, &expr2_0); - return expr3_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "bitcast_gpr_to_xmm", "src/isa/x64/inst.isle line 3671" - ); -} - -// Generated as internal constructor for term stack_addr_impl. -pub fn constructor_stack_addr_impl( - ctx: &mut C, - arg0: StackSlot, - arg1: Offset32, -) -> Gpr { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 3680. - let expr0_0 = C::temp_writable_gpr(ctx); - let expr1_0 = C::writable_gpr_to_reg(ctx, expr0_0); - let expr2_0 = C::abi_stackslot_addr(ctx, expr1_0, pattern0_0, pattern1_0); - let expr3_0 = C::emit(ctx, &expr2_0); - let expr4_0 = C::writable_gpr_to_gpr(ctx, expr0_0); - return expr4_0; -} - -// Generated as internal constructor for term div_or_rem. -pub fn constructor_div_or_rem( - ctx: &mut C, - arg0: &DivOrRemKind, - arg1: Value, - arg2: Value, -) -> Gpr { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = C::value_type(ctx, pattern1_0); - let pattern3_0 = arg2; - // Rule at src/isa/x64/inst.isle line 3691. - let expr0_0 = C::temp_writable_gpr(ctx); - let expr1_0 = constructor_put_in_gpr(ctx, pattern1_0); - let expr2_0 = constructor_put_in_gpr(ctx, pattern3_0); - let expr3_0 = C::emit_div_or_rem(ctx, pattern0_0, pattern2_0, expr0_0, expr1_0, expr2_0); - let expr4_0 = C::writable_gpr_to_gpr(ctx, expr0_0); - return expr4_0; -} - -// Generated as internal constructor for term read_pinned_gpr. -pub fn constructor_read_pinned_gpr(ctx: &mut C) -> Gpr { - // Rule at src/isa/x64/inst.isle line 3699. - let expr0_0 = C::preg_pinned(ctx); - let expr1_0 = constructor_mov_from_preg(ctx, expr0_0); - let expr2_0 = C::gpr_new(ctx, expr1_0); - return expr2_0; -} - -// Generated as internal constructor for term write_pinned_gpr. -pub fn constructor_write_pinned_gpr(ctx: &mut C, arg0: Gpr) -> SideEffectNoResult { - let pattern0_0 = arg0; - // Rule at src/isa/x64/inst.isle line 3703. - let expr0_0 = C::preg_pinned(ctx); - let expr1_0 = constructor_mov_to_preg(ctx, expr0_0, pattern0_0); - return expr1_0; -} - -// Generated as internal constructor for term elf_tls_get_addr. -pub fn constructor_elf_tls_get_addr(ctx: &mut C, arg0: ExternalName) -> Gpr { - let pattern0_0 = arg0; - // Rule at src/isa/x64/inst.isle line 3751. - let expr0_0 = C::temp_writable_gpr(ctx); - let expr1_0 = MInst::ElfTlsGetAddr { - symbol: pattern0_0, - dst: expr0_0, - }; - let expr2_0 = C::emit(ctx, &expr1_0); - let expr3_0 = C::writable_gpr_to_gpr(ctx, expr0_0); - return expr3_0; -} - -// Generated as internal constructor for term macho_tls_get_addr. -pub fn constructor_macho_tls_get_addr(ctx: &mut C, arg0: ExternalName) -> Gpr { - let pattern0_0 = arg0; - // Rule at src/isa/x64/inst.isle line 3758. - let expr0_0 = C::temp_writable_gpr(ctx); - let expr1_0 = MInst::MachOTlsGetAddr { - symbol: pattern0_0, - dst: expr0_0, - }; - let expr2_0 = C::emit(ctx, &expr1_0); - let expr3_0 = C::writable_gpr_to_gpr(ctx, expr0_0); - return expr3_0; -} - -// Generated as internal constructor for term coff_tls_get_addr. -pub fn constructor_coff_tls_get_addr(ctx: &mut C, arg0: ExternalName) -> Gpr { - let pattern0_0 = arg0; - // Rule at src/isa/x64/inst.isle line 3765. - let expr0_0 = C::temp_writable_gpr(ctx); - let expr1_0 = C::temp_writable_gpr(ctx); - let expr2_0 = MInst::CoffTlsGetAddr { - symbol: pattern0_0, - dst: expr0_0, - tmp: expr1_0, - }; - let expr3_0 = C::emit(ctx, &expr2_0); - let expr4_0 = C::writable_gpr_to_gpr(ctx, expr0_0); - return expr4_0; -} - -// Generated as internal constructor for term reg_to_xmm_mem. -pub fn constructor_reg_to_xmm_mem(ctx: &mut C, arg0: Reg) -> XmmMem { - let pattern0_0 = arg0; - // Rule at src/isa/x64/inst.isle line 3841. - let expr0_0 = C::xmm_new(ctx, pattern0_0); - let expr1_0 = C::xmm_to_xmm_mem(ctx, expr0_0); - return expr1_0; -} - -// Generated as internal constructor for term xmm_to_reg_mem. -pub fn constructor_xmm_to_reg_mem(ctx: &mut C, arg0: Reg) -> XmmMem { - let pattern0_0 = arg0; - // Rule at src/isa/x64/inst.isle line 3844. - let expr0_0 = C::xmm_new(ctx, pattern0_0); - let expr1_0 = C::xmm_to_reg(ctx, expr0_0); - let expr2_0 = RegMem::Reg { reg: expr1_0 }; - let expr3_0 = C::reg_mem_to_xmm_mem(ctx, &expr2_0); - return expr3_0; -} - -// Generated as internal constructor for term writable_gpr_to_r_reg. -pub fn constructor_writable_gpr_to_r_reg(ctx: &mut C, arg0: WritableGpr) -> Reg { - let pattern0_0 = arg0; - // Rule at src/isa/x64/inst.isle line 3848. - let expr0_0 = C::writable_gpr_to_reg(ctx, pattern0_0); - let expr1_0 = C::writable_reg_to_reg(ctx, expr0_0); - return expr1_0; -} - -// Generated as internal constructor for term writable_gpr_to_gpr_mem. -pub fn constructor_writable_gpr_to_gpr_mem(ctx: &mut C, arg0: WritableGpr) -> GprMem { - let pattern0_0 = arg0; - // Rule at src/isa/x64/inst.isle line 3851. - let expr0_0 = C::writable_gpr_to_gpr(ctx, pattern0_0); - let expr1_0 = C::gpr_to_gpr_mem(ctx, expr0_0); - return expr1_0; -} - -// Generated as internal constructor for term writable_gpr_to_value_regs. -pub fn constructor_writable_gpr_to_value_regs( - ctx: &mut C, - arg0: WritableGpr, -) -> ValueRegs { - let pattern0_0 = arg0; - // Rule at src/isa/x64/inst.isle line 3854. - let expr0_0 = constructor_writable_gpr_to_r_reg(ctx, pattern0_0); - let expr1_0 = C::value_reg(ctx, expr0_0); - return expr1_0; -} - -// Generated as internal constructor for term writable_xmm_to_r_reg. -pub fn constructor_writable_xmm_to_r_reg(ctx: &mut C, arg0: WritableXmm) -> Reg { - let pattern0_0 = arg0; - // Rule at src/isa/x64/inst.isle line 3857. - let expr0_0 = C::writable_xmm_to_reg(ctx, pattern0_0); - let expr1_0 = C::writable_reg_to_reg(ctx, expr0_0); - return expr1_0; -} - -// Generated as internal constructor for term writable_xmm_to_xmm_mem. -pub fn constructor_writable_xmm_to_xmm_mem(ctx: &mut C, arg0: WritableXmm) -> XmmMem { - let pattern0_0 = arg0; - // Rule at src/isa/x64/inst.isle line 3860. - let expr0_0 = C::writable_xmm_to_xmm(ctx, pattern0_0); - let expr1_0 = C::xmm_to_xmm_mem(ctx, expr0_0); - return expr1_0; -} - -// Generated as internal constructor for term writable_xmm_to_value_regs. -pub fn constructor_writable_xmm_to_value_regs( - ctx: &mut C, - arg0: WritableXmm, -) -> ValueRegs { - let pattern0_0 = arg0; - // Rule at src/isa/x64/inst.isle line 3863. - let expr0_0 = constructor_writable_xmm_to_r_reg(ctx, pattern0_0); - let expr1_0 = C::value_reg(ctx, expr0_0); - return expr1_0; -} - -// Generated as internal constructor for term synthetic_amode_to_gpr_mem. -pub fn constructor_synthetic_amode_to_gpr_mem( - ctx: &mut C, - arg0: &SyntheticAmode, -) -> GprMem { - let pattern0_0 = arg0; - // Rule at src/isa/x64/inst.isle line 3870. - let expr0_0 = C::synthetic_amode_to_reg_mem(ctx, pattern0_0); - let expr1_0 = C::reg_mem_to_gpr_mem(ctx, &expr0_0); - return expr1_0; -} - -// Generated as internal constructor for term amode_to_gpr_mem. -pub fn constructor_amode_to_gpr_mem(ctx: &mut C, arg0: &Amode) -> GprMem { - let pattern0_0 = arg0; - // Rule at src/isa/x64/inst.isle line 3868. - let expr0_0 = C::amode_to_synthetic_amode(ctx, pattern0_0); - let expr1_0 = constructor_synthetic_amode_to_gpr_mem(ctx, &expr0_0); - return expr1_0; -} - -// Generated as internal constructor for term amode_to_xmm_mem. -pub fn constructor_amode_to_xmm_mem(ctx: &mut C, arg0: &Amode) -> XmmMem { - let pattern0_0 = arg0; - // Rule at src/isa/x64/inst.isle line 3873. - let expr0_0 = C::amode_to_synthetic_amode(ctx, pattern0_0); - let expr1_0 = constructor_synthetic_amode_to_xmm_mem(ctx, &expr0_0); - return expr1_0; -} - -// Generated as internal constructor for term synthetic_amode_to_xmm_mem. -pub fn constructor_synthetic_amode_to_xmm_mem( - ctx: &mut C, - arg0: &SyntheticAmode, -) -> XmmMem { - let pattern0_0 = arg0; - // Rule at src/isa/x64/inst.isle line 3876. - let expr0_0 = C::synthetic_amode_to_reg_mem(ctx, pattern0_0); - let expr1_0 = C::reg_mem_to_xmm_mem(ctx, &expr0_0); - return expr1_0; -} - -// Generated as internal constructor for term mov_from_preg. -pub fn constructor_mov_from_preg(ctx: &mut C, arg0: PReg) -> Reg { - let pattern0_0 = arg0; - // Rule at src/isa/x64/inst.isle line 3883. - let expr0_0 = C::temp_writable_gpr(ctx); - let expr1_0 = MInst::MovFromPReg { - src: pattern0_0, - dst: expr0_0, - }; - let expr2_0 = C::emit(ctx, &expr1_0); - let expr3_0 = constructor_writable_gpr_to_r_reg(ctx, expr0_0); - return expr3_0; -} - -// Generated as internal constructor for term mov_to_preg. -pub fn constructor_mov_to_preg( - ctx: &mut C, - arg0: PReg, - arg1: Gpr, -) -> SideEffectNoResult { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 3889. - let expr0_0 = MInst::MovToPReg { - src: pattern1_0, - dst: pattern0_0, - }; - let expr1_0 = SideEffectNoResult::Inst { inst: expr0_0 }; - return expr1_0; -} - -// Generated as internal constructor for term x64_rbp. -pub fn constructor_x64_rbp(ctx: &mut C) -> Reg { - // Rule at src/isa/x64/inst.isle line 3902. - let expr0_0 = C::preg_rbp(ctx); - let expr1_0 = constructor_mov_from_preg(ctx, expr0_0); - return expr1_0; -} - -// Generated as internal constructor for term x64_rsp. -pub fn constructor_x64_rsp(ctx: &mut C) -> Reg { - // Rule at src/isa/x64/inst.isle line 3906. - let expr0_0 = C::preg_rsp(ctx); - let expr1_0 = constructor_mov_from_preg(ctx, expr0_0); - return expr1_0; -} - -// Generated as internal constructor for term lower. -pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::first_result(ctx, pattern0_0) { - let pattern2_0 = C::value_type(ctx, pattern1_0); - if pattern2_0 == I128 { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Binary { - opcode: ref pattern5_0, - args: ref pattern5_1, - } = &pattern4_0 - { - match pattern5_0 { - &Opcode::Band => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 262. - let expr0_0 = C::put_in_regs(ctx, pattern7_0); - let expr1_0: usize = 0i128 as usize; - let expr2_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr1_0); - let expr3_0: usize = 1i128 as usize; - let expr4_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr3_0); - let expr5_0 = C::put_in_regs(ctx, pattern7_1); - let expr6_0: usize = 0i128 as usize; - let expr7_0 = constructor_value_regs_get_gpr(ctx, expr5_0, expr6_0); - let expr8_0: usize = 1i128 as usize; - let expr9_0 = constructor_value_regs_get_gpr(ctx, expr5_0, expr8_0); - let expr10_0: Type = I64; - let expr11_0 = C::gpr_to_gpr_mem_imm(ctx, expr7_0); - let expr12_0 = constructor_x64_and(ctx, expr10_0, expr2_0, &expr11_0); - let expr13_0: Type = I64; - let expr14_0 = C::gpr_to_gpr_mem_imm(ctx, expr9_0); - let expr15_0 = constructor_x64_and(ctx, expr13_0, expr4_0, &expr14_0); - let expr16_0 = constructor_value_gprs(ctx, expr12_0, expr15_0); - let expr17_0 = C::output(ctx, expr16_0); - return Some(expr17_0); - } - &Opcode::Bor => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 332. - let expr0_0 = C::put_in_regs(ctx, pattern7_0); - let expr1_0 = C::put_in_regs(ctx, pattern7_1); - let expr2_0 = constructor_or_i128(ctx, expr0_0, expr1_0); - let expr3_0 = C::output(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::Bxor => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 378. - let expr0_0 = C::put_in_regs(ctx, pattern7_0); - let expr1_0: usize = 0i128 as usize; - let expr2_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr1_0); - let expr3_0: usize = 1i128 as usize; - let expr4_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr3_0); - let expr5_0 = C::put_in_regs(ctx, pattern7_1); - let expr6_0: usize = 0i128 as usize; - let expr7_0 = constructor_value_regs_get_gpr(ctx, expr5_0, expr6_0); - let expr8_0: usize = 1i128 as usize; - let expr9_0 = constructor_value_regs_get_gpr(ctx, expr5_0, expr8_0); - let expr10_0: Type = I64; - let expr11_0 = C::gpr_to_gpr_mem_imm(ctx, expr7_0); - let expr12_0 = constructor_x64_xor(ctx, expr10_0, expr2_0, &expr11_0); - let expr13_0: Type = I64; - let expr14_0 = C::gpr_to_gpr_mem_imm(ctx, expr9_0); - let expr15_0 = constructor_x64_xor(ctx, expr13_0, expr4_0, &expr14_0); - let expr16_0 = constructor_value_gprs(ctx, expr12_0, expr15_0); - let expr17_0 = C::output(ctx, expr16_0); - return Some(expr17_0); - } - _ => {} - } - } - } - } - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::first_result(ctx, pattern0_0) { - let pattern2_0 = C::value_type(ctx, pattern1_0); - if let Some((pattern3_0, pattern3_1)) = C::multi_lane(ctx, pattern2_0) { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Binary { - opcode: ref pattern5_0, - args: ref pattern5_1, - } = &pattern4_0 - { - match pattern5_0 { - &Opcode::Band => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 256. - let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0); - let expr1_0 = C::put_in_xmm_mem(ctx, pattern7_1); - let expr2_0 = constructor_sse_and(ctx, pattern2_0, expr0_0, &expr1_0); - let expr3_0 = constructor_output_xmm(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::Bor => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 317. - let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0); - let expr1_0 = C::put_in_xmm_mem(ctx, pattern7_1); - let expr2_0 = constructor_sse_or(ctx, pattern2_0, expr0_0, &expr1_0); - let expr3_0 = constructor_output_xmm(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::Bxor => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 373. - let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0); - let expr1_0 = C::put_in_xmm_mem(ctx, pattern7_1); - let expr2_0 = constructor_sse_xor(ctx, pattern2_0, expr0_0, &expr1_0); - let expr3_0 = constructor_output_xmm(ctx, expr2_0); - return Some(expr3_0); - } - _ => {} - } - } - } - } - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::first_result(ctx, pattern0_0) { - let pattern2_0 = C::value_type(ctx, pattern1_0); - if let Some(pattern3_0) = C::ty_scalar_float(ctx, pattern2_0) { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Binary { - opcode: ref pattern5_0, - args: ref pattern5_1, - } = &pattern4_0 - { - match pattern5_0 { - &Opcode::Band => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 244. - let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0); - let expr1_0 = C::put_in_xmm_mem(ctx, pattern7_1); - let expr2_0 = constructor_sse_and(ctx, pattern3_0, expr0_0, &expr1_0); - let expr3_0 = constructor_output_xmm(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::Bor => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 305. - let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0); - let expr1_0 = C::put_in_xmm_mem(ctx, pattern7_1); - let expr2_0 = constructor_sse_or(ctx, pattern3_0, expr0_0, &expr1_0); - let expr3_0 = constructor_output_xmm(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::Bxor => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 368. - let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0); - let expr1_0 = C::put_in_xmm_mem(ctx, pattern7_1); - let expr2_0 = constructor_sse_xor(ctx, pattern3_0, expr0_0, &expr1_0); - let expr3_0 = constructor_output_xmm(ctx, expr2_0); - return Some(expr3_0); - } - _ => {} - } - } - } - } - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::first_result(ctx, pattern0_0) { - let pattern2_0 = C::value_type(ctx, pattern1_0); - if let Some(pattern3_0) = C::fits_in_64(ctx, pattern2_0) { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::IntAddTrap { - opcode: ref pattern5_0, - args: ref pattern5_1, - code: ref pattern5_2, - } = &pattern4_0 - { - if let &Opcode::UaddOverflowTrap = pattern5_0 { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - if let Some(pattern8_0) = C::sinkable_load(ctx, pattern7_0) { - // Rule at src/isa/x64/lower.isle line 1459. - let expr0_0 = constructor_put_in_gpr(ctx, pattern7_1); - let expr1_0 = constructor_sink_load_to_gpr_mem_imm(ctx, &pattern8_0); - let expr2_0 = constructor_x64_add_with_flags_paired( - ctx, pattern3_0, expr0_0, &expr1_0, - ); - let expr3_0 = CC::B; - let expr4_0 = constructor_trap_if(ctx, &expr3_0, pattern5_2); - let expr5_0 = constructor_with_flags(ctx, &expr2_0, &expr4_0); - let expr6_0 = C::output(ctx, expr5_0); - return Some(expr6_0); - } - } - } - } - let pattern3_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Binary { - opcode: ref pattern4_0, - args: ref pattern4_1, - } = &pattern3_0 - { - match pattern4_0 { - &Opcode::Band => { - let (pattern6_0, pattern6_1) = C::unpack_value_array_2(ctx, pattern4_1); - if let Some(pattern7_0) = C::simm32_from_value(ctx, pattern6_0) { - let mut closure8 = || { - let expr0_0 = C::ty_int_ref_scalar_64(ctx, pattern2_0)?; - return Some(expr0_0); - }; - if let Some(pattern8_0) = closure8() { - // Rule at src/isa/x64/lower.isle line 238. - let expr0_0 = constructor_put_in_gpr(ctx, pattern6_1); - let expr1_0 = - constructor_x64_and(ctx, pattern2_0, expr0_0, &pattern7_0); - let expr2_0 = constructor_output_gpr(ctx, expr1_0); - return Some(expr2_0); - } - } - } - &Opcode::Bor => { - let (pattern6_0, pattern6_1) = C::unpack_value_array_2(ctx, pattern4_1); - if let Some(pattern7_0) = C::simm32_from_value(ctx, pattern6_0) { - let mut closure8 = || { - let expr0_0 = C::ty_int_ref_scalar_64(ctx, pattern2_0)?; - return Some(expr0_0); - }; - if let Some(pattern8_0) = closure8() { - // Rule at src/isa/x64/lower.isle line 299. - let expr0_0 = constructor_put_in_gpr(ctx, pattern6_1); - let expr1_0 = constructor_x64_or(ctx, pattern2_0, expr0_0, &pattern7_0); - let expr2_0 = constructor_output_gpr(ctx, expr1_0); - return Some(expr2_0); - } - } - } - &Opcode::Bxor => { - let (pattern6_0, pattern6_1) = C::unpack_value_array_2(ctx, pattern4_1); - if let Some(pattern7_0) = C::simm32_from_value(ctx, pattern6_0) { - let mut closure8 = || { - let expr0_0 = C::ty_int_ref_scalar_64(ctx, pattern2_0)?; - return Some(expr0_0); - }; - if let Some(pattern8_0) = closure8() { - // Rule at src/isa/x64/lower.isle line 362. - let expr0_0 = constructor_put_in_gpr(ctx, pattern6_1); - let expr1_0 = - constructor_x64_xor(ctx, pattern2_0, expr0_0, &pattern7_0); - let expr2_0 = constructor_output_gpr(ctx, expr1_0); - return Some(expr2_0); - } - } - } - _ => {} - } - } - } - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::first_result(ctx, pattern0_0) { - let pattern2_0 = C::value_type(ctx, pattern1_0); - if let Some(pattern3_0) = C::fits_in_64(ctx, pattern2_0) { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::IntAddTrap { - opcode: ref pattern5_0, - args: ref pattern5_1, - code: ref pattern5_2, - } = &pattern4_0 - { - if let &Opcode::UaddOverflowTrap = pattern5_0 { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - if let Some(pattern8_0) = C::sinkable_load(ctx, pattern7_1) { - // Rule at src/isa/x64/lower.isle line 1453. - let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0); - let expr1_0 = constructor_sink_load_to_gpr_mem_imm(ctx, &pattern8_0); - let expr2_0 = constructor_x64_add_with_flags_paired( - ctx, pattern3_0, expr0_0, &expr1_0, - ); - let expr3_0 = CC::B; - let expr4_0 = constructor_trap_if(ctx, &expr3_0, pattern5_2); - let expr5_0 = constructor_with_flags(ctx, &expr2_0, &expr4_0); - let expr6_0 = C::output(ctx, expr5_0); - return Some(expr6_0); - } - } - } - } - if let Some(pattern3_0) = C::ty_32_or_64(ctx, pattern2_0) { - let pattern4_0 = C::use_popcnt(ctx, pattern2_0); - if pattern4_0 == true { - let pattern6_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Unary { - opcode: ref pattern7_0, - arg: pattern7_1, - } = &pattern6_0 - { - if let &Opcode::Popcnt = pattern7_0 { - // Rule at src/isa/x64/lower.isle line 1844. - let expr0_0 = constructor_put_in_gpr(ctx, pattern7_1); - let expr1_0 = constructor_x64_popcnt(ctx, pattern3_0, expr0_0); - let expr2_0 = constructor_output_gpr(ctx, expr1_0); - return Some(expr2_0); - } - } - } - } - let pattern3_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Binary { - opcode: ref pattern4_0, - args: ref pattern4_1, - } = &pattern3_0 - { - match pattern4_0 { - &Opcode::Band => { - let (pattern6_0, pattern6_1) = C::unpack_value_array_2(ctx, pattern4_1); - if let Some(pattern7_0) = C::simm32_from_value(ctx, pattern6_1) { - let mut closure8 = || { - let expr0_0 = C::ty_int_ref_scalar_64(ctx, pattern2_0)?; - return Some(expr0_0); - }; - if let Some(pattern8_0) = closure8() { - // Rule at src/isa/x64/lower.isle line 234. - let expr0_0 = constructor_put_in_gpr(ctx, pattern6_0); - let expr1_0 = - constructor_x64_and(ctx, pattern2_0, expr0_0, &pattern7_0); - let expr2_0 = constructor_output_gpr(ctx, expr1_0); - return Some(expr2_0); - } - } - } - &Opcode::Bor => { - let (pattern6_0, pattern6_1) = C::unpack_value_array_2(ctx, pattern4_1); - if let Some(pattern7_0) = C::simm32_from_value(ctx, pattern6_1) { - let mut closure8 = || { - let expr0_0 = C::ty_int_ref_scalar_64(ctx, pattern2_0)?; - return Some(expr0_0); - }; - if let Some(pattern8_0) = closure8() { - // Rule at src/isa/x64/lower.isle line 295. - let expr0_0 = constructor_put_in_gpr(ctx, pattern6_0); - let expr1_0 = constructor_x64_or(ctx, pattern2_0, expr0_0, &pattern7_0); - let expr2_0 = constructor_output_gpr(ctx, expr1_0); - return Some(expr2_0); - } - } - } - &Opcode::Bxor => { - let (pattern6_0, pattern6_1) = C::unpack_value_array_2(ctx, pattern4_1); - if let Some(pattern7_0) = C::simm32_from_value(ctx, pattern6_1) { - let mut closure8 = || { - let expr0_0 = C::ty_int_ref_scalar_64(ctx, pattern2_0)?; - return Some(expr0_0); - }; - if let Some(pattern8_0) = closure8() { - // Rule at src/isa/x64/lower.isle line 358. - let expr0_0 = constructor_put_in_gpr(ctx, pattern6_0); - let expr1_0 = - constructor_x64_xor(ctx, pattern2_0, expr0_0, &pattern7_0); - let expr2_0 = constructor_output_gpr(ctx, expr1_0); - return Some(expr2_0); - } - } - } - _ => {} - } - } - let pattern3_0 = C::avx512vl_enabled(ctx, pattern2_0); - if pattern3_0 == true { - let pattern5_0 = C::avx512dq_enabled(ctx, pattern2_0); - if pattern5_0 == true { - if let Some((pattern7_0, pattern7_1)) = C::multi_lane(ctx, pattern2_0) { - if pattern7_0 == 64i128 as u32 { - if pattern7_1 == 2i128 as u32 { - let pattern10_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Binary { - opcode: ref pattern11_0, - args: ref pattern11_1, - } = &pattern10_0 - { - if let &Opcode::Imul = pattern11_0 { - let (pattern13_0, pattern13_1) = - C::unpack_value_array_2(ctx, pattern11_1); - // Rule at src/isa/x64/lower.isle line 889. - let expr0_0 = C::put_in_xmm_mem(ctx, pattern13_0); - let expr1_0 = constructor_put_in_xmm(ctx, pattern13_1); - let expr2_0 = constructor_x64_vpmullq(ctx, &expr0_0, expr1_0); - let expr3_0 = constructor_output_xmm(ctx, expr2_0); - return Some(expr3_0); - } - } - } - } - } - } - } - } - let pattern1_0 = C::inst_data(ctx, pattern0_0); - match &pattern1_0 { - &InstructionData::Unary { - opcode: ref pattern2_0, - arg: pattern2_1, - } => { - if let &Opcode::ScalarToVector = pattern2_0 { - if let Some(pattern4_0) = C::sinkable_load(ctx, pattern2_1) { - let pattern5_0 = C::value_type(ctx, pattern2_1); - if let Some(pattern6_0) = C::ty_64(ctx, pattern5_0) { - // Rule at src/isa/x64/lower.isle line 3605. - let expr0_0 = constructor_sink_load_to_xmm_mem(ctx, &pattern4_0); - let expr1_0 = constructor_x64_movsd_load(ctx, &expr0_0); - let expr2_0 = constructor_output_xmm(ctx, expr1_0); - return Some(expr2_0); - } - } - } - } - &InstructionData::Shuffle { - opcode: ref pattern2_0, - args: ref pattern2_1, - imm: pattern2_2, - } => { - if let &Opcode::Shuffle = pattern2_0 { - let (pattern4_0, pattern4_1) = C::unpack_value_array_2(ctx, pattern2_1); - if pattern4_1 == pattern4_0 { - if let Some(pattern6_0) = C::vec_mask_from_immediate(ctx, pattern2_2) { - // Rule at src/isa/x64/lower.isle line 3515. - let expr0_0 = constructor_put_in_xmm(ctx, pattern4_0); - let expr1_0: Type = I8X16; - let expr2_0 = C::shuffle_0_31_mask(ctx, &pattern6_0); - let expr3_0 = constructor_x64_xmm_load_const(ctx, expr1_0, expr2_0); - let expr4_0 = C::xmm_to_xmm_mem(ctx, expr3_0); - let expr5_0 = constructor_x64_pshufb(ctx, expr0_0, &expr4_0); - let expr6_0 = constructor_output_xmm(ctx, expr5_0); - return Some(expr6_0); - } - } - } - } - &InstructionData::Store { - opcode: ref pattern2_0, - args: ref pattern2_1, - flags: pattern2_2, - offset: pattern2_3, - } => { - if let &Opcode::Store = pattern2_0 { - let (pattern4_0, pattern4_1) = C::unpack_value_array_2(ctx, pattern2_1); - if let Some(pattern5_0) = C::def_inst(ctx, pattern4_0) { - if let Some(pattern6_0) = C::first_result(ctx, pattern5_0) { - let pattern7_0 = C::value_type(ctx, pattern6_0); - if let Some(pattern8_0) = C::ty_32_or_64(ctx, pattern7_0) { - let pattern9_0 = C::inst_data(ctx, pattern5_0); - if let &InstructionData::Binary { - opcode: ref pattern10_0, - args: ref pattern10_1, - } = &pattern9_0 - { - match pattern10_0 { - &Opcode::Iadd => { - let (pattern12_0, pattern12_1) = - C::unpack_value_array_2(ctx, pattern10_1); - if let Some(pattern13_0) = - C::sinkable_load(ctx, pattern12_0) - { - if let Some(pattern14_0) = C::def_inst(ctx, pattern12_0) - { - let pattern15_0 = C::inst_data(ctx, pattern14_0); - if let &InstructionData::Load { - opcode: ref pattern16_0, - arg: pattern16_1, - flags: pattern16_2, - offset: pattern16_3, - } = &pattern15_0 - { - if let &Opcode::Load = pattern16_0 { - if pattern4_1 == pattern16_1 { - if pattern2_2 == pattern16_2 { - if pattern2_3 == pattern16_3 { - // Rule at src/isa/x64/lower.isle line 2660. - let expr0_0 = C::sink_load( - ctx, - &pattern13_0, - ); - let expr1_0 = constructor_reg_mem_to_reg_mem_imm(ctx, &expr0_0); - let expr2_0 = - constructor_to_amode( - ctx, - pattern16_2, - pattern16_1, - pattern16_3, - ); - let expr3_0 = - constructor_put_in_gpr( - ctx, - pattern12_1, - ); - let expr4_0 = - constructor_x64_add_mem( - ctx, pattern8_0, - &expr2_0, expr3_0, - ); - let expr5_0 = - constructor_side_effect( - ctx, &expr4_0, - ); - return Some(expr5_0); - } - } - } - } - } - } - } - } - &Opcode::Band => { - let (pattern12_0, pattern12_1) = - C::unpack_value_array_2(ctx, pattern10_1); - if let Some(pattern13_0) = - C::sinkable_load(ctx, pattern12_0) - { - if let Some(pattern14_0) = C::def_inst(ctx, pattern12_0) - { - let pattern15_0 = C::inst_data(ctx, pattern14_0); - if let &InstructionData::Load { - opcode: ref pattern16_0, - arg: pattern16_1, - flags: pattern16_2, - offset: pattern16_3, - } = &pattern15_0 - { - if let &Opcode::Load = pattern16_0 { - if pattern4_1 == pattern16_1 { - if pattern2_2 == pattern16_2 { - if pattern2_3 == pattern16_3 { - // Rule at src/isa/x64/lower.isle line 2702. - let expr0_0 = C::sink_load( - ctx, - &pattern13_0, - ); - let expr1_0 = constructor_reg_mem_to_reg_mem_imm(ctx, &expr0_0); - let expr2_0 = - constructor_to_amode( - ctx, - pattern16_2, - pattern16_1, - pattern16_3, - ); - let expr3_0 = - constructor_put_in_gpr( - ctx, - pattern12_1, - ); - let expr4_0 = - constructor_x64_and_mem( - ctx, pattern8_0, - &expr2_0, expr3_0, - ); - let expr5_0 = - constructor_side_effect( - ctx, &expr4_0, - ); - return Some(expr5_0); - } - } - } - } - } - } - } - } - &Opcode::Bor => { - let (pattern12_0, pattern12_1) = - C::unpack_value_array_2(ctx, pattern10_1); - if let Some(pattern13_0) = - C::sinkable_load(ctx, pattern12_0) - { - if let Some(pattern14_0) = C::def_inst(ctx, pattern12_0) - { - let pattern15_0 = C::inst_data(ctx, pattern14_0); - if let &InstructionData::Load { - opcode: ref pattern16_0, - arg: pattern16_1, - flags: pattern16_2, - offset: pattern16_3, - } = &pattern15_0 - { - if let &Opcode::Load = pattern16_0 { - if pattern4_1 == pattern16_1 { - if pattern2_2 == pattern16_2 { - if pattern2_3 == pattern16_3 { - // Rule at src/isa/x64/lower.isle line 2730. - let expr0_0 = C::sink_load( - ctx, - &pattern13_0, - ); - let expr1_0 = constructor_reg_mem_to_reg_mem_imm(ctx, &expr0_0); - let expr2_0 = - constructor_to_amode( - ctx, - pattern16_2, - pattern16_1, - pattern16_3, - ); - let expr3_0 = - constructor_put_in_gpr( - ctx, - pattern12_1, - ); - let expr4_0 = - constructor_x64_or_mem( - ctx, pattern8_0, - &expr2_0, expr3_0, - ); - let expr5_0 = - constructor_side_effect( - ctx, &expr4_0, - ); - return Some(expr5_0); - } - } - } - } - } - } - } - } - &Opcode::Bxor => { - let (pattern12_0, pattern12_1) = - C::unpack_value_array_2(ctx, pattern10_1); - if let Some(pattern13_0) = - C::sinkable_load(ctx, pattern12_0) - { - if let Some(pattern14_0) = C::def_inst(ctx, pattern12_0) - { - let pattern15_0 = C::inst_data(ctx, pattern14_0); - if let &InstructionData::Load { - opcode: ref pattern16_0, - arg: pattern16_1, - flags: pattern16_2, - offset: pattern16_3, - } = &pattern15_0 - { - if let &Opcode::Load = pattern16_0 { - if pattern4_1 == pattern16_1 { - if pattern2_2 == pattern16_2 { - if pattern2_3 == pattern16_3 { - // Rule at src/isa/x64/lower.isle line 2758. - let expr0_0 = C::sink_load( - ctx, - &pattern13_0, - ); - let expr1_0 = constructor_reg_mem_to_reg_mem_imm(ctx, &expr0_0); - let expr2_0 = - constructor_to_amode( - ctx, - pattern16_2, - pattern16_1, - pattern16_3, - ); - let expr3_0 = - constructor_put_in_gpr( - ctx, - pattern12_1, - ); - let expr4_0 = - constructor_x64_xor_mem( - ctx, pattern8_0, - &expr2_0, expr3_0, - ); - let expr5_0 = - constructor_side_effect( - ctx, &expr4_0, - ); - return Some(expr5_0); - } - } - } - } - } - } - } - } - _ => {} - } - } - } - } - } - } - } - _ => {} - } - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::first_result(ctx, pattern0_0) { - let pattern2_0 = C::value_type(ctx, pattern1_0); - if pattern2_0 == I8 { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::IntCompare { - opcode: ref pattern5_0, - args: ref pattern5_1, - cond: ref pattern5_2, - } = &pattern4_0 - { - if let &Opcode::Icmp = pattern5_0 { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - if let Some(pattern8_0) = C::def_inst(ctx, pattern7_0) { - let pattern9_0 = C::inst_data(ctx, pattern8_0); - if let &InstructionData::UnaryImm { - opcode: ref pattern10_0, - imm: pattern10_1, - } = &pattern9_0 - { - if let &Opcode::Iconst = pattern10_0 { - let pattern12_0 = C::u64_from_imm64(ctx, pattern10_1); - if pattern12_0 == 0i128 as u64 { - let pattern14_0 = C::value_type(ctx, pattern7_1); - if pattern14_0 == I32 { - match pattern5_2 { - &IntCC::SignedGreaterThan => { - // Rule at src/isa/x64/lower.isle line 1505. - let expr0_0: Type = I32; - let expr1_0 = - constructor_put_in_gpr(ctx, pattern7_1); - let expr2_0: u8 = 31i128 as u8; - let expr3_0 = Imm8Reg::Imm8 { imm: expr2_0 }; - let expr4_0 = - C::imm8_reg_to_imm8_gpr(ctx, &expr3_0); - let expr5_0 = constructor_x64_shr( - ctx, expr0_0, expr1_0, &expr4_0, - ); - let expr6_0 = constructor_output_gpr(ctx, expr5_0); - return Some(expr6_0); - } - &IntCC::SignedLessThanOrEqual => { - // Rule at src/isa/x64/lower.isle line 1509. - let expr0_0: Type = I32; - let expr1_0: Type = I64; - let expr2_0 = - constructor_put_in_gpr(ctx, pattern7_1); - let expr3_0 = - constructor_x64_not(ctx, expr1_0, expr2_0); - let expr4_0: u8 = 31i128 as u8; - let expr5_0 = Imm8Reg::Imm8 { imm: expr4_0 }; - let expr6_0 = - C::imm8_reg_to_imm8_gpr(ctx, &expr5_0); - let expr7_0 = constructor_x64_shr( - ctx, expr0_0, expr3_0, &expr6_0, - ); - let expr8_0 = constructor_output_gpr(ctx, expr7_0); - return Some(expr8_0); - } - _ => {} - } - } - if pattern14_0 == I64 { - match pattern5_2 { - &IntCC::SignedGreaterThan => { - // Rule at src/isa/x64/lower.isle line 1489. - let expr0_0: Type = I64; - let expr1_0 = - constructor_put_in_gpr(ctx, pattern7_1); - let expr2_0: u8 = 63i128 as u8; - let expr3_0 = Imm8Reg::Imm8 { imm: expr2_0 }; - let expr4_0 = - C::imm8_reg_to_imm8_gpr(ctx, &expr3_0); - let expr5_0 = constructor_x64_shr( - ctx, expr0_0, expr1_0, &expr4_0, - ); - let expr6_0 = constructor_output_gpr(ctx, expr5_0); - return Some(expr6_0); - } - &IntCC::SignedLessThanOrEqual => { - // Rule at src/isa/x64/lower.isle line 1493. - let expr0_0: Type = I64; - let expr1_0: Type = I64; - let expr2_0 = - constructor_put_in_gpr(ctx, pattern7_1); - let expr3_0 = - constructor_x64_not(ctx, expr1_0, expr2_0); - let expr4_0: u8 = 63i128 as u8; - let expr5_0 = Imm8Reg::Imm8 { imm: expr4_0 }; - let expr6_0 = - C::imm8_reg_to_imm8_gpr(ctx, &expr5_0); - let expr7_0 = constructor_x64_shr( - ctx, expr0_0, expr3_0, &expr6_0, - ); - let expr8_0 = constructor_output_gpr(ctx, expr7_0); - return Some(expr8_0); - } - _ => {} - } - } - } - } - } - } - let pattern8_0 = C::value_type(ctx, pattern7_0); - if pattern8_0 == I32 { - if let Some(pattern10_0) = C::def_inst(ctx, pattern7_1) { - let pattern11_0 = C::inst_data(ctx, pattern10_0); - if let &InstructionData::UnaryImm { - opcode: ref pattern12_0, - imm: pattern12_1, - } = &pattern11_0 - { - if let &Opcode::Iconst = pattern12_0 { - let pattern14_0 = C::u64_from_imm64(ctx, pattern12_1); - if pattern14_0 == 0i128 as u64 { - match pattern5_2 { - &IntCC::SignedGreaterThanOrEqual => { - // Rule at src/isa/x64/lower.isle line 1513. - let expr0_0: Type = I32; - let expr1_0: Type = I64; - let expr2_0 = - constructor_put_in_gpr(ctx, pattern7_0); - let expr3_0 = - constructor_x64_not(ctx, expr1_0, expr2_0); - let expr4_0: u8 = 31i128 as u8; - let expr5_0 = Imm8Reg::Imm8 { imm: expr4_0 }; - let expr6_0 = - C::imm8_reg_to_imm8_gpr(ctx, &expr5_0); - let expr7_0 = constructor_x64_shr( - ctx, expr0_0, expr3_0, &expr6_0, - ); - let expr8_0 = constructor_output_gpr(ctx, expr7_0); - return Some(expr8_0); - } - &IntCC::SignedLessThan => { - // Rule at src/isa/x64/lower.isle line 1501. - let expr0_0: Type = I32; - let expr1_0 = - constructor_put_in_gpr(ctx, pattern7_0); - let expr2_0: u8 = 31i128 as u8; - let expr3_0 = Imm8Reg::Imm8 { imm: expr2_0 }; - let expr4_0 = - C::imm8_reg_to_imm8_gpr(ctx, &expr3_0); - let expr5_0 = constructor_x64_shr( - ctx, expr0_0, expr1_0, &expr4_0, - ); - let expr6_0 = constructor_output_gpr(ctx, expr5_0); - return Some(expr6_0); - } - _ => {} - } - } - } - } - } - } - if pattern8_0 == I64 { - if let Some(pattern10_0) = C::def_inst(ctx, pattern7_1) { - let pattern11_0 = C::inst_data(ctx, pattern10_0); - if let &InstructionData::UnaryImm { - opcode: ref pattern12_0, - imm: pattern12_1, - } = &pattern11_0 - { - if let &Opcode::Iconst = pattern12_0 { - let pattern14_0 = C::u64_from_imm64(ctx, pattern12_1); - if pattern14_0 == 0i128 as u64 { - match pattern5_2 { - &IntCC::SignedGreaterThanOrEqual => { - // Rule at src/isa/x64/lower.isle line 1497. - let expr0_0: Type = I64; - let expr1_0: Type = I64; - let expr2_0 = - constructor_put_in_gpr(ctx, pattern7_0); - let expr3_0 = - constructor_x64_not(ctx, expr1_0, expr2_0); - let expr4_0: u8 = 63i128 as u8; - let expr5_0 = Imm8Reg::Imm8 { imm: expr4_0 }; - let expr6_0 = - C::imm8_reg_to_imm8_gpr(ctx, &expr5_0); - let expr7_0 = constructor_x64_shr( - ctx, expr0_0, expr3_0, &expr6_0, - ); - let expr8_0 = constructor_output_gpr(ctx, expr7_0); - return Some(expr8_0); - } - &IntCC::SignedLessThan => { - // Rule at src/isa/x64/lower.isle line 1485. - let expr0_0: Type = I64; - let expr1_0 = - constructor_put_in_gpr(ctx, pattern7_0); - let expr2_0: u8 = 63i128 as u8; - let expr3_0 = Imm8Reg::Imm8 { imm: expr2_0 }; - let expr4_0 = - C::imm8_reg_to_imm8_gpr(ctx, &expr3_0); - let expr5_0 = constructor_x64_shr( - ctx, expr0_0, expr1_0, &expr4_0, - ); - let expr6_0 = constructor_output_gpr(ctx, expr5_0); - return Some(expr6_0); - } - _ => {} - } - } - } - } - } - } - } - } - } - if pattern2_0 == I128 { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Binary { - opcode: ref pattern5_0, - args: ref pattern5_1, - } = &pattern4_0 - { - if let &Opcode::Imul = pattern5_0 { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 854. - let expr0_0 = C::put_in_regs(ctx, pattern7_0); - let expr1_0: usize = 0i128 as usize; - let expr2_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr1_0); - let expr3_0: usize = 1i128 as usize; - let expr4_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr3_0); - let expr5_0 = C::put_in_regs(ctx, pattern7_1); - let expr6_0: usize = 0i128 as usize; - let expr7_0 = constructor_value_regs_get_gpr(ctx, expr5_0, expr6_0); - let expr8_0: usize = 1i128 as usize; - let expr9_0 = constructor_value_regs_get_gpr(ctx, expr5_0, expr8_0); - let expr10_0: Type = I64; - let expr11_0 = C::gpr_to_gpr_mem_imm(ctx, expr9_0); - let expr12_0 = constructor_x64_mul(ctx, expr10_0, expr2_0, &expr11_0); - let expr13_0: Type = I64; - let expr14_0 = C::gpr_to_gpr_mem_imm(ctx, expr7_0); - let expr15_0 = constructor_x64_mul(ctx, expr13_0, expr4_0, &expr14_0); - let expr16_0: Type = I64; - let expr17_0 = C::gpr_to_gpr_mem_imm(ctx, expr15_0); - let expr18_0 = constructor_x64_add(ctx, expr16_0, expr12_0, &expr17_0); - let expr19_0: Type = I64; - let expr20_0 = C::gpr_to_gpr_mem(ctx, expr7_0); - let expr21_0 = constructor_mulhi_u(ctx, expr19_0, expr2_0, &expr20_0); - let expr22_0: usize = 0i128 as usize; - let expr23_0 = constructor_value_regs_get_gpr(ctx, expr21_0, expr22_0); - let expr24_0: usize = 1i128 as usize; - let expr25_0 = constructor_value_regs_get_gpr(ctx, expr21_0, expr24_0); - let expr26_0: Type = I64; - let expr27_0 = C::gpr_to_gpr_mem_imm(ctx, expr25_0); - let expr28_0 = constructor_x64_add(ctx, expr26_0, expr18_0, &expr27_0); - let expr29_0 = constructor_value_gprs(ctx, expr23_0, expr28_0); - let expr30_0 = C::output(ctx, expr29_0); - return Some(expr30_0); - } - } - } - if pattern2_0 == F32 { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Unary { - opcode: ref pattern5_0, - arg: pattern5_1, - } = &pattern4_0 - { - if let &Opcode::FcvtFromSint = pattern5_0 { - let pattern7_0 = C::value_type(ctx, pattern5_1); - if pattern7_0 == I8 { - // Rule at src/isa/x64/lower.isle line 2960. - let expr0_0: Type = I32; - let expr1_0: Type = I32; - let expr2_0 = ExtendKind::Sign; - let expr3_0 = constructor_extend_to_gpr(ctx, pattern5_1, expr1_0, &expr2_0); - let expr4_0 = C::gpr_to_gpr_mem(ctx, expr3_0); - let expr5_0 = constructor_x64_cvtsi2ss(ctx, expr0_0, &expr4_0); - let expr6_0 = constructor_output_xmm(ctx, expr5_0); - return Some(expr6_0); - } - if pattern7_0 == I16 { - // Rule at src/isa/x64/lower.isle line 2963. - let expr0_0: Type = I32; - let expr1_0: Type = I32; - let expr2_0 = ExtendKind::Sign; - let expr3_0 = constructor_extend_to_gpr(ctx, pattern5_1, expr1_0, &expr2_0); - let expr4_0 = C::gpr_to_gpr_mem(ctx, expr3_0); - let expr5_0 = constructor_x64_cvtsi2ss(ctx, expr0_0, &expr4_0); - let expr6_0 = constructor_output_xmm(ctx, expr5_0); - return Some(expr6_0); - } - } - } - } - if pattern2_0 == F64 { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Unary { - opcode: ref pattern5_0, - arg: pattern5_1, - } = &pattern4_0 - { - if let &Opcode::FcvtFromSint = pattern5_0 { - let pattern7_0 = C::value_type(ctx, pattern5_1); - if pattern7_0 == I8 { - // Rule at src/isa/x64/lower.isle line 2969. - let expr0_0: Type = I32; - let expr1_0: Type = I32; - let expr2_0 = ExtendKind::Sign; - let expr3_0 = constructor_extend_to_gpr(ctx, pattern5_1, expr1_0, &expr2_0); - let expr4_0 = C::gpr_to_gpr_mem(ctx, expr3_0); - let expr5_0 = constructor_x64_cvtsi2sd(ctx, expr0_0, &expr4_0); - let expr6_0 = constructor_output_xmm(ctx, expr5_0); - return Some(expr6_0); - } - if pattern7_0 == I16 { - // Rule at src/isa/x64/lower.isle line 2972. - let expr0_0: Type = I32; - let expr1_0: Type = I32; - let expr2_0 = ExtendKind::Sign; - let expr3_0 = constructor_extend_to_gpr(ctx, pattern5_1, expr1_0, &expr2_0); - let expr4_0 = C::gpr_to_gpr_mem(ctx, expr3_0); - let expr5_0 = constructor_x64_cvtsi2sd(ctx, expr0_0, &expr4_0); - let expr6_0 = constructor_output_xmm(ctx, expr5_0); - return Some(expr6_0); - } - } - } - } - if let Some(pattern3_0) = C::fits_in_64(ctx, pattern2_0) { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::IntAddTrap { - opcode: ref pattern5_0, - args: ref pattern5_1, - code: ref pattern5_2, - } = &pattern4_0 - { - if let &Opcode::UaddOverflowTrap = pattern5_0 { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - if let Some(pattern8_0) = C::simm32_from_value(ctx, pattern7_0) { - // Rule at src/isa/x64/lower.isle line 1445. - let expr0_0 = constructor_put_in_gpr(ctx, pattern7_1); - let expr1_0 = constructor_x64_add_with_flags_paired( - ctx, - pattern3_0, - expr0_0, - &pattern8_0, - ); - let expr2_0 = CC::B; - let expr3_0 = constructor_trap_if(ctx, &expr2_0, pattern5_2); - let expr4_0 = constructor_with_flags(ctx, &expr1_0, &expr3_0); - let expr5_0 = C::output(ctx, expr4_0); - return Some(expr5_0); - } - } - } - } - if let Some(pattern3_0) = C::ty_32_or_64(ctx, pattern2_0) { - let pattern4_0 = C::use_lzcnt(ctx, pattern2_0); - if pattern4_0 == true { - let pattern6_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Unary { - opcode: ref pattern7_0, - arg: pattern7_1, - } = &pattern6_0 - { - if let &Opcode::Clz = pattern7_0 { - // Rule at src/isa/x64/lower.isle line 1762. - let expr0_0 = constructor_put_in_gpr(ctx, pattern7_1); - let expr1_0 = constructor_x64_lzcnt(ctx, pattern3_0, expr0_0); - let expr2_0 = constructor_output_gpr(ctx, expr1_0); - return Some(expr2_0); - } - } - } - if pattern4_0 == false { - let pattern6_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Unary { - opcode: ref pattern7_0, - arg: pattern7_1, - } = &pattern6_0 - { - if let &Opcode::Clz = pattern7_0 { - // Rule at src/isa/x64/lower.isle line 1769. - let expr0_0 = constructor_put_in_gpr(ctx, pattern7_1); - let expr1_0 = constructor_do_clz(ctx, pattern3_0, pattern3_0, expr0_0); - let expr2_0 = constructor_output_gpr(ctx, expr1_0); - return Some(expr2_0); - } - } - } - let pattern4_0 = C::use_bmi1(ctx, pattern2_0); - if pattern4_0 == true { - let pattern6_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Unary { - opcode: ref pattern7_0, - arg: pattern7_1, - } = &pattern6_0 - { - if let &Opcode::Ctz = pattern7_0 { - // Rule at src/isa/x64/lower.isle line 1806. - let expr0_0 = constructor_put_in_gpr(ctx, pattern7_1); - let expr1_0 = constructor_x64_tzcnt(ctx, pattern3_0, expr0_0); - let expr2_0 = constructor_output_gpr(ctx, expr1_0); - return Some(expr2_0); - } - } - } - if pattern4_0 == false { - let pattern6_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Unary { - opcode: ref pattern7_0, - arg: pattern7_1, - } = &pattern6_0 - { - if let &Opcode::Ctz = pattern7_0 { - // Rule at src/isa/x64/lower.isle line 1813. - let expr0_0 = constructor_put_in_gpr(ctx, pattern7_1); - let expr1_0 = constructor_do_ctz(ctx, pattern3_0, pattern3_0, expr0_0); - let expr2_0 = constructor_output_gpr(ctx, expr1_0); - return Some(expr2_0); - } - } - } - } - if let Some(pattern3_0) = C::ty_8_or_16(ctx, pattern2_0) { - let pattern4_0 = C::use_popcnt(ctx, pattern2_0); - if pattern4_0 == true { - let pattern6_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Unary { - opcode: ref pattern7_0, - arg: pattern7_1, - } = &pattern6_0 - { - if let &Opcode::Popcnt = pattern7_0 { - // Rule at src/isa/x64/lower.isle line 1851. - let expr0_0: Type = I32; - let expr1_0: Type = I32; - let expr2_0 = ExtendKind::Zero; - let expr3_0 = constructor_extend_to_gpr(ctx, pattern7_1, expr1_0, &expr2_0); - let expr4_0 = constructor_x64_popcnt(ctx, expr0_0, expr3_0); - let expr5_0 = constructor_output_gpr(ctx, expr4_0); - return Some(expr5_0); - } - } - } - } - if let Some(pattern3_0) = C::ty_scalar_float(ctx, pattern2_0) { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::BinaryImm8 { - opcode: ref pattern5_0, - arg: pattern5_1, - imm: pattern5_2, - } = &pattern4_0 - { - if let &Opcode::Extractlane = pattern5_0 { - let pattern7_0 = C::u8_from_uimm8(ctx, pattern5_2); - if pattern7_0 == 0i128 as u8 { - // Rule at src/isa/x64/lower.isle line 3561. - let expr0_0 = constructor_output_value(ctx, pattern5_1); - return Some(expr0_0); - } - } - } - } - if let Some(pattern3_0) = C::type_register_class(ctx, pattern2_0) { - if let &RegisterClass::Xmm = &pattern3_0 { - let pattern5_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::LoadNoOffset { - opcode: ref pattern6_0, - arg: pattern6_1, - flags: pattern6_2, - } = &pattern5_0 - { - if let &Opcode::Bitcast = pattern6_0 { - let pattern8_0 = C::value_type(ctx, pattern6_1); - if let Some(pattern9_0) = C::type_register_class(ctx, pattern8_0) { - if let &RegisterClass::Xmm = &pattern9_0 { - // Rule at src/isa/x64/lower.isle line 3337. - let expr0_0 = constructor_output_value(ctx, pattern6_1); - return Some(expr0_0); - } - } - } - } - } - } - let pattern3_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Binary { - opcode: ref pattern4_0, - args: ref pattern4_1, - } = &pattern3_0 - { - match pattern4_0 { - &Opcode::Band => { - let (pattern6_0, pattern6_1) = C::unpack_value_array_2(ctx, pattern4_1); - if let Some(pattern7_0) = C::sinkable_load(ctx, pattern6_0) { - let mut closure8 = || { - let expr0_0 = C::ty_int_ref_scalar_64(ctx, pattern2_0)?; - return Some(expr0_0); - }; - if let Some(pattern8_0) = closure8() { - // Rule at src/isa/x64/lower.isle line 226. - let expr0_0 = constructor_put_in_gpr(ctx, pattern6_1); - let expr1_0 = constructor_sink_load_to_gpr_mem_imm(ctx, &pattern7_0); - let expr2_0 = constructor_x64_and(ctx, pattern2_0, expr0_0, &expr1_0); - let expr3_0 = constructor_output_gpr(ctx, expr2_0); - return Some(expr3_0); - } - } - } - &Opcode::Bor => { - let (pattern6_0, pattern6_1) = C::unpack_value_array_2(ctx, pattern4_1); - if let Some(pattern7_0) = C::sinkable_load(ctx, pattern6_0) { - let mut closure8 = || { - let expr0_0 = C::ty_int_ref_scalar_64(ctx, pattern2_0)?; - return Some(expr0_0); - }; - if let Some(pattern8_0) = closure8() { - // Rule at src/isa/x64/lower.isle line 288. - let expr0_0 = constructor_put_in_gpr(ctx, pattern6_1); - let expr1_0 = constructor_sink_load_to_gpr_mem_imm(ctx, &pattern7_0); - let expr2_0 = constructor_x64_or(ctx, pattern2_0, expr0_0, &expr1_0); - let expr3_0 = constructor_output_gpr(ctx, expr2_0); - return Some(expr3_0); - } - } - } - &Opcode::Bxor => { - let (pattern6_0, pattern6_1) = C::unpack_value_array_2(ctx, pattern4_1); - if let Some(pattern7_0) = C::sinkable_load(ctx, pattern6_0) { - let mut closure8 = || { - let expr0_0 = C::ty_int_ref_scalar_64(ctx, pattern2_0)?; - return Some(expr0_0); - }; - if let Some(pattern8_0) = closure8() { - // Rule at src/isa/x64/lower.isle line 351. - let expr0_0 = constructor_put_in_gpr(ctx, pattern6_1); - let expr1_0 = constructor_sink_load_to_gpr_mem_imm(ctx, &pattern7_0); - let expr2_0 = constructor_x64_xor(ctx, pattern2_0, expr0_0, &expr1_0); - let expr3_0 = constructor_output_gpr(ctx, expr2_0); - return Some(expr3_0); - } - } - } - _ => {} - } - } - let pattern3_0 = C::avx512vl_enabled(ctx, pattern2_0); - if pattern3_0 == true { - let pattern5_0 = C::avx512f_enabled(ctx, pattern2_0); - if pattern5_0 == true { - if pattern2_0 == F32X4 { - let pattern8_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Unary { - opcode: ref pattern9_0, - arg: pattern9_1, - } = &pattern8_0 - { - if let &Opcode::FcvtFromUint = pattern9_0 { - // Rule at src/isa/x64/lower.isle line 3009. - let expr0_0 = C::put_in_xmm_mem(ctx, pattern9_1); - let expr1_0 = constructor_x64_vcvtudq2ps(ctx, &expr0_0); - let expr2_0 = constructor_output_xmm(ctx, expr1_0); - return Some(expr2_0); - } - } - } - } - let pattern5_0 = C::avx512vbmi_enabled(ctx, pattern2_0); - if pattern5_0 == true { - let pattern7_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Shuffle { - opcode: ref pattern8_0, - args: ref pattern8_1, - imm: pattern8_2, - } = &pattern7_0 - { - if let &Opcode::Shuffle = pattern8_0 { - let (pattern10_0, pattern10_1) = C::unpack_value_array_2(ctx, pattern8_1); - if let Some(pattern11_0) = C::vec_mask_from_immediate(ctx, pattern8_2) { - if let Some((pattern12_0, pattern12_1)) = - C::perm_from_mask_with_zeros(ctx, &pattern11_0) - { - // Rule at src/isa/x64/lower.isle line 3521. - let expr0_0: Type = I8X16; - let expr1_0 = - constructor_x64_xmm_load_const(ctx, expr0_0, pattern12_1); - let expr2_0 = constructor_put_in_xmm(ctx, pattern10_1); - let expr3_0 = constructor_put_in_xmm(ctx, pattern10_0); - let expr4_0: Type = I8X16; - let expr5_0 = - constructor_x64_xmm_load_const(ctx, expr4_0, pattern12_0); - let expr6_0 = - constructor_x64_vpermi2b(ctx, expr2_0, expr3_0, expr5_0); - let expr7_0 = C::xmm_to_xmm_mem(ctx, expr6_0); - let expr8_0 = constructor_x64_andps(ctx, expr1_0, &expr7_0); - let expr9_0 = constructor_output_xmm(ctx, expr8_0); - return Some(expr9_0); - } - } - } - } - } - } - } - let pattern1_0 = C::inst_data(ctx, pattern0_0); - match &pattern1_0 { - &InstructionData::Unary { - opcode: ref pattern2_0, - arg: pattern2_1, - } => { - if let &Opcode::ScalarToVector = pattern2_0 { - if let Some(pattern4_0) = C::sinkable_load(ctx, pattern2_1) { - let pattern5_0 = C::value_type(ctx, pattern2_1); - if let Some(pattern6_0) = C::ty_32(ctx, pattern5_0) { - // Rule at src/isa/x64/lower.isle line 3603. - let expr0_0 = constructor_sink_load_to_xmm_mem(ctx, &pattern4_0); - let expr1_0 = constructor_x64_movss_load(ctx, &expr0_0); - let expr2_0 = constructor_output_xmm(ctx, expr1_0); - return Some(expr2_0); - } - } - } - } - &InstructionData::Store { - opcode: ref pattern2_0, - args: ref pattern2_1, - flags: pattern2_2, - offset: pattern2_3, - } => { - if let &Opcode::Store = pattern2_0 { - let (pattern4_0, pattern4_1) = C::unpack_value_array_2(ctx, pattern2_1); - if let Some(pattern5_0) = C::def_inst(ctx, pattern4_0) { - if let Some(pattern6_0) = C::first_result(ctx, pattern5_0) { - let pattern7_0 = C::value_type(ctx, pattern6_0); - if let Some(pattern8_0) = C::ty_32_or_64(ctx, pattern7_0) { - let pattern9_0 = C::inst_data(ctx, pattern5_0); - if let &InstructionData::Binary { - opcode: ref pattern10_0, - args: ref pattern10_1, - } = &pattern9_0 - { - match pattern10_0 { - &Opcode::Iadd => { - let (pattern12_0, pattern12_1) = - C::unpack_value_array_2(ctx, pattern10_1); - if let Some(pattern13_0) = - C::sinkable_load(ctx, pattern12_1) - { - if let Some(pattern14_0) = C::def_inst(ctx, pattern12_1) - { - let pattern15_0 = C::inst_data(ctx, pattern14_0); - if let &InstructionData::Load { - opcode: ref pattern16_0, - arg: pattern16_1, - flags: pattern16_2, - offset: pattern16_3, - } = &pattern15_0 - { - if let &Opcode::Load = pattern16_0 { - if pattern4_1 == pattern16_1 { - if pattern2_2 == pattern16_2 { - if pattern2_3 == pattern16_3 { - // Rule at src/isa/x64/lower.isle line 2674. - let expr0_0 = C::sink_load( - ctx, - &pattern13_0, - ); - let expr1_0 = constructor_reg_mem_to_reg_mem_imm(ctx, &expr0_0); - let expr2_0 = - constructor_to_amode( - ctx, - pattern16_2, - pattern16_1, - pattern16_3, - ); - let expr3_0 = - constructor_put_in_gpr( - ctx, - pattern12_0, - ); - let expr4_0 = - constructor_x64_add_mem( - ctx, pattern8_0, - &expr2_0, expr3_0, - ); - let expr5_0 = - constructor_side_effect( - ctx, &expr4_0, - ); - return Some(expr5_0); - } - } - } - } - } - } - } - } - &Opcode::Isub => { - let (pattern12_0, pattern12_1) = - C::unpack_value_array_2(ctx, pattern10_1); - if let Some(pattern13_0) = - C::sinkable_load(ctx, pattern12_0) - { - if let Some(pattern14_0) = C::def_inst(ctx, pattern12_0) - { - let pattern15_0 = C::inst_data(ctx, pattern14_0); - if let &InstructionData::Load { - opcode: ref pattern16_0, - arg: pattern16_1, - flags: pattern16_2, - offset: pattern16_3, - } = &pattern15_0 - { - if let &Opcode::Load = pattern16_0 { - if pattern4_1 == pattern16_1 { - if pattern2_2 == pattern16_2 { - if pattern2_3 == pattern16_3 { - // Rule at src/isa/x64/lower.isle line 2688. - let expr0_0 = C::sink_load( - ctx, - &pattern13_0, - ); - let expr1_0 = constructor_reg_mem_to_reg_mem_imm(ctx, &expr0_0); - let expr2_0 = - constructor_to_amode( - ctx, - pattern16_2, - pattern16_1, - pattern16_3, - ); - let expr3_0 = - constructor_put_in_gpr( - ctx, - pattern12_1, - ); - let expr4_0 = - constructor_x64_sub_mem( - ctx, pattern8_0, - &expr2_0, expr3_0, - ); - let expr5_0 = - constructor_side_effect( - ctx, &expr4_0, - ); - return Some(expr5_0); - } - } - } - } - } - } - } - } - &Opcode::Band => { - let (pattern12_0, pattern12_1) = - C::unpack_value_array_2(ctx, pattern10_1); - if let Some(pattern13_0) = - C::sinkable_load(ctx, pattern12_1) - { - if let Some(pattern14_0) = C::def_inst(ctx, pattern12_1) - { - let pattern15_0 = C::inst_data(ctx, pattern14_0); - if let &InstructionData::Load { - opcode: ref pattern16_0, - arg: pattern16_1, - flags: pattern16_2, - offset: pattern16_3, - } = &pattern15_0 - { - if let &Opcode::Load = pattern16_0 { - if pattern4_1 == pattern16_1 { - if pattern2_2 == pattern16_2 { - if pattern2_3 == pattern16_3 { - // Rule at src/isa/x64/lower.isle line 2716. - let expr0_0 = C::sink_load( - ctx, - &pattern13_0, - ); - let expr1_0 = constructor_reg_mem_to_reg_mem_imm(ctx, &expr0_0); - let expr2_0 = - constructor_to_amode( - ctx, - pattern16_2, - pattern16_1, - pattern16_3, - ); - let expr3_0 = - constructor_put_in_gpr( - ctx, - pattern12_0, - ); - let expr4_0 = - constructor_x64_and_mem( - ctx, pattern8_0, - &expr2_0, expr3_0, - ); - let expr5_0 = - constructor_side_effect( - ctx, &expr4_0, - ); - return Some(expr5_0); - } - } - } - } - } - } - } - } - &Opcode::Bor => { - let (pattern12_0, pattern12_1) = - C::unpack_value_array_2(ctx, pattern10_1); - if let Some(pattern13_0) = - C::sinkable_load(ctx, pattern12_1) - { - if let Some(pattern14_0) = C::def_inst(ctx, pattern12_1) - { - let pattern15_0 = C::inst_data(ctx, pattern14_0); - if let &InstructionData::Load { - opcode: ref pattern16_0, - arg: pattern16_1, - flags: pattern16_2, - offset: pattern16_3, - } = &pattern15_0 - { - if let &Opcode::Load = pattern16_0 { - if pattern4_1 == pattern16_1 { - if pattern2_2 == pattern16_2 { - if pattern2_3 == pattern16_3 { - // Rule at src/isa/x64/lower.isle line 2744. - let expr0_0 = C::sink_load( - ctx, - &pattern13_0, - ); - let expr1_0 = constructor_reg_mem_to_reg_mem_imm(ctx, &expr0_0); - let expr2_0 = - constructor_to_amode( - ctx, - pattern16_2, - pattern16_1, - pattern16_3, - ); - let expr3_0 = - constructor_put_in_gpr( - ctx, - pattern12_0, - ); - let expr4_0 = - constructor_x64_or_mem( - ctx, pattern8_0, - &expr2_0, expr3_0, - ); - let expr5_0 = - constructor_side_effect( - ctx, &expr4_0, - ); - return Some(expr5_0); - } - } - } - } - } - } - } - } - &Opcode::Bxor => { - let (pattern12_0, pattern12_1) = - C::unpack_value_array_2(ctx, pattern10_1); - if let Some(pattern13_0) = - C::sinkable_load(ctx, pattern12_1) - { - if let Some(pattern14_0) = C::def_inst(ctx, pattern12_1) - { - let pattern15_0 = C::inst_data(ctx, pattern14_0); - if let &InstructionData::Load { - opcode: ref pattern16_0, - arg: pattern16_1, - flags: pattern16_2, - offset: pattern16_3, - } = &pattern15_0 - { - if let &Opcode::Load = pattern16_0 { - if pattern4_1 == pattern16_1 { - if pattern2_2 == pattern16_2 { - if pattern2_3 == pattern16_3 { - // Rule at src/isa/x64/lower.isle line 2772. - let expr0_0 = C::sink_load( - ctx, - &pattern13_0, - ); - let expr1_0 = constructor_reg_mem_to_reg_mem_imm(ctx, &expr0_0); - let expr2_0 = - constructor_to_amode( - ctx, - pattern16_2, - pattern16_1, - pattern16_3, - ); - let expr3_0 = - constructor_put_in_gpr( - ctx, - pattern12_0, - ); - let expr4_0 = - constructor_x64_xor_mem( - ctx, pattern8_0, - &expr2_0, expr3_0, - ); - let expr5_0 = - constructor_side_effect( - ctx, &expr4_0, - ); - return Some(expr5_0); - } - } - } - } - } - } - } - } - _ => {} - } - } - } - } - } - } - } - _ => {} - } - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::first_result(ctx, pattern0_0) { - let pattern2_0 = C::value_type(ctx, pattern1_0); - if pattern2_0 == I64 { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::LoadNoOffset { - opcode: ref pattern5_0, - arg: pattern5_1, - flags: pattern5_2, - } = &pattern4_0 - { - if let &Opcode::AtomicLoad = pattern5_0 { - // Rule at src/isa/x64/lower.isle line 2809. - let expr0_0 = C::zero_offset(ctx); - let expr1_0 = constructor_to_amode(ctx, pattern5_2, pattern5_1, expr0_0); - let expr2_0 = constructor_x64_mov(ctx, &expr1_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - } - } - if pattern2_0 == I128 { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - match &pattern4_0 { - &InstructionData::UnaryImm { - opcode: ref pattern5_0, - imm: pattern5_1, - } => { - if let &Opcode::Iconst = pattern5_0 { - let pattern7_0 = C::u64_from_imm64(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 20. - let expr0_0: Type = I64; - let expr1_0 = constructor_imm(ctx, expr0_0, pattern7_0); - let expr2_0: Type = I64; - let expr3_0: u64 = 0i128 as u64; - let expr4_0 = constructor_imm(ctx, expr2_0, expr3_0); - let expr5_0 = C::value_regs(ctx, expr1_0, expr4_0); - let expr6_0 = C::output(ctx, expr5_0); - return Some(expr6_0); - } - } - &InstructionData::Binary { - opcode: ref pattern5_0, - args: ref pattern5_1, - } => { - match pattern5_0 { - &Opcode::Iadd => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 92. - let expr0_0 = C::put_in_regs(ctx, pattern7_0); - let expr1_0: usize = 0i128 as usize; - let expr2_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr1_0); - let expr3_0: usize = 1i128 as usize; - let expr4_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr3_0); - let expr5_0 = C::put_in_regs(ctx, pattern7_1); - let expr6_0: usize = 0i128 as usize; - let expr7_0 = constructor_value_regs_get_gpr(ctx, expr5_0, expr6_0); - let expr8_0: usize = 1i128 as usize; - let expr9_0 = constructor_value_regs_get_gpr(ctx, expr5_0, expr8_0); - let expr10_0: Type = I64; - let expr11_0 = C::gpr_to_gpr_mem_imm(ctx, expr7_0); - let expr12_0 = constructor_x64_add_with_flags_paired( - ctx, expr10_0, expr2_0, &expr11_0, - ); - let expr13_0: Type = I64; - let expr14_0 = C::gpr_to_gpr_mem_imm(ctx, expr9_0); - let expr15_0 = - constructor_x64_adc_paired(ctx, expr13_0, expr4_0, &expr14_0); - let expr16_0 = constructor_with_flags(ctx, &expr12_0, &expr15_0); - let expr17_0 = C::output(ctx, expr16_0); - return Some(expr17_0); - } - &Opcode::Isub => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 177. - let expr0_0 = C::put_in_regs(ctx, pattern7_0); - let expr1_0: usize = 0i128 as usize; - let expr2_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr1_0); - let expr3_0: usize = 1i128 as usize; - let expr4_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr3_0); - let expr5_0 = C::put_in_regs(ctx, pattern7_1); - let expr6_0: usize = 0i128 as usize; - let expr7_0 = constructor_value_regs_get_gpr(ctx, expr5_0, expr6_0); - let expr8_0: usize = 1i128 as usize; - let expr9_0 = constructor_value_regs_get_gpr(ctx, expr5_0, expr8_0); - let expr10_0: Type = I64; - let expr11_0 = C::gpr_to_gpr_mem_imm(ctx, expr7_0); - let expr12_0 = constructor_x64_sub_with_flags_paired( - ctx, expr10_0, expr2_0, &expr11_0, - ); - let expr13_0: Type = I64; - let expr14_0 = C::gpr_to_gpr_mem_imm(ctx, expr9_0); - let expr15_0 = - constructor_x64_sbb_paired(ctx, expr13_0, expr4_0, &expr14_0); - let expr16_0 = constructor_with_flags(ctx, &expr12_0, &expr15_0); - let expr17_0 = C::output(ctx, expr16_0); - return Some(expr17_0); - } - _ => {} - } - } - _ => {} - } - let pattern4_0 = C::use_popcnt(ctx, pattern2_0); - if pattern4_0 == true { - let pattern6_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Unary { - opcode: ref pattern7_0, - arg: pattern7_1, - } = &pattern6_0 - { - if let &Opcode::Popcnt = pattern7_0 { - // Rule at src/isa/x64/lower.isle line 1858. - let expr0_0: Type = I64; - let expr1_0 = C::put_in_regs(ctx, pattern7_1); - let expr2_0: usize = 0i128 as usize; - let expr3_0 = constructor_value_regs_get_gpr(ctx, expr1_0, expr2_0); - let expr4_0 = constructor_x64_popcnt(ctx, expr0_0, expr3_0); - let expr5_0: Type = I64; - let expr6_0 = C::put_in_regs(ctx, pattern7_1); - let expr7_0: usize = 1i128 as usize; - let expr8_0 = constructor_value_regs_get_gpr(ctx, expr6_0, expr7_0); - let expr9_0 = constructor_x64_popcnt(ctx, expr5_0, expr8_0); - let expr10_0: Type = I64; - let expr11_0 = C::gpr_to_gpr_mem_imm(ctx, expr9_0); - let expr12_0 = constructor_x64_add(ctx, expr10_0, expr4_0, &expr11_0); - let expr13_0 = C::gpr_to_reg(ctx, expr12_0); - let expr14_0: Type = I64; - let expr15_0: u64 = 0i128 as u64; - let expr16_0 = constructor_imm(ctx, expr14_0, expr15_0); - let expr17_0 = C::value_regs(ctx, expr13_0, expr16_0); - let expr18_0 = C::output(ctx, expr17_0); - return Some(expr18_0); - } - } - } - } - if pattern2_0 == F32 { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - match &pattern4_0 { - &InstructionData::Unary { - opcode: ref pattern5_0, - arg: pattern5_1, - } => { - match pattern5_0 { - &Opcode::FcvtFromUint => { - let pattern7_0 = C::value_type(ctx, pattern5_1); - if let Some(pattern8_0) = C::fits_in_32(ctx, pattern7_0) { - if let Some(pattern9_0) = C::ty_int(ctx, pattern8_0) { - // Rule at src/isa/x64/lower.isle line 2988. - let expr0_0: Type = I64; - let expr1_0: Type = I64; - let expr2_0 = ExtendKind::Zero; - let expr3_0 = constructor_extend_to_gpr( - ctx, pattern5_1, expr1_0, &expr2_0, - ); - let expr4_0 = C::gpr_to_gpr_mem(ctx, expr3_0); - let expr5_0 = constructor_x64_cvtsi2ss(ctx, expr0_0, &expr4_0); - let expr6_0 = constructor_output_xmm(ctx, expr5_0); - return Some(expr6_0); - } - } - } - &Opcode::FcvtFromSint => { - let pattern7_0 = C::value_type(ctx, pattern5_1); - if let Some(pattern8_0) = C::ty_int(ctx, pattern7_0) { - if let Some(pattern9_0) = C::fits_in_64(ctx, pattern8_0) { - // Rule at src/isa/x64/lower.isle line 2966. - let expr0_0 = constructor_put_in_gpr_mem(ctx, pattern5_1); - let expr1_0 = - constructor_x64_cvtsi2ss(ctx, pattern9_0, &expr0_0); - let expr2_0 = constructor_output_xmm(ctx, expr1_0); - return Some(expr2_0); - } - } - } - _ => {} - } - } - &InstructionData::BinaryImm8 { - opcode: ref pattern5_0, - arg: pattern5_1, - imm: pattern5_2, - } => { - if let &Opcode::Extractlane = pattern5_0 { - let pattern7_0 = C::value_type(ctx, pattern5_1); - if let Some(pattern8_0) = C::ty_vec128(ctx, pattern7_0) { - let pattern9_0 = C::u8_from_uimm8(ctx, pattern5_2); - // Rule at src/isa/x64/lower.isle line 3565. - let expr0_0 = C::put_in_xmm_mem(ctx, pattern5_1); - let expr1_0 = OperandSize::Size32; - let expr2_0 = - constructor_x64_pshufd(ctx, &expr0_0, pattern9_0, &expr1_0); - let expr3_0 = constructor_output_xmm(ctx, expr2_0); - return Some(expr3_0); - } - } - } - _ => {} - } - } - if pattern2_0 == F64 { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - match &pattern4_0 { - &InstructionData::Unary { - opcode: ref pattern5_0, - arg: pattern5_1, - } => { - match pattern5_0 { - &Opcode::FcvtFromUint => { - let pattern7_0 = C::value_type(ctx, pattern5_1); - if let Some(pattern8_0) = C::fits_in_32(ctx, pattern7_0) { - if let Some(pattern9_0) = C::ty_int(ctx, pattern8_0) { - // Rule at src/isa/x64/lower.isle line 2991. - let expr0_0: Type = I64; - let expr1_0: Type = I64; - let expr2_0 = ExtendKind::Zero; - let expr3_0 = constructor_extend_to_gpr( - ctx, pattern5_1, expr1_0, &expr2_0, - ); - let expr4_0 = C::gpr_to_gpr_mem(ctx, expr3_0); - let expr5_0 = constructor_x64_cvtsi2sd(ctx, expr0_0, &expr4_0); - let expr6_0 = constructor_output_xmm(ctx, expr5_0); - return Some(expr6_0); - } - } - } - &Opcode::FcvtFromSint => { - let pattern7_0 = C::value_type(ctx, pattern5_1); - if let Some(pattern8_0) = C::ty_int(ctx, pattern7_0) { - if let Some(pattern9_0) = C::fits_in_64(ctx, pattern8_0) { - // Rule at src/isa/x64/lower.isle line 2975. - let expr0_0 = constructor_put_in_gpr_mem(ctx, pattern5_1); - let expr1_0 = - constructor_x64_cvtsi2sd(ctx, pattern9_0, &expr0_0); - let expr2_0 = constructor_output_xmm(ctx, expr1_0); - return Some(expr2_0); - } - } - } - _ => {} - } - } - &InstructionData::BinaryImm8 { - opcode: ref pattern5_0, - arg: pattern5_1, - imm: pattern5_2, - } => { - if let &Opcode::Extractlane = pattern5_0 { - let pattern7_0 = C::value_type(ctx, pattern5_1); - if let Some(pattern8_0) = C::ty_vec128(ctx, pattern7_0) { - let pattern9_0 = C::u8_from_uimm8(ctx, pattern5_2); - if pattern9_0 == 1i128 as u8 { - // Rule at src/isa/x64/lower.isle line 3570. - let expr0_0 = C::put_in_xmm_mem(ctx, pattern5_1); - let expr1_0: u8 = 238i128 as u8; - let expr2_0 = OperandSize::Size32; - let expr3_0 = - constructor_x64_pshufd(ctx, &expr0_0, expr1_0, &expr2_0); - let expr4_0 = constructor_output_xmm(ctx, expr3_0); - return Some(expr4_0); - } - } - } - } - _ => {} - } - } - if pattern2_0 == I8X16 { - let pattern4_0 = C::avx512vl_enabled(ctx, pattern2_0); - if pattern4_0 == true { - let pattern6_0 = C::avx512bitalg_enabled(ctx, pattern2_0); - if pattern6_0 == true { - let pattern8_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Unary { - opcode: ref pattern9_0, - arg: pattern9_1, - } = &pattern8_0 - { - if let &Opcode::Popcnt = pattern9_0 { - // Rule at src/isa/x64/lower.isle line 1950. - let expr0_0 = C::put_in_xmm_mem(ctx, pattern9_1); - let expr1_0 = constructor_x64_vpopcntb(ctx, &expr0_0); - let expr2_0 = constructor_output_xmm(ctx, expr1_0); - return Some(expr2_0); - } - } - } - } - } - if pattern2_0 == I32X4 { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Unary { - opcode: ref pattern5_0, - arg: pattern5_1, - } = &pattern4_0 - { - match pattern5_0 { - &Opcode::FcvtToUintSat => { - let pattern7_0 = C::value_type(ctx, pattern5_1); - if pattern7_0 == F32X4 { - // Rule at src/isa/x64/lower.isle line 3144. - let expr0_0 = constructor_put_in_xmm(ctx, pattern5_1); - let expr1_0 = C::xmm_to_xmm_mem(ctx, expr0_0); - let expr2_0 = constructor_x64_pxor(ctx, expr0_0, &expr1_0); - let expr3_0 = constructor_x64_maxps(ctx, expr0_0, expr2_0); - let expr4_0 = C::xmm_to_xmm_mem(ctx, expr2_0); - let expr5_0 = constructor_x64_pcmpeqd(ctx, expr2_0, &expr4_0); - let expr6_0: u32 = 1i128 as u32; - let expr7_0 = RegMemImm::Imm { simm32: expr6_0 }; - let expr8_0 = constructor_mov_rmi_to_xmm(ctx, &expr7_0); - let expr9_0 = constructor_x64_psrld(ctx, expr5_0, &expr8_0); - let expr10_0 = constructor_x64_cvtdq2ps(ctx, expr9_0); - let expr11_0: Type = F32X4; - let expr12_0 = C::xmm_to_xmm_mem(ctx, expr3_0); - let expr13_0 = constructor_x64_cvttps2dq(ctx, expr11_0, &expr12_0); - let expr14_0 = C::xmm_to_xmm_mem(ctx, expr10_0); - let expr15_0 = constructor_x64_subps(ctx, expr3_0, &expr14_0); - let expr16_0 = C::xmm_to_xmm_mem(ctx, expr15_0); - let expr17_0 = FcmpImm::LessThanOrEqual; - let expr18_0 = - constructor_x64_cmpps(ctx, expr10_0, &expr16_0, &expr17_0); - let expr19_0: Type = F32X4; - let expr20_0 = C::xmm_to_xmm_mem(ctx, expr15_0); - let expr21_0 = constructor_x64_cvttps2dq(ctx, expr19_0, &expr20_0); - let expr22_0 = C::xmm_to_xmm_mem(ctx, expr18_0); - let expr23_0 = constructor_x64_pxor(ctx, expr21_0, &expr22_0); - let expr24_0 = C::xmm_to_xmm_mem(ctx, expr18_0); - let expr25_0 = constructor_x64_pxor(ctx, expr18_0, &expr24_0); - let expr26_0 = C::xmm_to_xmm_mem(ctx, expr25_0); - let expr27_0 = constructor_x64_pmaxsd(ctx, expr23_0, &expr26_0); - let expr28_0 = C::xmm_to_xmm_mem(ctx, expr13_0); - let expr29_0 = constructor_x64_paddd(ctx, expr27_0, &expr28_0); - let expr30_0 = constructor_output_xmm(ctx, expr29_0); - return Some(expr30_0); - } - } - &Opcode::FcvtToSintSat => { - let pattern7_0 = C::value_type(ctx, pattern5_1); - if pattern7_0 == F32X4 { - // Rule at src/isa/x64/lower.isle line 3073. - let expr0_0 = constructor_put_in_xmm(ctx, pattern5_1); - let expr1_0 = C::xmm_to_xmm_mem(ctx, expr0_0); - let expr2_0 = FcmpImm::Equal; - let expr3_0 = constructor_x64_cmpps(ctx, expr0_0, &expr1_0, &expr2_0); - let expr4_0 = C::xmm_to_xmm_mem(ctx, expr3_0); - let expr5_0 = constructor_x64_andps(ctx, expr0_0, &expr4_0); - let expr6_0 = C::xmm_to_xmm_mem(ctx, expr5_0); - let expr7_0 = constructor_x64_pxor(ctx, expr3_0, &expr6_0); - let expr8_0: Type = F32X4; - let expr9_0 = C::xmm_to_xmm_mem(ctx, expr5_0); - let expr10_0 = constructor_x64_cvttps2dq(ctx, expr8_0, &expr9_0); - let expr11_0 = C::xmm_to_xmm_mem(ctx, expr7_0); - let expr12_0 = constructor_x64_pand(ctx, expr10_0, &expr11_0); - let expr13_0: u32 = 31i128 as u32; - let expr14_0 = RegMemImm::Imm { simm32: expr13_0 }; - let expr15_0 = constructor_mov_rmi_to_xmm(ctx, &expr14_0); - let expr16_0 = constructor_x64_psrad(ctx, expr12_0, &expr15_0); - let expr17_0 = C::xmm_to_xmm_mem(ctx, expr10_0); - let expr18_0 = constructor_x64_pxor(ctx, expr16_0, &expr17_0); - let expr19_0 = constructor_output_xmm(ctx, expr18_0); - return Some(expr19_0); - } - } - _ => {} - } - } - } - if pattern2_0 == F32X4 { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Unary { - opcode: ref pattern5_0, - arg: pattern5_1, - } = &pattern4_0 - { - if let &Opcode::FcvtFromUint = pattern5_0 { - // Rule at src/isa/x64/lower.isle line 3036. - let expr0_0 = constructor_put_in_xmm(ctx, pattern5_1); - let expr1_0: u32 = 16i128 as u32; - let expr2_0 = RegMemImm::Imm { simm32: expr1_0 }; - let expr3_0 = constructor_mov_rmi_to_xmm(ctx, &expr2_0); - let expr4_0 = constructor_x64_pslld(ctx, expr0_0, &expr3_0); - let expr5_0: u32 = 16i128 as u32; - let expr6_0 = RegMemImm::Imm { simm32: expr5_0 }; - let expr7_0 = constructor_mov_rmi_to_xmm(ctx, &expr6_0); - let expr8_0 = constructor_x64_psrld(ctx, expr4_0, &expr7_0); - let expr9_0 = C::xmm_to_xmm_mem(ctx, expr8_0); - let expr10_0 = constructor_x64_psubd(ctx, expr0_0, &expr9_0); - let expr11_0 = constructor_x64_cvtdq2ps(ctx, expr8_0); - let expr12_0: u32 = 1i128 as u32; - let expr13_0 = RegMemImm::Imm { simm32: expr12_0 }; - let expr14_0 = constructor_mov_rmi_to_xmm(ctx, &expr13_0); - let expr15_0 = constructor_x64_psrld(ctx, expr10_0, &expr14_0); - let expr16_0 = constructor_x64_cvtdq2ps(ctx, expr15_0); - let expr17_0 = C::xmm_to_xmm_mem(ctx, expr16_0); - let expr18_0 = constructor_x64_addps(ctx, expr16_0, &expr17_0); - let expr19_0 = C::xmm_to_xmm_mem(ctx, expr11_0); - let expr20_0 = constructor_x64_addps(ctx, expr18_0, &expr19_0); - let expr21_0 = constructor_output_xmm(ctx, expr20_0); - return Some(expr21_0); - } - } - } - if pattern2_0 == F64X2 { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Unary { - opcode: ref pattern5_0, - arg: pattern5_1, - } = &pattern4_0 - { - if let &Opcode::FcvtFromUint = pattern5_0 { - if let Some(pattern7_0) = C::def_inst(ctx, pattern5_1) { - let pattern8_0 = C::inst_data(ctx, pattern7_0); - if let &InstructionData::Unary { - opcode: ref pattern9_0, - arg: pattern9_1, - } = &pattern8_0 - { - if let &Opcode::UwidenLow = pattern9_0 { - let pattern11_0 = C::value_type(ctx, pattern9_1); - if pattern11_0 == I32X4 { - // Rule at src/isa/x64/lower.isle line 3001. - let expr0_0: Type = I32X4; - let expr1_0 = C::fcvt_uint_mask_const(ctx); - let expr2_0 = - constructor_x64_xmm_load_const(ctx, expr0_0, expr1_0); - let expr3_0 = constructor_put_in_xmm(ctx, pattern9_1); - let expr4_0 = C::xmm_to_xmm_mem(ctx, expr2_0); - let expr5_0 = constructor_x64_unpcklps(ctx, expr3_0, &expr4_0); - let expr6_0: Type = I32X4; - let expr7_0 = C::fcvt_uint_mask_high_const(ctx); - let expr8_0 = - constructor_x64_xmm_load_const(ctx, expr6_0, expr7_0); - let expr9_0 = C::xmm_to_xmm_mem(ctx, expr8_0); - let expr10_0 = constructor_x64_subpd(ctx, expr5_0, &expr9_0); - let expr11_0 = constructor_output_xmm(ctx, expr10_0); - return Some(expr11_0); - } - } - } - } - } - } - } - if let Some((pattern3_0, pattern3_1)) = C::multi_lane(ctx, pattern2_0) { - if pattern3_0 == 16i128 as u32 { - if pattern3_1 == 8i128 as u32 { - let pattern6_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Binary { - opcode: ref pattern7_0, - args: ref pattern7_1, - } = &pattern6_0 - { - if let &Opcode::Imul = pattern7_0 { - let (pattern9_0, pattern9_1) = C::unpack_value_array_2(ctx, pattern7_1); - if let Some(pattern10_0) = C::def_inst(ctx, pattern9_0) { - let pattern11_0 = C::inst_data(ctx, pattern10_0); - if let &InstructionData::Unary { - opcode: ref pattern12_0, - arg: pattern12_1, - } = &pattern11_0 - { - match pattern12_0 { - &Opcode::SwidenLow => { - let pattern14_0 = C::value_type(ctx, pattern12_1); - if let Some((pattern15_0, pattern15_1)) = - C::multi_lane(ctx, pattern14_0) - { - if pattern15_0 == 8i128 as u32 { - if pattern15_1 == 16i128 as u32 { - if let Some(pattern18_0) = - C::def_inst(ctx, pattern9_1) - { - let pattern19_0 = - C::inst_data(ctx, pattern18_0); - if let &InstructionData::Unary { - opcode: ref pattern20_0, - arg: pattern20_1, - } = &pattern19_0 - { - if let &Opcode::SwidenLow = - pattern20_0 - { - let pattern22_0 = C::value_type( - ctx, - pattern20_1, - ); - if let Some(( - pattern23_0, - pattern23_1, - )) = C::multi_lane( - ctx, - pattern22_0, - ) { - if pattern23_0 - == 8i128 as u32 - { - if pattern23_1 - == 16i128 as u32 - { - // Rule at src/isa/x64/lower.isle line 977. - let expr0_0 = C::put_in_xmm_mem(ctx, pattern12_1); - let expr1_0 = constructor_x64_pmovsxbw(ctx, &expr0_0); - let expr2_0 = C::put_in_xmm_mem(ctx, pattern20_1); - let expr3_0 = constructor_x64_pmovsxbw(ctx, &expr2_0); - let expr4_0 = C::xmm_to_xmm_mem(ctx, expr3_0); - let expr5_0 = constructor_x64_pmullw(ctx, expr1_0, &expr4_0); - let expr6_0 = constructor_output_xmm(ctx, expr5_0); - return Some( - expr6_0, - ); - } - } - } - } - } - } - } - } - } - } - &Opcode::SwidenHigh => { - let pattern14_0 = C::value_type(ctx, pattern12_1); - if let Some((pattern15_0, pattern15_1)) = - C::multi_lane(ctx, pattern14_0) - { - if pattern15_0 == 8i128 as u32 { - if pattern15_1 == 16i128 as u32 { - if let Some(pattern18_0) = - C::def_inst(ctx, pattern9_1) - { - let pattern19_0 = - C::inst_data(ctx, pattern18_0); - if let &InstructionData::Unary { - opcode: ref pattern20_0, - arg: pattern20_1, - } = &pattern19_0 - { - if let &Opcode::SwidenHigh = - pattern20_0 - { - let pattern22_0 = C::value_type( - ctx, - pattern20_1, - ); - if let Some(( - pattern23_0, - pattern23_1, - )) = C::multi_lane( - ctx, - pattern22_0, - ) { - if pattern23_0 - == 8i128 as u32 - { - if pattern23_1 - == 16i128 as u32 - { - // Rule at src/isa/x64/lower.isle line 937. - let expr0_0 = constructor_put_in_xmm(ctx, pattern12_1); - let expr1_0 = C::xmm_to_xmm_mem(ctx, expr0_0); - let expr2_0: u8 = - 8i128 as u8; - let expr3_0 = OperandSize::Size32; - let expr4_0 = constructor_x64_palignr(ctx, expr0_0, &expr1_0, expr2_0, &expr3_0); - let expr5_0 = C::xmm_to_xmm_mem(ctx, expr4_0); - let expr6_0 = constructor_x64_pmovsxbw(ctx, &expr5_0); - let expr7_0 = constructor_put_in_xmm(ctx, pattern20_1); - let expr8_0 = C::xmm_to_xmm_mem(ctx, expr7_0); - let expr9_0: u8 = - 8i128 as u8; - let expr10_0 = OperandSize::Size32; - let expr11_0 = constructor_x64_palignr(ctx, expr7_0, &expr8_0, expr9_0, &expr10_0); - let expr12_0 = C::xmm_to_xmm_mem(ctx, expr11_0); - let expr13_0 = constructor_x64_pmovsxbw(ctx, &expr12_0); - let expr14_0 = C::xmm_to_xmm_mem(ctx, expr13_0); - let expr15_0 = constructor_x64_pmullw(ctx, expr6_0, &expr14_0); - let expr16_0 = constructor_output_xmm(ctx, expr15_0); - return Some( - expr16_0, - ); - } - } - } - } - } - } - } - } - } - } - &Opcode::UwidenLow => { - let pattern14_0 = C::value_type(ctx, pattern12_1); - if let Some((pattern15_0, pattern15_1)) = - C::multi_lane(ctx, pattern14_0) - { - if pattern15_0 == 8i128 as u32 { - if pattern15_1 == 16i128 as u32 { - if let Some(pattern18_0) = - C::def_inst(ctx, pattern9_1) - { - let pattern19_0 = - C::inst_data(ctx, pattern18_0); - if let &InstructionData::Unary { - opcode: ref pattern20_0, - arg: pattern20_1, - } = &pattern19_0 - { - if let &Opcode::UwidenLow = - pattern20_0 - { - let pattern22_0 = C::value_type( - ctx, - pattern20_1, - ); - if let Some(( - pattern23_0, - pattern23_1, - )) = C::multi_lane( - ctx, - pattern22_0, - ) { - if pattern23_0 - == 8i128 as u32 - { - if pattern23_1 - == 16i128 as u32 - { - // Rule at src/isa/x64/lower.isle line 1053. - let expr0_0 = C::put_in_xmm_mem(ctx, pattern12_1); - let expr1_0 = constructor_x64_pmovzxbw(ctx, &expr0_0); - let expr2_0 = C::put_in_xmm_mem(ctx, pattern20_1); - let expr3_0 = constructor_x64_pmovzxbw(ctx, &expr2_0); - let expr4_0 = C::xmm_to_xmm_mem(ctx, expr3_0); - let expr5_0 = constructor_x64_pmullw(ctx, expr1_0, &expr4_0); - let expr6_0 = constructor_output_xmm(ctx, expr5_0); - return Some( - expr6_0, - ); - } - } - } - } - } - } - } - } - } - } - &Opcode::UwidenHigh => { - let pattern14_0 = C::value_type(ctx, pattern12_1); - if let Some((pattern15_0, pattern15_1)) = - C::multi_lane(ctx, pattern14_0) - { - if pattern15_0 == 8i128 as u32 { - if pattern15_1 == 16i128 as u32 { - if let Some(pattern18_0) = - C::def_inst(ctx, pattern9_1) - { - let pattern19_0 = - C::inst_data(ctx, pattern18_0); - if let &InstructionData::Unary { - opcode: ref pattern20_0, - arg: pattern20_1, - } = &pattern19_0 - { - if let &Opcode::UwidenHigh = - pattern20_0 - { - let pattern22_0 = C::value_type( - ctx, - pattern20_1, - ); - if let Some(( - pattern23_0, - pattern23_1, - )) = C::multi_lane( - ctx, - pattern22_0, - ) { - if pattern23_0 - == 8i128 as u32 - { - if pattern23_1 - == 16i128 as u32 - { - // Rule at src/isa/x64/lower.isle line 1013. - let expr0_0 = constructor_put_in_xmm(ctx, pattern12_1); - let expr1_0 = C::xmm_to_xmm_mem(ctx, expr0_0); - let expr2_0: u8 = - 8i128 as u8; - let expr3_0 = OperandSize::Size32; - let expr4_0 = constructor_x64_palignr(ctx, expr0_0, &expr1_0, expr2_0, &expr3_0); - let expr5_0 = C::xmm_to_xmm_mem(ctx, expr4_0); - let expr6_0 = constructor_x64_pmovzxbw(ctx, &expr5_0); - let expr7_0 = constructor_put_in_xmm(ctx, pattern20_1); - let expr8_0 = C::xmm_to_xmm_mem(ctx, expr7_0); - let expr9_0: u8 = - 8i128 as u8; - let expr10_0 = OperandSize::Size32; - let expr11_0 = constructor_x64_palignr(ctx, expr7_0, &expr8_0, expr9_0, &expr10_0); - let expr12_0 = C::xmm_to_xmm_mem(ctx, expr11_0); - let expr13_0 = constructor_x64_pmovzxbw(ctx, &expr12_0); - let expr14_0 = C::xmm_to_xmm_mem(ctx, expr13_0); - let expr15_0 = constructor_x64_pmullw(ctx, expr6_0, &expr14_0); - let expr16_0 = constructor_output_xmm(ctx, expr15_0); - return Some( - expr16_0, - ); - } - } - } - } - } - } - } - } - } - } - _ => {} - } - } - } - } - } - } - } - if pattern3_0 == 32i128 as u32 { - if pattern3_1 == 4i128 as u32 { - let pattern6_0 = C::inst_data(ctx, pattern0_0); - match &pattern6_0 { - &InstructionData::Unary { - opcode: ref pattern7_0, - arg: pattern7_1, - } => { - if let &Opcode::Splat = pattern7_0 { - let pattern9_0 = C::value_type(ctx, pattern7_1); - if let Some(pattern10_0) = C::ty_scalar_float(ctx, pattern9_0) { - // Rule at src/isa/x64/lower.isle line 3625. - let expr0_0: Type = F32X4; - let expr1_0 = - constructor_lower_splat_32x4(ctx, expr0_0, pattern7_1); - let expr2_0 = constructor_output_xmm(ctx, expr1_0); - return Some(expr2_0); - } - } - } - &InstructionData::Binary { - opcode: ref pattern7_0, - args: ref pattern7_1, - } => { - if let &Opcode::Imul = pattern7_0 { - let (pattern9_0, pattern9_1) = - C::unpack_value_array_2(ctx, pattern7_1); - if let Some(pattern10_0) = C::def_inst(ctx, pattern9_0) { - let pattern11_0 = C::inst_data(ctx, pattern10_0); - if let &InstructionData::Unary { - opcode: ref pattern12_0, - arg: pattern12_1, - } = &pattern11_0 - { - match pattern12_0 { - &Opcode::SwidenLow => { - let pattern14_0 = C::value_type(ctx, pattern12_1); - if let Some((pattern15_0, pattern15_1)) = - C::multi_lane(ctx, pattern14_0) - { - if pattern15_0 == 16i128 as u32 { - if pattern15_1 == 8i128 as u32 { - if let Some(pattern18_0) = - C::def_inst(ctx, pattern9_1) - { - let pattern19_0 = - C::inst_data(ctx, pattern18_0); - if let &InstructionData::Unary { - opcode: ref pattern20_0, - arg: pattern20_1, - } = &pattern19_0 - { - if let &Opcode::SwidenLow = - pattern20_0 - { - let pattern22_0 = - C::value_type( - ctx, - pattern20_1, - ); - if let Some(( - pattern23_0, - pattern23_1, - )) = C::multi_lane( - ctx, - pattern22_0, - ) { - if pattern23_0 - == 16i128 as u32 - { - if pattern23_1 - == 8i128 as u32 - { - // Rule at src/isa/x64/lower.isle line 987. - let expr0_0 = constructor_put_in_xmm(ctx, pattern12_1); - let expr1_0 = constructor_put_in_xmm(ctx, pattern20_1); - let expr2_0 = C::xmm_to_xmm_mem(ctx, expr1_0); - let expr3_0 = constructor_x64_pmullw(ctx, expr0_0, &expr2_0); - let expr4_0 = C::xmm_to_xmm_mem(ctx, expr1_0); - let expr5_0 = constructor_x64_pmulhw(ctx, expr0_0, &expr4_0); - let expr6_0 = C::xmm_to_xmm_mem(ctx, expr5_0); - let expr7_0 = constructor_x64_punpcklwd(ctx, expr3_0, &expr6_0); - let expr8_0 = constructor_output_xmm(ctx, expr7_0); - return Some( - expr8_0, - ); - } - } - } - } - } - } - } - } - } - } - &Opcode::SwidenHigh => { - let pattern14_0 = C::value_type(ctx, pattern12_1); - if let Some((pattern15_0, pattern15_1)) = - C::multi_lane(ctx, pattern14_0) - { - if pattern15_0 == 16i128 as u32 { - if pattern15_1 == 8i128 as u32 { - if let Some(pattern18_0) = - C::def_inst(ctx, pattern9_1) - { - let pattern19_0 = - C::inst_data(ctx, pattern18_0); - if let &InstructionData::Unary { - opcode: ref pattern20_0, - arg: pattern20_1, - } = &pattern19_0 - { - if let &Opcode::SwidenHigh = - pattern20_0 - { - let pattern22_0 = - C::value_type( - ctx, - pattern20_1, - ); - if let Some(( - pattern23_0, - pattern23_1, - )) = C::multi_lane( - ctx, - pattern22_0, - ) { - if pattern23_0 - == 16i128 as u32 - { - if pattern23_1 - == 8i128 as u32 - { - // Rule at src/isa/x64/lower.isle line 951. - let expr0_0 = constructor_put_in_xmm(ctx, pattern12_1); - let expr1_0 = constructor_put_in_xmm(ctx, pattern20_1); - let expr2_0 = C::xmm_to_xmm_mem(ctx, expr1_0); - let expr3_0 = constructor_x64_pmullw(ctx, expr0_0, &expr2_0); - let expr4_0 = C::xmm_to_xmm_mem(ctx, expr1_0); - let expr5_0 = constructor_x64_pmulhw(ctx, expr0_0, &expr4_0); - let expr6_0 = C::xmm_to_xmm_mem(ctx, expr5_0); - let expr7_0 = constructor_x64_punpckhwd(ctx, expr3_0, &expr6_0); - let expr8_0 = constructor_output_xmm(ctx, expr7_0); - return Some( - expr8_0, - ); - } - } - } - } - } - } - } - } - } - } - &Opcode::UwidenLow => { - let pattern14_0 = C::value_type(ctx, pattern12_1); - if let Some((pattern15_0, pattern15_1)) = - C::multi_lane(ctx, pattern14_0) - { - if pattern15_0 == 16i128 as u32 { - if pattern15_1 == 8i128 as u32 { - if let Some(pattern18_0) = - C::def_inst(ctx, pattern9_1) - { - let pattern19_0 = - C::inst_data(ctx, pattern18_0); - if let &InstructionData::Unary { - opcode: ref pattern20_0, - arg: pattern20_1, - } = &pattern19_0 - { - if let &Opcode::UwidenLow = - pattern20_0 - { - let pattern22_0 = - C::value_type( - ctx, - pattern20_1, - ); - if let Some(( - pattern23_0, - pattern23_1, - )) = C::multi_lane( - ctx, - pattern22_0, - ) { - if pattern23_0 - == 16i128 as u32 - { - if pattern23_1 - == 8i128 as u32 - { - // Rule at src/isa/x64/lower.isle line 1063. - let expr0_0 = constructor_put_in_xmm(ctx, pattern12_1); - let expr1_0 = constructor_put_in_xmm(ctx, pattern20_1); - let expr2_0 = C::xmm_to_xmm_mem(ctx, expr1_0); - let expr3_0 = constructor_x64_pmullw(ctx, expr0_0, &expr2_0); - let expr4_0 = C::xmm_to_xmm_mem(ctx, expr1_0); - let expr5_0 = constructor_x64_pmulhuw(ctx, expr0_0, &expr4_0); - let expr6_0 = C::xmm_to_xmm_mem(ctx, expr5_0); - let expr7_0 = constructor_x64_punpcklwd(ctx, expr3_0, &expr6_0); - let expr8_0 = constructor_output_xmm(ctx, expr7_0); - return Some( - expr8_0, - ); - } - } - } - } - } - } - } - } - } - } - &Opcode::UwidenHigh => { - let pattern14_0 = C::value_type(ctx, pattern12_1); - if let Some((pattern15_0, pattern15_1)) = - C::multi_lane(ctx, pattern14_0) - { - if pattern15_0 == 16i128 as u32 { - if pattern15_1 == 8i128 as u32 { - if let Some(pattern18_0) = - C::def_inst(ctx, pattern9_1) - { - let pattern19_0 = - C::inst_data(ctx, pattern18_0); - if let &InstructionData::Unary { - opcode: ref pattern20_0, - arg: pattern20_1, - } = &pattern19_0 - { - if let &Opcode::UwidenHigh = - pattern20_0 - { - let pattern22_0 = - C::value_type( - ctx, - pattern20_1, - ); - if let Some(( - pattern23_0, - pattern23_1, - )) = C::multi_lane( - ctx, - pattern22_0, - ) { - if pattern23_0 - == 16i128 as u32 - { - if pattern23_1 - == 8i128 as u32 - { - // Rule at src/isa/x64/lower.isle line 1027. - let expr0_0 = constructor_put_in_xmm(ctx, pattern12_1); - let expr1_0 = constructor_put_in_xmm(ctx, pattern20_1); - let expr2_0 = C::xmm_to_xmm_mem(ctx, expr1_0); - let expr3_0 = constructor_x64_pmullw(ctx, expr0_0, &expr2_0); - let expr4_0 = C::xmm_to_xmm_mem(ctx, expr1_0); - let expr5_0 = constructor_x64_pmulhuw(ctx, expr0_0, &expr4_0); - let expr6_0 = C::xmm_to_xmm_mem(ctx, expr5_0); - let expr7_0 = constructor_x64_punpckhwd(ctx, expr3_0, &expr6_0); - let expr8_0 = constructor_output_xmm(ctx, expr7_0); - return Some( - expr8_0, - ); - } - } - } - } - } - } - } - } - } - } - _ => {} - } - } - } - } - } - _ => {} - } - } - } - if pattern3_0 == 64i128 as u32 { - if pattern3_1 == 2i128 as u32 { - let pattern6_0 = C::inst_data(ctx, pattern0_0); - match &pattern6_0 { - &InstructionData::Unary { - opcode: ref pattern7_0, - arg: pattern7_1, - } => { - if let &Opcode::Splat = pattern7_0 { - let pattern9_0 = C::value_type(ctx, pattern7_1); - if let Some(pattern10_0) = C::ty_scalar_float(ctx, pattern9_0) { - // Rule at src/isa/x64/lower.isle line 3638. - let expr0_0: Type = F64X2; - let expr1_0 = - constructor_lower_splat_64x2(ctx, expr0_0, pattern7_1); - let expr2_0 = constructor_output_xmm(ctx, expr1_0); - return Some(expr2_0); - } - } - } - &InstructionData::Binary { - opcode: ref pattern7_0, - args: ref pattern7_1, - } => { - if let &Opcode::Imul = pattern7_0 { - let (pattern9_0, pattern9_1) = - C::unpack_value_array_2(ctx, pattern7_1); - if let Some(pattern10_0) = C::def_inst(ctx, pattern9_0) { - let pattern11_0 = C::inst_data(ctx, pattern10_0); - if let &InstructionData::Unary { - opcode: ref pattern12_0, - arg: pattern12_1, - } = &pattern11_0 - { - match pattern12_0 { - &Opcode::SwidenLow => { - let pattern14_0 = C::value_type(ctx, pattern12_1); - if let Some((pattern15_0, pattern15_1)) = - C::multi_lane(ctx, pattern14_0) - { - if pattern15_0 == 32i128 as u32 { - if pattern15_1 == 4i128 as u32 { - if let Some(pattern18_0) = - C::def_inst(ctx, pattern9_1) - { - let pattern19_0 = - C::inst_data(ctx, pattern18_0); - if let &InstructionData::Unary { - opcode: ref pattern20_0, - arg: pattern20_1, - } = &pattern19_0 - { - if let &Opcode::SwidenLow = - pattern20_0 - { - let pattern22_0 = - C::value_type( - ctx, - pattern20_1, - ); - if let Some(( - pattern23_0, - pattern23_1, - )) = C::multi_lane( - ctx, - pattern22_0, - ) { - if pattern23_0 - == 32i128 as u32 - { - if pattern23_1 - == 4i128 as u32 - { - // Rule at src/isa/x64/lower.isle line 999. - let expr0_0 = C::put_in_xmm_mem(ctx, pattern12_1); - let expr1_0: u8 = 80i128 as u8; - let expr2_0 = OperandSize::Size32; - let expr3_0 = constructor_x64_pshufd(ctx, &expr0_0, expr1_0, &expr2_0); - let expr4_0 = C::put_in_xmm_mem(ctx, pattern20_1); - let expr5_0: u8 = 80i128 as u8; - let expr6_0 = OperandSize::Size32; - let expr7_0 = constructor_x64_pshufd(ctx, &expr4_0, expr5_0, &expr6_0); - let expr8_0 = C::xmm_to_xmm_mem(ctx, expr7_0); - let expr9_0 = constructor_x64_pmuldq(ctx, expr3_0, &expr8_0); - let expr10_0 = constructor_output_xmm(ctx, expr9_0); - return Some( - expr10_0, - ); - } - } - } - } - } - } - } - } - } - } - &Opcode::SwidenHigh => { - let pattern14_0 = C::value_type(ctx, pattern12_1); - if let Some((pattern15_0, pattern15_1)) = - C::multi_lane(ctx, pattern14_0) - { - if pattern15_0 == 32i128 as u32 { - if pattern15_1 == 4i128 as u32 { - if let Some(pattern18_0) = - C::def_inst(ctx, pattern9_1) - { - let pattern19_0 = - C::inst_data(ctx, pattern18_0); - if let &InstructionData::Unary { - opcode: ref pattern20_0, - arg: pattern20_1, - } = &pattern19_0 - { - if let &Opcode::SwidenHigh = - pattern20_0 - { - let pattern22_0 = - C::value_type( - ctx, - pattern20_1, - ); - if let Some(( - pattern23_0, - pattern23_1, - )) = C::multi_lane( - ctx, - pattern22_0, - ) { - if pattern23_0 - == 32i128 as u32 - { - if pattern23_1 - == 4i128 as u32 - { - // Rule at src/isa/x64/lower.isle line 963. - let expr0_0 = C::put_in_xmm_mem(ctx, pattern12_1); - let expr1_0: u8 = 250i128 as u8; - let expr2_0 = OperandSize::Size32; - let expr3_0 = constructor_x64_pshufd(ctx, &expr0_0, expr1_0, &expr2_0); - let expr4_0 = C::put_in_xmm_mem(ctx, pattern20_1); - let expr5_0: u8 = 250i128 as u8; - let expr6_0 = OperandSize::Size32; - let expr7_0 = constructor_x64_pshufd(ctx, &expr4_0, expr5_0, &expr6_0); - let expr8_0 = C::xmm_to_xmm_mem(ctx, expr7_0); - let expr9_0 = constructor_x64_pmuldq(ctx, expr3_0, &expr8_0); - let expr10_0 = constructor_output_xmm(ctx, expr9_0); - return Some( - expr10_0, - ); - } - } - } - } - } - } - } - } - } - } - &Opcode::UwidenLow => { - let pattern14_0 = C::value_type(ctx, pattern12_1); - if let Some((pattern15_0, pattern15_1)) = - C::multi_lane(ctx, pattern14_0) - { - if pattern15_0 == 32i128 as u32 { - if pattern15_1 == 4i128 as u32 { - if let Some(pattern18_0) = - C::def_inst(ctx, pattern9_1) - { - let pattern19_0 = - C::inst_data(ctx, pattern18_0); - if let &InstructionData::Unary { - opcode: ref pattern20_0, - arg: pattern20_1, - } = &pattern19_0 - { - if let &Opcode::UwidenLow = - pattern20_0 - { - let pattern22_0 = - C::value_type( - ctx, - pattern20_1, - ); - if let Some(( - pattern23_0, - pattern23_1, - )) = C::multi_lane( - ctx, - pattern22_0, - ) { - if pattern23_0 - == 32i128 as u32 - { - if pattern23_1 - == 4i128 as u32 - { - // Rule at src/isa/x64/lower.isle line 1075. - let expr0_0 = C::put_in_xmm_mem(ctx, pattern12_1); - let expr1_0: u8 = 80i128 as u8; - let expr2_0 = OperandSize::Size32; - let expr3_0 = constructor_x64_pshufd(ctx, &expr0_0, expr1_0, &expr2_0); - let expr4_0 = C::put_in_xmm_mem(ctx, pattern20_1); - let expr5_0: u8 = 80i128 as u8; - let expr6_0 = OperandSize::Size32; - let expr7_0 = constructor_x64_pshufd(ctx, &expr4_0, expr5_0, &expr6_0); - let expr8_0 = C::xmm_to_xmm_mem(ctx, expr7_0); - let expr9_0 = constructor_x64_pmuludq(ctx, expr3_0, &expr8_0); - let expr10_0 = constructor_output_xmm(ctx, expr9_0); - return Some( - expr10_0, - ); - } - } - } - } - } - } - } - } - } - } - &Opcode::UwidenHigh => { - let pattern14_0 = C::value_type(ctx, pattern12_1); - if let Some((pattern15_0, pattern15_1)) = - C::multi_lane(ctx, pattern14_0) - { - if pattern15_0 == 32i128 as u32 { - if pattern15_1 == 4i128 as u32 { - if let Some(pattern18_0) = - C::def_inst(ctx, pattern9_1) - { - let pattern19_0 = - C::inst_data(ctx, pattern18_0); - if let &InstructionData::Unary { - opcode: ref pattern20_0, - arg: pattern20_1, - } = &pattern19_0 - { - if let &Opcode::UwidenHigh = - pattern20_0 - { - let pattern22_0 = - C::value_type( - ctx, - pattern20_1, - ); - if let Some(( - pattern23_0, - pattern23_1, - )) = C::multi_lane( - ctx, - pattern22_0, - ) { - if pattern23_0 - == 32i128 as u32 - { - if pattern23_1 - == 4i128 as u32 - { - // Rule at src/isa/x64/lower.isle line 1039. - let expr0_0 = C::put_in_xmm_mem(ctx, pattern12_1); - let expr1_0: u8 = 250i128 as u8; - let expr2_0 = OperandSize::Size32; - let expr3_0 = constructor_x64_pshufd(ctx, &expr0_0, expr1_0, &expr2_0); - let expr4_0 = C::put_in_xmm_mem(ctx, pattern20_1); - let expr5_0: u8 = 250i128 as u8; - let expr6_0 = OperandSize::Size32; - let expr7_0 = constructor_x64_pshufd(ctx, &expr4_0, expr5_0, &expr6_0); - let expr8_0 = C::xmm_to_xmm_mem(ctx, expr7_0); - let expr9_0 = constructor_x64_pmuludq(ctx, expr3_0, &expr8_0); - let expr10_0 = constructor_output_xmm(ctx, expr9_0); - return Some( - expr10_0, - ); - } - } - } - } - } - } - } - } - } - } - _ => {} - } - } - } - } - } - _ => {} - } - } - } - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Ternary { - opcode: ref pattern5_0, - args: ref pattern5_1, - } = &pattern4_0 - { - if let &Opcode::Bitselect = pattern5_0 { - let (pattern7_0, pattern7_1, pattern7_2) = - C::unpack_value_array_3(ctx, pattern5_1); - let mut closure8 = || { - let expr0_0 = constructor_all_ones_or_all_zeros(ctx, pattern7_0)?; - return Some(expr0_0); - }; - if let Some(pattern8_0) = closure8() { - // Rule at src/isa/x64/lower.isle line 1262. - let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0); - let expr1_0 = C::put_in_xmm_mem(ctx, pattern7_1); - let expr2_0 = constructor_put_in_xmm(ctx, pattern7_2); - let expr3_0 = - constructor_x64_blend(ctx, pattern2_0, expr0_0, &expr1_0, expr2_0); - let expr4_0 = constructor_output_xmm(ctx, expr3_0); - return Some(expr4_0); - } - } - } - } - if let Some(pattern3_0) = C::fits_in_64(ctx, pattern2_0) { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - match &pattern4_0 { - &InstructionData::Unary { - opcode: ref pattern5_0, - arg: pattern5_1, - } => { - if let &Opcode::Ireduce = pattern5_0 { - // Rule at src/isa/x64/lower.isle line 2218. - let expr0_0 = C::put_in_regs(ctx, pattern5_1); - let expr1_0: usize = 0i128 as usize; - let expr2_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr1_0); - let expr3_0 = constructor_output_gpr(ctx, expr2_0); - return Some(expr3_0); - } - } - &InstructionData::IntAddTrap { - opcode: ref pattern5_0, - args: ref pattern5_1, - code: ref pattern5_2, - } => { - if let &Opcode::UaddOverflowTrap = pattern5_0 { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - if let Some(pattern8_0) = C::simm32_from_value(ctx, pattern7_1) { - // Rule at src/isa/x64/lower.isle line 1439. - let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0); - let expr1_0 = constructor_x64_add_with_flags_paired( - ctx, - pattern3_0, - expr0_0, - &pattern8_0, - ); - let expr2_0 = CC::B; - let expr3_0 = constructor_trap_if(ctx, &expr2_0, pattern5_2); - let expr4_0 = constructor_with_flags(ctx, &expr1_0, &expr3_0); - let expr5_0 = C::output(ctx, expr4_0); - return Some(expr5_0); - } - } - } - _ => {} - } - } - if let Some(pattern3_0) = C::ty_8_or_16(ctx, pattern2_0) { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Unary { - opcode: ref pattern5_0, - arg: pattern5_1, - } = &pattern4_0 - { - match pattern5_0 { - &Opcode::Clz => { - // Rule at src/isa/x64/lower.isle line 1776. - let expr0_0: Type = I32; - let expr1_0: Type = I32; - let expr2_0 = ExtendKind::Zero; - let expr3_0 = constructor_extend_to_gpr(ctx, pattern5_1, expr1_0, &expr2_0); - let expr4_0 = constructor_do_clz(ctx, expr0_0, pattern3_0, expr3_0); - let expr5_0 = constructor_output_gpr(ctx, expr4_0); - return Some(expr5_0); - } - &Opcode::Ctz => { - // Rule at src/isa/x64/lower.isle line 1820. - let expr0_0: Type = I32; - let expr1_0: Type = I32; - let expr2_0 = ExtendKind::Zero; - let expr3_0 = constructor_extend_to_gpr(ctx, pattern5_1, expr1_0, &expr2_0); - let expr4_0 = constructor_do_ctz(ctx, expr0_0, pattern3_0, expr3_0); - let expr5_0 = constructor_output_gpr(ctx, expr4_0); - return Some(expr5_0); - } - _ => {} - } - } - } - if let Some(pattern3_0) = C::type_register_class(ctx, pattern2_0) { - if let &RegisterClass::Gpr { - single_register: pattern4_0, - } = &pattern3_0 - { - let pattern5_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::LoadNoOffset { - opcode: ref pattern6_0, - arg: pattern6_1, - flags: pattern6_2, - } = &pattern5_0 - { - if let &Opcode::Bitcast = pattern6_0 { - let pattern8_0 = C::value_type(ctx, pattern6_1); - if let Some(pattern9_0) = C::type_register_class(ctx, pattern8_0) { - if let &RegisterClass::Gpr { - single_register: pattern10_0, - } = &pattern9_0 - { - // Rule at src/isa/x64/lower.isle line 3333. - let expr0_0 = constructor_output_value(ctx, pattern6_1); - return Some(expr0_0); - } - } - } - } - } - } - let pattern3_0 = C::inst_data(ctx, pattern0_0); - match &pattern3_0 { - &InstructionData::Unary { - opcode: ref pattern4_0, - arg: pattern4_1, - } => { - if let &Opcode::Uextend = pattern4_0 { - let pattern6_0 = C::value_type(ctx, pattern4_1); - if pattern6_0 == pattern2_0 { - // Rule at src/isa/x64/lower.isle line 2114. - let expr0_0 = constructor_output_value(ctx, pattern4_1); - return Some(expr0_0); - } - } - } - &InstructionData::Binary { - opcode: ref pattern4_0, - args: ref pattern4_1, - } => { - match pattern4_0 { - &Opcode::Band => { - let (pattern6_0, pattern6_1) = C::unpack_value_array_2(ctx, pattern4_1); - if let Some(pattern7_0) = C::sinkable_load(ctx, pattern6_1) { - let mut closure8 = || { - let expr0_0 = C::ty_int_ref_scalar_64(ctx, pattern2_0)?; - return Some(expr0_0); - }; - if let Some(pattern8_0) = closure8() { - // Rule at src/isa/x64/lower.isle line 221. - let expr0_0 = constructor_put_in_gpr(ctx, pattern6_0); - let expr1_0 = - constructor_sink_load_to_gpr_mem_imm(ctx, &pattern7_0); - let expr2_0 = - constructor_x64_and(ctx, pattern2_0, expr0_0, &expr1_0); - let expr3_0 = constructor_output_gpr(ctx, expr2_0); - return Some(expr3_0); - } - } - } - &Opcode::Bor => { - let (pattern6_0, pattern6_1) = C::unpack_value_array_2(ctx, pattern4_1); - if let Some(pattern7_0) = C::sinkable_load(ctx, pattern6_1) { - let mut closure8 = || { - let expr0_0 = C::ty_int_ref_scalar_64(ctx, pattern2_0)?; - return Some(expr0_0); - }; - if let Some(pattern8_0) = closure8() { - // Rule at src/isa/x64/lower.isle line 283. - let expr0_0 = constructor_put_in_gpr(ctx, pattern6_0); - let expr1_0 = - constructor_sink_load_to_gpr_mem_imm(ctx, &pattern7_0); - let expr2_0 = - constructor_x64_or(ctx, pattern2_0, expr0_0, &expr1_0); - let expr3_0 = constructor_output_gpr(ctx, expr2_0); - return Some(expr3_0); - } - } - } - &Opcode::Bxor => { - let (pattern6_0, pattern6_1) = C::unpack_value_array_2(ctx, pattern4_1); - if let Some(pattern7_0) = C::sinkable_load(ctx, pattern6_1) { - let mut closure8 = || { - let expr0_0 = C::ty_int_ref_scalar_64(ctx, pattern2_0)?; - return Some(expr0_0); - }; - if let Some(pattern8_0) = closure8() { - // Rule at src/isa/x64/lower.isle line 346. - let expr0_0 = constructor_put_in_gpr(ctx, pattern6_0); - let expr1_0 = - constructor_sink_load_to_gpr_mem_imm(ctx, &pattern7_0); - let expr2_0 = - constructor_x64_xor(ctx, pattern2_0, expr0_0, &expr1_0); - let expr3_0 = constructor_output_gpr(ctx, expr2_0); - return Some(expr3_0); - } - } - } - _ => {} - } - } - _ => {} - } - let pattern3_0 = C::avx512vl_enabled(ctx, pattern2_0); - if pattern3_0 == true { - let pattern5_0 = C::avx512f_enabled(ctx, pattern2_0); - if pattern5_0 == true { - if pattern2_0 == I64X2 { - let pattern8_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Unary { - opcode: ref pattern9_0, - arg: pattern9_1, - } = &pattern8_0 - { - if let &Opcode::Iabs = pattern9_0 { - // Rule at src/isa/x64/lower.isle line 1117. - let expr0_0 = C::put_in_xmm_mem(ctx, pattern9_1); - let expr1_0 = constructor_x64_vpabsq(ctx, &expr0_0); - let expr2_0 = constructor_output_xmm(ctx, expr1_0); - return Some(expr2_0); - } - } - } - } - let pattern5_0 = C::avx512vbmi_enabled(ctx, pattern2_0); - if pattern5_0 == true { - let pattern7_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Shuffle { - opcode: ref pattern8_0, - args: ref pattern8_1, - imm: pattern8_2, - } = &pattern7_0 - { - if let &Opcode::Shuffle = pattern8_0 { - let (pattern10_0, pattern10_1) = C::unpack_value_array_2(ctx, pattern8_1); - if let Some(pattern11_0) = C::vec_mask_from_immediate(ctx, pattern8_2) { - // Rule at src/isa/x64/lower.isle line 3530. - let expr0_0 = constructor_put_in_xmm(ctx, pattern10_1); - let expr1_0 = constructor_put_in_xmm(ctx, pattern10_0); - let expr2_0: Type = I8X16; - let expr3_0 = C::perm_from_mask(ctx, &pattern11_0); - let expr4_0 = constructor_x64_xmm_load_const(ctx, expr2_0, expr3_0); - let expr5_0 = constructor_x64_vpermi2b(ctx, expr0_0, expr1_0, expr4_0); - let expr6_0 = constructor_output_xmm(ctx, expr5_0); - return Some(expr6_0); - } - } - } - } - } - let pattern3_0 = C::use_fma(ctx, pattern2_0); - if pattern3_0 == true { - if pattern2_0 == F32 { - let pattern6_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Ternary { - opcode: ref pattern7_0, - args: ref pattern7_1, - } = &pattern6_0 - { - if let &Opcode::Fma = pattern7_0 { - let (pattern9_0, pattern9_1, pattern9_2) = - C::unpack_value_array_3(ctx, pattern7_1); - // Rule at src/isa/x64/lower.isle line 2503. - let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0); - let expr1_0 = constructor_put_in_xmm(ctx, pattern9_1); - let expr2_0 = constructor_put_in_xmm(ctx, pattern9_2); - let expr3_0 = constructor_x64_vfmadd213ss(ctx, expr0_0, expr1_0, expr2_0); - let expr4_0 = constructor_output_xmm(ctx, expr3_0); - return Some(expr4_0); - } - } - } - if pattern2_0 == F64 { - let pattern6_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Ternary { - opcode: ref pattern7_0, - args: ref pattern7_1, - } = &pattern6_0 - { - if let &Opcode::Fma = pattern7_0 { - let (pattern9_0, pattern9_1, pattern9_2) = - C::unpack_value_array_3(ctx, pattern7_1); - // Rule at src/isa/x64/lower.isle line 2505. - let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0); - let expr1_0 = constructor_put_in_xmm(ctx, pattern9_1); - let expr2_0 = constructor_put_in_xmm(ctx, pattern9_2); - let expr3_0 = constructor_x64_vfmadd213sd(ctx, expr0_0, expr1_0, expr2_0); - let expr4_0 = constructor_output_xmm(ctx, expr3_0); - return Some(expr4_0); - } - } - } - } - } - let pattern1_0 = C::inst_data(ctx, pattern0_0); - match &pattern1_0 { - &InstructionData::Unary { - opcode: ref pattern2_0, - arg: pattern2_1, - } => { - if let &Opcode::ScalarToVector = pattern2_0 { - let pattern4_0 = C::value_type(ctx, pattern2_1); - if let Some(pattern5_0) = C::ty_scalar_float(ctx, pattern4_0) { - // Rule at src/isa/x64/lower.isle line 3593. - let expr0_0 = constructor_output_value(ctx, pattern2_1); - return Some(expr0_0); - } - } - } - &InstructionData::Store { - opcode: ref pattern2_0, - args: ref pattern2_1, - flags: pattern2_2, - offset: pattern2_3, - } => { - if let &Opcode::Store = pattern2_0 { - let (pattern4_0, pattern4_1) = C::unpack_value_array_2(ctx, pattern2_1); - let pattern5_0 = C::value_type(ctx, pattern4_0); - if pattern5_0 == F32 { - // Rule at src/isa/x64/lower.isle line 2603. - let expr0_0 = SseOpcode::Movss; - let expr1_0 = constructor_to_amode(ctx, pattern2_2, pattern4_1, pattern2_3); - let expr2_0 = C::amode_to_synthetic_amode(ctx, &expr1_0); - let expr3_0 = constructor_put_in_xmm(ctx, pattern4_0); - let expr4_0 = constructor_x64_xmm_movrm(ctx, &expr0_0, &expr2_0, expr3_0); - let expr5_0 = constructor_side_effect(ctx, &expr4_0); - return Some(expr5_0); - } - if pattern5_0 == F64 { - // Rule at src/isa/x64/lower.isle line 2611. - let expr0_0 = SseOpcode::Movsd; - let expr1_0 = constructor_to_amode(ctx, pattern2_2, pattern4_1, pattern2_3); - let expr2_0 = C::amode_to_synthetic_amode(ctx, &expr1_0); - let expr3_0 = constructor_put_in_xmm(ctx, pattern4_0); - let expr4_0 = constructor_x64_xmm_movrm(ctx, &expr0_0, &expr2_0, expr3_0); - let expr5_0 = constructor_side_effect(ctx, &expr4_0); - return Some(expr5_0); - } - if pattern5_0 == F32X4 { - // Rule at src/isa/x64/lower.isle line 2619. - let expr0_0 = SseOpcode::Movups; - let expr1_0 = constructor_to_amode(ctx, pattern2_2, pattern4_1, pattern2_3); - let expr2_0 = C::amode_to_synthetic_amode(ctx, &expr1_0); - let expr3_0 = constructor_put_in_xmm(ctx, pattern4_0); - let expr4_0 = constructor_x64_xmm_movrm(ctx, &expr0_0, &expr2_0, expr3_0); - let expr5_0 = constructor_side_effect(ctx, &expr4_0); - return Some(expr5_0); - } - if pattern5_0 == F64X2 { - // Rule at src/isa/x64/lower.isle line 2627. - let expr0_0 = SseOpcode::Movupd; - let expr1_0 = constructor_to_amode(ctx, pattern2_2, pattern4_1, pattern2_3); - let expr2_0 = C::amode_to_synthetic_amode(ctx, &expr1_0); - let expr3_0 = constructor_put_in_xmm(ctx, pattern4_0); - let expr4_0 = constructor_x64_xmm_movrm(ctx, &expr0_0, &expr2_0, expr3_0); - let expr5_0 = constructor_side_effect(ctx, &expr4_0); - return Some(expr5_0); - } - } - } - &InstructionData::IntCompare { - opcode: ref pattern2_0, - args: ref pattern2_1, - cond: ref pattern2_2, - } => { - if let &Opcode::Icmp = pattern2_0 { - let (pattern4_0, pattern4_1) = C::unpack_value_array_2(ctx, pattern2_1); - let pattern5_0 = C::value_type(ctx, pattern4_0); - if pattern5_0 == I64X2 { - match pattern2_2 { - &IntCC::SignedGreaterThanOrEqual => { - // Rule at src/isa/x64/lower.isle line 1573. - let expr0_0: Type = I64X2; - let expr1_0 = constructor_put_in_xmm(ctx, pattern4_1); - let expr2_0 = C::put_in_xmm_mem(ctx, pattern4_0); - let expr3_0 = constructor_x64_pcmpgt(ctx, expr0_0, expr1_0, &expr2_0); - let expr4_0 = constructor_vector_all_ones(ctx); - let expr5_0 = C::xmm_to_xmm_mem(ctx, expr4_0); - let expr6_0 = constructor_x64_pxor(ctx, expr3_0, &expr5_0); - let expr7_0 = constructor_output_xmm(ctx, expr6_0); - return Some(expr7_0); - } - &IntCC::SignedLessThanOrEqual => { - // Rule at src/isa/x64/lower.isle line 1577. - let expr0_0: Type = I64X2; - let expr1_0 = constructor_put_in_xmm(ctx, pattern4_0); - let expr2_0 = C::put_in_xmm_mem(ctx, pattern4_1); - let expr3_0 = constructor_x64_pcmpgt(ctx, expr0_0, expr1_0, &expr2_0); - let expr4_0 = constructor_vector_all_ones(ctx); - let expr5_0 = C::xmm_to_xmm_mem(ctx, expr4_0); - let expr6_0 = constructor_x64_pxor(ctx, expr3_0, &expr5_0); - let expr7_0 = constructor_output_xmm(ctx, expr6_0); - return Some(expr7_0); - } - _ => {} - } - } - } - } - _ => {} - } - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::first_result(ctx, pattern0_0) { - let pattern2_0 = C::value_type(ctx, pattern1_0); - if pattern2_0 == I8 { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Unary { - opcode: ref pattern5_0, - arg: pattern5_1, - } = &pattern4_0 - { - if let &Opcode::Bitrev = pattern5_0 { - // Rule at src/isa/x64/lower.isle line 2001. - let expr0_0: Type = I32; - let expr1_0 = constructor_put_in_gpr(ctx, pattern5_1); - let expr2_0 = constructor_do_bitrev8(ctx, expr0_0, expr1_0); - let expr3_0 = constructor_output_gpr(ctx, expr2_0); - return Some(expr3_0); - } - } - } - if pattern2_0 == I16 { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Unary { - opcode: ref pattern5_0, - arg: pattern5_1, - } = &pattern4_0 - { - match pattern5_0 { - &Opcode::Bitrev => { - // Rule at src/isa/x64/lower.isle line 2004. - let expr0_0: Type = I32; - let expr1_0 = constructor_put_in_gpr(ctx, pattern5_1); - let expr2_0 = constructor_do_bitrev16(ctx, expr0_0, expr1_0); - let expr3_0 = constructor_output_gpr(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::Bswap => { - // Rule at src/isa/x64/lower.isle line 2080. - let expr0_0: Type = I16; - let expr1_0 = constructor_put_in_gpr(ctx, pattern5_1); - let expr2_0: u8 = 8i128 as u8; - let expr3_0 = Imm8Reg::Imm8 { imm: expr2_0 }; - let expr4_0 = C::imm8_reg_to_imm8_gpr(ctx, &expr3_0); - let expr5_0 = constructor_x64_rotl(ctx, expr0_0, expr1_0, &expr4_0); - let expr6_0 = constructor_output_gpr(ctx, expr5_0); - return Some(expr6_0); - } - _ => {} - } - } - } - if pattern2_0 == I32 { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - match &pattern4_0 { - &InstructionData::Unary { - opcode: ref pattern5_0, - arg: pattern5_1, - } => { - match pattern5_0 { - &Opcode::Bitrev => { - // Rule at src/isa/x64/lower.isle line 2007. - let expr0_0: Type = I32; - let expr1_0 = constructor_put_in_gpr(ctx, pattern5_1); - let expr2_0 = constructor_do_bitrev32(ctx, expr0_0, expr1_0); - let expr3_0 = constructor_output_gpr(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::Bswap => { - // Rule at src/isa/x64/lower.isle line 2083. - let expr0_0: Type = I32; - let expr1_0 = constructor_put_in_gpr(ctx, pattern5_1); - let expr2_0 = constructor_x64_bswap(ctx, expr0_0, expr1_0); - let expr3_0 = constructor_output_gpr(ctx, expr2_0); - return Some(expr3_0); - } - _ => {} - } - } - &InstructionData::LoadNoOffset { - opcode: ref pattern5_0, - arg: pattern5_1, - flags: pattern5_2, - } => { - if let &Opcode::Bitcast = pattern5_0 { - let pattern7_0 = C::value_type(ctx, pattern5_1); - if pattern7_0 == F32 { - // Rule at src/isa/x64/lower.isle line 3320. - let expr0_0: Type = F32; - let expr1_0 = constructor_put_in_xmm(ctx, pattern5_1); - let expr2_0 = constructor_bitcast_xmm_to_gpr(ctx, expr0_0, expr1_0); - let expr3_0 = constructor_output_gpr(ctx, expr2_0); - return Some(expr3_0); - } - } - } - _ => {} - } - } - if pattern2_0 == I64 { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - match &pattern4_0 { - &InstructionData::Unary { - opcode: ref pattern5_0, - arg: pattern5_1, - } => { - match pattern5_0 { - &Opcode::Bitrev => { - // Rule at src/isa/x64/lower.isle line 2010. - let expr0_0: Type = I64; - let expr1_0 = constructor_put_in_gpr(ctx, pattern5_1); - let expr2_0 = constructor_do_bitrev64(ctx, expr0_0, expr1_0); - let expr3_0 = constructor_output_gpr(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::Bswap => { - // Rule at src/isa/x64/lower.isle line 2086. - let expr0_0: Type = I64; - let expr1_0 = constructor_put_in_gpr(ctx, pattern5_1); - let expr2_0 = constructor_x64_bswap(ctx, expr0_0, expr1_0); - let expr3_0 = constructor_output_gpr(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::Uextend => { - if let Some(pattern7_0) = C::def_inst(ctx, pattern5_1) { - if let Some(pattern8_0) = C::first_result(ctx, pattern7_0) { - let pattern9_0 = C::value_type(ctx, pattern8_0); - if pattern9_0 == I32 { - let pattern11_0 = C::inst_data(ctx, pattern7_0); - match &pattern11_0 { - &InstructionData::Load { - opcode: ref pattern12_0, - arg: pattern12_1, - flags: pattern12_2, - offset: pattern12_3, - } => { - if let &Opcode::Uload32 = pattern12_0 { - // Rule at src/isa/x64/lower.isle line 2168. - let expr0_0 = - constructor_output_value(ctx, pattern5_1); - return Some(expr0_0); - } - } - &InstructionData::Binary { - opcode: ref pattern12_0, - args: ref pattern12_1, - } => { - match pattern12_0 { - &Opcode::Iadd => { - let (pattern14_0, pattern14_1) = - C::unpack_value_array_2( - ctx, - pattern12_1, - ); - // Rule at src/isa/x64/lower.isle line 2144. - let expr0_0 = constructor_output_value( - ctx, pattern5_1, - ); - return Some(expr0_0); - } - &Opcode::Isub => { - let (pattern14_0, pattern14_1) = - C::unpack_value_array_2( - ctx, - pattern12_1, - ); - // Rule at src/isa/x64/lower.isle line 2147. - let expr0_0 = constructor_output_value( - ctx, pattern5_1, - ); - return Some(expr0_0); - } - &Opcode::Imul => { - let (pattern14_0, pattern14_1) = - C::unpack_value_array_2( - ctx, - pattern12_1, - ); - // Rule at src/isa/x64/lower.isle line 2150. - let expr0_0 = constructor_output_value( - ctx, pattern5_1, - ); - return Some(expr0_0); - } - &Opcode::Band => { - let (pattern14_0, pattern14_1) = - C::unpack_value_array_2( - ctx, - pattern12_1, - ); - // Rule at src/isa/x64/lower.isle line 2153. - let expr0_0 = constructor_output_value( - ctx, pattern5_1, - ); - return Some(expr0_0); - } - &Opcode::Bor => { - let (pattern14_0, pattern14_1) = - C::unpack_value_array_2( - ctx, - pattern12_1, - ); - // Rule at src/isa/x64/lower.isle line 2156. - let expr0_0 = constructor_output_value( - ctx, pattern5_1, - ); - return Some(expr0_0); - } - &Opcode::Bxor => { - let (pattern14_0, pattern14_1) = - C::unpack_value_array_2( - ctx, - pattern12_1, - ); - // Rule at src/isa/x64/lower.isle line 2159. - let expr0_0 = constructor_output_value( - ctx, pattern5_1, - ); - return Some(expr0_0); - } - &Opcode::Ishl => { - let (pattern14_0, pattern14_1) = - C::unpack_value_array_2( - ctx, - pattern12_1, - ); - // Rule at src/isa/x64/lower.isle line 2162. - let expr0_0 = constructor_output_value( - ctx, pattern5_1, - ); - return Some(expr0_0); - } - &Opcode::Ushr => { - let (pattern14_0, pattern14_1) = - C::unpack_value_array_2( - ctx, - pattern12_1, - ); - // Rule at src/isa/x64/lower.isle line 2165. - let expr0_0 = constructor_output_value( - ctx, pattern5_1, - ); - return Some(expr0_0); - } - _ => {} - } - } - _ => {} - } - } - } - } - } - _ => {} - } - } - &InstructionData::LoadNoOffset { - opcode: ref pattern5_0, - arg: pattern5_1, - flags: pattern5_2, - } => { - if let &Opcode::Bitcast = pattern5_0 { - let pattern7_0 = C::value_type(ctx, pattern5_1); - if pattern7_0 == F64 { - // Rule at src/isa/x64/lower.isle line 3326. - let expr0_0: Type = F64; - let expr1_0 = constructor_put_in_xmm(ctx, pattern5_1); - let expr2_0 = constructor_bitcast_xmm_to_gpr(ctx, expr0_0, expr1_0); - let expr3_0 = constructor_output_gpr(ctx, expr2_0); - return Some(expr3_0); - } - } - } - _ => {} - } - } - if pattern2_0 == I128 { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - match &pattern4_0 { - &InstructionData::Unary { - opcode: ref pattern5_0, - arg: pattern5_1, - } => { - match pattern5_0 { - &Opcode::Bnot => { - // Rule at src/isa/x64/lower.isle line 1233. - let expr0_0 = constructor_i128_not(ctx, pattern5_1); - let expr1_0 = C::output(ctx, expr0_0); - return Some(expr1_0); - } - &Opcode::Bitrev => { - // Rule at src/isa/x64/lower.isle line 2013. - let expr0_0: Type = I64; - let expr1_0 = C::put_in_regs(ctx, pattern5_1); - let expr2_0: usize = 1i128 as usize; - let expr3_0 = constructor_value_regs_get_gpr(ctx, expr1_0, expr2_0); - let expr4_0 = constructor_do_bitrev64(ctx, expr0_0, expr3_0); - let expr5_0 = C::gpr_to_reg(ctx, expr4_0); - let expr6_0: Type = I64; - let expr7_0 = C::put_in_regs(ctx, pattern5_1); - let expr8_0: usize = 0i128 as usize; - let expr9_0 = constructor_value_regs_get_gpr(ctx, expr7_0, expr8_0); - let expr10_0 = constructor_do_bitrev64(ctx, expr6_0, expr9_0); - let expr11_0 = C::gpr_to_reg(ctx, expr10_0); - let expr12_0 = C::value_regs(ctx, expr5_0, expr11_0); - let expr13_0 = C::output(ctx, expr12_0); - return Some(expr13_0); - } - &Opcode::Clz => { - // Rule at src/isa/x64/lower.isle line 1781. - let expr0_0: Type = I64; - let expr1_0: Type = I64; - let expr2_0 = C::put_in_regs(ctx, pattern5_1); - let expr3_0: usize = 1i128 as usize; - let expr4_0 = constructor_value_regs_get_gpr(ctx, expr2_0, expr3_0); - let expr5_0 = constructor_do_clz(ctx, expr0_0, expr1_0, expr4_0); - let expr6_0: Type = I64; - let expr7_0: Type = I64; - let expr8_0: Type = I64; - let expr9_0 = C::put_in_regs(ctx, pattern5_1); - let expr10_0: usize = 0i128 as usize; - let expr11_0 = constructor_value_regs_get_gpr(ctx, expr9_0, expr10_0); - let expr12_0 = constructor_do_clz(ctx, expr7_0, expr8_0, expr11_0); - let expr13_0: u32 = 64i128 as u32; - let expr14_0 = RegMemImm::Imm { simm32: expr13_0 }; - let expr15_0 = C::gpr_mem_imm_new(ctx, &expr14_0); - let expr16_0 = constructor_x64_add(ctx, expr6_0, expr12_0, &expr15_0); - let expr17_0 = OperandSize::Size64; - let expr18_0: u32 = 64i128 as u32; - let expr19_0 = - constructor_x64_cmp_imm(ctx, &expr17_0, expr18_0, expr5_0); - let expr20_0: Type = I64; - let expr21_0 = CC::NZ; - let expr22_0 = C::gpr_to_gpr_mem(ctx, expr5_0); - let expr23_0 = - constructor_cmove(ctx, expr20_0, &expr21_0, &expr22_0, expr16_0); - let expr24_0 = constructor_with_flags_reg(ctx, &expr19_0, &expr23_0); - let expr25_0 = C::gpr_new(ctx, expr24_0); - let expr26_0 = C::gpr_to_reg(ctx, expr25_0); - let expr27_0: Type = I64; - let expr28_0: u64 = 0i128 as u64; - let expr29_0 = constructor_imm(ctx, expr27_0, expr28_0); - let expr30_0 = C::value_regs(ctx, expr26_0, expr29_0); - let expr31_0 = C::output(ctx, expr30_0); - return Some(expr31_0); - } - &Opcode::Ctz => { - // Rule at src/isa/x64/lower.isle line 1825. - let expr0_0: Type = I64; - let expr1_0: Type = I64; - let expr2_0 = C::put_in_regs(ctx, pattern5_1); - let expr3_0: usize = 0i128 as usize; - let expr4_0 = constructor_value_regs_get_gpr(ctx, expr2_0, expr3_0); - let expr5_0 = constructor_do_ctz(ctx, expr0_0, expr1_0, expr4_0); - let expr6_0: Type = I64; - let expr7_0: Type = I64; - let expr8_0: Type = I64; - let expr9_0 = C::put_in_regs(ctx, pattern5_1); - let expr10_0: usize = 1i128 as usize; - let expr11_0 = constructor_value_regs_get_gpr(ctx, expr9_0, expr10_0); - let expr12_0 = constructor_do_ctz(ctx, expr7_0, expr8_0, expr11_0); - let expr13_0: u32 = 64i128 as u32; - let expr14_0 = RegMemImm::Imm { simm32: expr13_0 }; - let expr15_0 = C::gpr_mem_imm_new(ctx, &expr14_0); - let expr16_0 = constructor_x64_add(ctx, expr6_0, expr12_0, &expr15_0); - let expr17_0 = OperandSize::Size64; - let expr18_0: u32 = 64i128 as u32; - let expr19_0 = - constructor_x64_cmp_imm(ctx, &expr17_0, expr18_0, expr5_0); - let expr20_0: Type = I64; - let expr21_0 = CC::Z; - let expr22_0 = C::gpr_to_gpr_mem(ctx, expr16_0); - let expr23_0 = - constructor_cmove(ctx, expr20_0, &expr21_0, &expr22_0, expr5_0); - let expr24_0 = constructor_with_flags_reg(ctx, &expr19_0, &expr23_0); - let expr25_0 = C::gpr_new(ctx, expr24_0); - let expr26_0 = C::gpr_to_reg(ctx, expr25_0); - let expr27_0: Type = I64; - let expr28_0: u64 = 0i128 as u64; - let expr29_0 = constructor_imm(ctx, expr27_0, expr28_0); - let expr30_0 = C::value_regs(ctx, expr26_0, expr29_0); - let expr31_0 = C::output(ctx, expr30_0); - return Some(expr31_0); - } - &Opcode::Bswap => { - // Rule at src/isa/x64/lower.isle line 2089. - let expr0_0: Type = I64; - let expr1_0 = C::put_in_regs(ctx, pattern5_1); - let expr2_0: usize = 1i128 as usize; - let expr3_0 = constructor_value_regs_get_gpr(ctx, expr1_0, expr2_0); - let expr4_0 = constructor_x64_bswap(ctx, expr0_0, expr3_0); - let expr5_0 = C::gpr_to_reg(ctx, expr4_0); - let expr6_0: Type = I64; - let expr7_0 = C::put_in_regs(ctx, pattern5_1); - let expr8_0: usize = 0i128 as usize; - let expr9_0 = constructor_value_regs_get_gpr(ctx, expr7_0, expr8_0); - let expr10_0 = constructor_x64_bswap(ctx, expr6_0, expr9_0); - let expr11_0 = C::gpr_to_reg(ctx, expr10_0); - let expr12_0 = C::value_regs(ctx, expr5_0, expr11_0); - let expr13_0 = C::output(ctx, expr12_0); - return Some(expr13_0); - } - &Opcode::Popcnt => { - // Rule at src/isa/x64/lower.isle line 1877. - let expr0_0: Type = I64; - let expr1_0 = C::put_in_regs(ctx, pattern5_1); - let expr2_0: usize = 0i128 as usize; - let expr3_0 = constructor_value_regs_get_gpr(ctx, expr1_0, expr2_0); - let expr4_0 = constructor_do_popcnt(ctx, expr0_0, expr3_0); - let expr5_0: Type = I64; - let expr6_0 = C::put_in_regs(ctx, pattern5_1); - let expr7_0: usize = 1i128 as usize; - let expr8_0 = constructor_value_regs_get_gpr(ctx, expr6_0, expr7_0); - let expr9_0 = constructor_do_popcnt(ctx, expr5_0, expr8_0); - let expr10_0: Type = I64; - let expr11_0 = C::gpr_to_gpr_mem_imm(ctx, expr9_0); - let expr12_0 = constructor_x64_add(ctx, expr10_0, expr4_0, &expr11_0); - let expr13_0 = C::gpr_to_reg(ctx, expr12_0); - let expr14_0: Type = I64; - let expr15_0: u64 = 0i128 as u64; - let expr16_0 = constructor_imm(ctx, expr14_0, expr15_0); - let expr17_0 = C::value_regs(ctx, expr13_0, expr16_0); - let expr18_0 = C::output(ctx, expr17_0); - return Some(expr18_0); - } - &Opcode::Uextend => { - let pattern7_0 = C::value_type(ctx, pattern5_1); - if let Some(pattern8_0) = C::fits_in_32(ctx, pattern7_0) { - // Rule at src/isa/x64/lower.isle line 2122. - let expr0_0: Type = I64; - let expr1_0 = ExtendKind::Zero; - let expr2_0 = - constructor_extend_to_gpr(ctx, pattern5_1, expr0_0, &expr1_0); - let expr3_0 = C::gpr_to_reg(ctx, expr2_0); - let expr4_0: Type = I64; - let expr5_0: u64 = 0i128 as u64; - let expr6_0 = constructor_imm(ctx, expr4_0, expr5_0); - let expr7_0 = C::value_regs(ctx, expr3_0, expr6_0); - let expr8_0 = C::output(ctx, expr7_0); - return Some(expr8_0); - } - } - _ => {} - } - } - &InstructionData::Binary { - opcode: ref pattern5_0, - args: ref pattern5_1, - } => { - match pattern5_0 { - &Opcode::Rotl => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 737. - let expr0_0 = C::put_in_regs(ctx, pattern7_0); - let expr1_0 = constructor_lo_gpr(ctx, pattern7_1); - let expr2_0 = constructor_shl_i128(ctx, expr0_0, expr1_0); - let expr3_0: Type = I64; - let expr4_0: Type = I64; - let expr5_0: u64 = 128i128 as u64; - let expr6_0 = constructor_imm(ctx, expr4_0, expr5_0); - let expr7_0 = C::gpr_new(ctx, expr6_0); - let expr8_0 = C::gpr_to_gpr_mem_imm(ctx, expr1_0); - let expr9_0 = constructor_x64_sub(ctx, expr3_0, expr7_0, &expr8_0); - let expr10_0 = constructor_shr_i128(ctx, expr0_0, expr9_0); - let expr11_0 = constructor_or_i128(ctx, expr2_0, expr10_0); - let expr12_0 = C::output(ctx, expr11_0); - return Some(expr12_0); - } - &Opcode::Rotr => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 758. - let expr0_0 = C::put_in_regs(ctx, pattern7_0); - let expr1_0 = constructor_lo_gpr(ctx, pattern7_1); - let expr2_0 = constructor_shr_i128(ctx, expr0_0, expr1_0); - let expr3_0: Type = I64; - let expr4_0: Type = I64; - let expr5_0: u64 = 128i128 as u64; - let expr6_0 = constructor_imm(ctx, expr4_0, expr5_0); - let expr7_0 = C::gpr_new(ctx, expr6_0); - let expr8_0 = C::gpr_to_gpr_mem_imm(ctx, expr1_0); - let expr9_0 = constructor_x64_sub(ctx, expr3_0, expr7_0, &expr8_0); - let expr10_0 = constructor_shl_i128(ctx, expr0_0, expr9_0); - let expr11_0 = constructor_or_i128(ctx, expr2_0, expr10_0); - let expr12_0 = C::output(ctx, expr11_0); - return Some(expr12_0); - } - &Opcode::Ishl => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 431. - let expr0_0 = constructor_lo_gpr(ctx, pattern7_1); - let expr1_0 = C::put_in_regs(ctx, pattern7_0); - let expr2_0 = constructor_shl_i128(ctx, expr1_0, expr0_0); - let expr3_0 = C::output(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::Ushr => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 540. - let expr0_0 = constructor_lo_gpr(ctx, pattern7_1); - let expr1_0 = C::put_in_regs(ctx, pattern7_0); - let expr2_0 = constructor_shr_i128(ctx, expr1_0, expr0_0); - let expr3_0 = C::output(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::Sshr => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 650. - let expr0_0 = constructor_lo_gpr(ctx, pattern7_1); - let expr1_0 = C::put_in_regs(ctx, pattern7_0); - let expr2_0 = constructor_sar_i128(ctx, expr1_0, expr0_0); - let expr3_0 = C::output(ctx, expr2_0); - return Some(expr3_0); - } - _ => {} - } - } - _ => {} - } - } - if pattern2_0 == F32 { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - match &pattern4_0 { - &InstructionData::Unary { - opcode: ref pattern5_0, - arg: pattern5_1, - } => { - match pattern5_0 { - &Opcode::Sqrt => { - // Rule at src/isa/x64/lower.isle line 2281. - let expr0_0 = constructor_put_in_xmm(ctx, pattern5_1); - let expr1_0 = constructor_x64_sqrtss(ctx, expr0_0); - let expr2_0 = constructor_output_xmm(ctx, expr1_0); - return Some(expr2_0); - } - &Opcode::Fneg => { - // Rule at src/isa/x64/lower.isle line 1154. - let expr0_0 = constructor_put_in_xmm(ctx, pattern5_1); - let expr1_0: Type = F32; - let expr2_0: u64 = 2147483648i128 as u64; - let expr3_0 = constructor_imm(ctx, expr1_0, expr2_0); - let expr4_0 = constructor_reg_to_xmm_mem(ctx, expr3_0); - let expr5_0 = constructor_x64_xorps(ctx, expr0_0, &expr4_0); - let expr6_0 = constructor_output_xmm(ctx, expr5_0); - return Some(expr6_0); - } - &Opcode::Fabs => { - // Rule at src/isa/x64/lower.isle line 1134. - let expr0_0 = constructor_put_in_xmm(ctx, pattern5_1); - let expr1_0: Type = F32; - let expr2_0: u64 = 2147483647i128 as u64; - let expr3_0 = constructor_imm(ctx, expr1_0, expr2_0); - let expr4_0 = constructor_reg_to_xmm_mem(ctx, expr3_0); - let expr5_0 = constructor_x64_andps(ctx, expr0_0, &expr4_0); - let expr6_0 = constructor_output_xmm(ctx, expr5_0); - return Some(expr6_0); - } - &Opcode::Fdemote => { - // Rule at src/isa/x64/lower.isle line 2299. - let expr0_0 = constructor_put_in_xmm(ctx, pattern5_1); - let expr1_0 = constructor_x64_cvtsd2ss(ctx, expr0_0); - let expr2_0 = constructor_output_xmm(ctx, expr1_0); - return Some(expr2_0); - } - _ => {} - } - } - &InstructionData::LoadNoOffset { - opcode: ref pattern5_0, - arg: pattern5_1, - flags: pattern5_2, - } => { - if let &Opcode::Bitcast = pattern5_0 { - let pattern7_0 = C::value_type(ctx, pattern5_1); - if pattern7_0 == I32 { - // Rule at src/isa/x64/lower.isle line 3323. - let expr0_0: Type = I32; - let expr1_0 = constructor_put_in_gpr(ctx, pattern5_1); - let expr2_0 = constructor_bitcast_gpr_to_xmm(ctx, expr0_0, expr1_0); - let expr3_0 = constructor_output_xmm(ctx, expr2_0); - return Some(expr3_0); - } - } - } - &InstructionData::Load { - opcode: ref pattern5_0, - arg: pattern5_1, - flags: pattern5_2, - offset: pattern5_3, - } => { - if let &Opcode::Load = pattern5_0 { - // Rule at src/isa/x64/lower.isle line 2546. - let expr0_0 = constructor_to_amode(ctx, pattern5_2, pattern5_1, pattern5_3); - let expr1_0 = constructor_amode_to_xmm_mem(ctx, &expr0_0); - let expr2_0 = constructor_x64_movss_load(ctx, &expr1_0); - let expr3_0 = constructor_output_xmm(ctx, expr2_0); - return Some(expr3_0); - } - } - &InstructionData::Binary { - opcode: ref pattern5_0, - args: ref pattern5_1, - } => { - match pattern5_0 { - &Opcode::Fadd => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 2238. - let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0); - let expr1_0 = C::put_in_xmm_mem(ctx, pattern7_1); - let expr2_0 = constructor_x64_addss(ctx, expr0_0, &expr1_0); - let expr3_0 = constructor_output_xmm(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::Fsub => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 2249. - let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0); - let expr1_0 = C::put_in_xmm_mem(ctx, pattern7_1); - let expr2_0 = constructor_x64_subss(ctx, expr0_0, &expr1_0); - let expr3_0 = constructor_output_xmm(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::Fmul => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 2260. - let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0); - let expr1_0 = C::put_in_xmm_mem(ctx, pattern7_1); - let expr2_0 = constructor_x64_mulss(ctx, expr0_0, &expr1_0); - let expr3_0 = constructor_output_xmm(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::Fdiv => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 2271. - let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0); - let expr1_0 = C::put_in_xmm_mem(ctx, pattern7_1); - let expr2_0 = constructor_x64_divss(ctx, expr0_0, &expr1_0); - let expr3_0 = constructor_output_xmm(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::Fcopysign => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - let pattern8_0 = C::value_type(ctx, pattern7_0); - if pattern8_0 == F32 { - // Rule at src/isa/x64/lower.isle line 3342. - let expr0_0: Type = F32; - let expr1_0: u64 = 2147483648i128 as u64; - let expr2_0 = constructor_imm(ctx, expr0_0, expr1_0); - let expr3_0 = C::xmm_new(ctx, expr2_0); - let expr4_0 = C::put_in_xmm_mem(ctx, pattern7_0); - let expr5_0 = constructor_x64_andnps(ctx, expr3_0, &expr4_0); - let expr6_0 = C::put_in_xmm_mem(ctx, pattern7_1); - let expr7_0 = constructor_x64_andps(ctx, expr3_0, &expr6_0); - let expr8_0 = C::xmm_to_xmm_mem(ctx, expr7_0); - let expr9_0 = constructor_x64_orps(ctx, expr5_0, &expr8_0); - let expr10_0 = constructor_output_xmm(ctx, expr9_0); - return Some(expr10_0); - } - } - &Opcode::Fmin => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 2308. - let expr0_0: Type = F32; - let expr1_0: bool = true; - let expr2_0 = constructor_put_in_xmm(ctx, pattern7_0); - let expr3_0 = constructor_put_in_xmm(ctx, pattern7_1); - let expr4_0 = constructor_xmm_min_max_seq( - ctx, expr0_0, expr1_0, expr2_0, expr3_0, - ); - let expr5_0 = constructor_output_xmm(ctx, expr4_0); - return Some(expr5_0); - } - &Opcode::FminPseudo => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 2477. - let expr0_0 = constructor_put_in_xmm(ctx, pattern7_1); - let expr1_0 = constructor_put_in_xmm(ctx, pattern7_0); - let expr2_0 = constructor_x64_minss(ctx, expr0_0, expr1_0); - let expr3_0 = constructor_output_xmm(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::Fmax => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 2380. - let expr0_0: Type = F32; - let expr1_0: bool = false; - let expr2_0 = constructor_put_in_xmm(ctx, pattern7_0); - let expr3_0 = constructor_put_in_xmm(ctx, pattern7_1); - let expr4_0 = constructor_xmm_min_max_seq( - ctx, expr0_0, expr1_0, expr2_0, expr3_0, - ); - let expr5_0 = constructor_output_xmm(ctx, expr4_0); - return Some(expr5_0); - } - &Opcode::FmaxPseudo => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 2488. - let expr0_0 = constructor_put_in_xmm(ctx, pattern7_1); - let expr1_0 = constructor_put_in_xmm(ctx, pattern7_0); - let expr2_0 = constructor_x64_maxss(ctx, expr0_0, expr1_0); - let expr3_0 = constructor_output_xmm(ctx, expr2_0); - return Some(expr3_0); - } - _ => {} - } - } - &InstructionData::Ternary { - opcode: ref pattern5_0, - args: ref pattern5_1, - } => { - if let &Opcode::Fma = pattern5_0 { - let (pattern7_0, pattern7_1, pattern7_2) = - C::unpack_value_array_3(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 2499. - let expr0_0 = LibCall::FmaF32; - let expr1_0 = C::put_in_reg(ctx, pattern7_0); - let expr2_0 = C::put_in_reg(ctx, pattern7_1); - let expr3_0 = C::put_in_reg(ctx, pattern7_2); - let expr4_0 = C::libcall_3(ctx, &expr0_0, expr1_0, expr2_0, expr3_0); - let expr5_0 = constructor_output_reg(ctx, expr4_0); - return Some(expr5_0); - } - } - _ => {} - } - } - if pattern2_0 == F64 { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - match &pattern4_0 { - &InstructionData::Unary { - opcode: ref pattern5_0, - arg: pattern5_1, - } => { - match pattern5_0 { - &Opcode::Sqrt => { - // Rule at src/isa/x64/lower.isle line 2283. - let expr0_0 = constructor_put_in_xmm(ctx, pattern5_1); - let expr1_0 = constructor_x64_sqrtsd(ctx, expr0_0); - let expr2_0 = constructor_output_xmm(ctx, expr1_0); - return Some(expr2_0); - } - &Opcode::Fneg => { - // Rule at src/isa/x64/lower.isle line 1157. - let expr0_0 = constructor_put_in_xmm(ctx, pattern5_1); - let expr1_0: Type = F64; - let expr2_0: u64 = 9223372036854775808i128 as u64; - let expr3_0 = constructor_imm(ctx, expr1_0, expr2_0); - let expr4_0 = constructor_reg_to_xmm_mem(ctx, expr3_0); - let expr5_0 = constructor_x64_xorpd(ctx, expr0_0, &expr4_0); - let expr6_0 = constructor_output_xmm(ctx, expr5_0); - return Some(expr6_0); - } - &Opcode::Fabs => { - // Rule at src/isa/x64/lower.isle line 1137. - let expr0_0 = constructor_put_in_xmm(ctx, pattern5_1); - let expr1_0: Type = F64; - let expr2_0: u64 = 9223372036854775807i128 as u64; - let expr3_0 = constructor_imm(ctx, expr1_0, expr2_0); - let expr4_0 = constructor_reg_to_xmm_mem(ctx, expr3_0); - let expr5_0 = constructor_x64_andpd(ctx, expr0_0, &expr4_0); - let expr6_0 = constructor_output_xmm(ctx, expr5_0); - return Some(expr6_0); - } - &Opcode::Fpromote => { - // Rule at src/isa/x64/lower.isle line 2291. - let expr0_0 = constructor_put_in_xmm(ctx, pattern5_1); - let expr1_0 = constructor_x64_cvtss2sd(ctx, expr0_0); - let expr2_0 = constructor_output_xmm(ctx, expr1_0); - return Some(expr2_0); - } - _ => {} - } - } - &InstructionData::LoadNoOffset { - opcode: ref pattern5_0, - arg: pattern5_1, - flags: pattern5_2, - } => { - if let &Opcode::Bitcast = pattern5_0 { - let pattern7_0 = C::value_type(ctx, pattern5_1); - if pattern7_0 == I64 { - // Rule at src/isa/x64/lower.isle line 3329. - let expr0_0: Type = I64; - let expr1_0 = constructor_put_in_gpr(ctx, pattern5_1); - let expr2_0 = constructor_bitcast_gpr_to_xmm(ctx, expr0_0, expr1_0); - let expr3_0 = constructor_output_xmm(ctx, expr2_0); - return Some(expr3_0); - } - } - } - &InstructionData::Load { - opcode: ref pattern5_0, - arg: pattern5_1, - flags: pattern5_2, - offset: pattern5_3, - } => { - if let &Opcode::Load = pattern5_0 { - // Rule at src/isa/x64/lower.isle line 2548. - let expr0_0 = constructor_to_amode(ctx, pattern5_2, pattern5_1, pattern5_3); - let expr1_0 = constructor_amode_to_xmm_mem(ctx, &expr0_0); - let expr2_0 = constructor_x64_movsd_load(ctx, &expr1_0); - let expr3_0 = constructor_output_xmm(ctx, expr2_0); - return Some(expr3_0); - } - } - &InstructionData::Binary { - opcode: ref pattern5_0, - args: ref pattern5_1, - } => { - match pattern5_0 { - &Opcode::Fadd => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 2240. - let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0); - let expr1_0 = C::put_in_xmm_mem(ctx, pattern7_1); - let expr2_0 = constructor_x64_addsd(ctx, expr0_0, &expr1_0); - let expr3_0 = constructor_output_xmm(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::Fsub => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 2251. - let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0); - let expr1_0 = C::put_in_xmm_mem(ctx, pattern7_1); - let expr2_0 = constructor_x64_subsd(ctx, expr0_0, &expr1_0); - let expr3_0 = constructor_output_xmm(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::Fmul => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 2262. - let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0); - let expr1_0 = C::put_in_xmm_mem(ctx, pattern7_1); - let expr2_0 = constructor_x64_mulsd(ctx, expr0_0, &expr1_0); - let expr3_0 = constructor_output_xmm(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::Fdiv => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 2273. - let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0); - let expr1_0 = C::put_in_xmm_mem(ctx, pattern7_1); - let expr2_0 = constructor_x64_divsd(ctx, expr0_0, &expr1_0); - let expr3_0 = constructor_output_xmm(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::Fcopysign => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - let pattern8_0 = C::value_type(ctx, pattern7_0); - if pattern8_0 == F64 { - // Rule at src/isa/x64/lower.isle line 3348. - let expr0_0: Type = F64; - let expr1_0: u64 = 9223372036854775808i128 as u64; - let expr2_0 = constructor_imm(ctx, expr0_0, expr1_0); - let expr3_0 = C::xmm_new(ctx, expr2_0); - let expr4_0 = C::put_in_xmm_mem(ctx, pattern7_0); - let expr5_0 = constructor_x64_andnpd(ctx, expr3_0, &expr4_0); - let expr6_0 = C::put_in_xmm_mem(ctx, pattern7_1); - let expr7_0 = constructor_x64_andpd(ctx, expr3_0, &expr6_0); - let expr8_0 = C::xmm_to_xmm_mem(ctx, expr7_0); - let expr9_0 = constructor_x64_orpd(ctx, expr5_0, &expr8_0); - let expr10_0 = constructor_output_xmm(ctx, expr9_0); - return Some(expr10_0); - } - } - &Opcode::Fmin => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 2310. - let expr0_0: Type = F64; - let expr1_0: bool = true; - let expr2_0 = constructor_put_in_xmm(ctx, pattern7_0); - let expr3_0 = constructor_put_in_xmm(ctx, pattern7_1); - let expr4_0 = constructor_xmm_min_max_seq( - ctx, expr0_0, expr1_0, expr2_0, expr3_0, - ); - let expr5_0 = constructor_output_xmm(ctx, expr4_0); - return Some(expr5_0); - } - &Opcode::FminPseudo => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 2479. - let expr0_0 = constructor_put_in_xmm(ctx, pattern7_1); - let expr1_0 = constructor_put_in_xmm(ctx, pattern7_0); - let expr2_0 = constructor_x64_minsd(ctx, expr0_0, expr1_0); - let expr3_0 = constructor_output_xmm(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::Fmax => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 2382. - let expr0_0: Type = F64; - let expr1_0: bool = false; - let expr2_0 = constructor_put_in_xmm(ctx, pattern7_0); - let expr3_0 = constructor_put_in_xmm(ctx, pattern7_1); - let expr4_0 = constructor_xmm_min_max_seq( - ctx, expr0_0, expr1_0, expr2_0, expr3_0, - ); - let expr5_0 = constructor_output_xmm(ctx, expr4_0); - return Some(expr5_0); - } - &Opcode::FmaxPseudo => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 2490. - let expr0_0 = constructor_put_in_xmm(ctx, pattern7_1); - let expr1_0 = constructor_put_in_xmm(ctx, pattern7_0); - let expr2_0 = constructor_x64_maxsd(ctx, expr0_0, expr1_0); - let expr3_0 = constructor_output_xmm(ctx, expr2_0); - return Some(expr3_0); - } - _ => {} - } - } - &InstructionData::Ternary { - opcode: ref pattern5_0, - args: ref pattern5_1, - } => { - if let &Opcode::Fma = pattern5_0 { - let (pattern7_0, pattern7_1, pattern7_2) = - C::unpack_value_array_3(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 2501. - let expr0_0 = LibCall::FmaF64; - let expr1_0 = C::put_in_reg(ctx, pattern7_0); - let expr2_0 = C::put_in_reg(ctx, pattern7_1); - let expr3_0 = C::put_in_reg(ctx, pattern7_2); - let expr4_0 = C::libcall_3(ctx, &expr0_0, expr1_0, expr2_0, expr3_0); - let expr5_0 = constructor_output_reg(ctx, expr4_0); - return Some(expr5_0); - } - } - _ => {} - } - } - if pattern2_0 == I8X16 { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - match &pattern4_0 { - &InstructionData::Unary { - opcode: ref pattern5_0, - arg: pattern5_1, - } => { - match pattern5_0 { - &Opcode::Ineg => { - // Rule at src/isa/x64/lower.isle line 786. - let expr0_0: Type = I8X16; - let expr1_0: u64 = 0i128 as u64; - let expr2_0 = constructor_imm(ctx, expr0_0, expr1_0); - let expr3_0 = C::xmm_new(ctx, expr2_0); - let expr4_0 = C::put_in_xmm_mem(ctx, pattern5_1); - let expr5_0 = constructor_x64_psubb(ctx, expr3_0, &expr4_0); - let expr6_0 = constructor_output_xmm(ctx, expr5_0); - return Some(expr6_0); - } - &Opcode::Iabs => { - // Rule at src/isa/x64/lower.isle line 1107. - let expr0_0 = C::put_in_xmm_mem(ctx, pattern5_1); - let expr1_0 = constructor_x64_pabsb(ctx, &expr0_0); - let expr2_0 = constructor_output_xmm(ctx, expr1_0); - return Some(expr2_0); - } - &Opcode::Popcnt => { - // Rule at src/isa/x64/lower.isle line 1984. - let expr0_0 = C::popcount_4bit_table(ctx); - let expr1_0: Type = I8X16; - let expr2_0 = C::popcount_low_mask(ctx); - let expr3_0 = constructor_x64_xmm_load_const(ctx, expr1_0, expr2_0); - let expr4_0: Type = I8X16; - let expr5_0 = constructor_put_in_xmm(ctx, pattern5_1); - let expr6_0 = C::xmm_to_xmm_mem(ctx, expr3_0); - let expr7_0 = constructor_sse_and(ctx, expr4_0, expr5_0, &expr6_0); - let expr8_0 = constructor_put_in_xmm(ctx, pattern5_1); - let expr9_0: u32 = 4i128 as u32; - let expr10_0 = RegMemImm::Imm { simm32: expr9_0 }; - let expr11_0 = constructor_mov_rmi_to_xmm(ctx, &expr10_0); - let expr12_0 = constructor_x64_psrlw(ctx, expr8_0, &expr11_0); - let expr13_0: Type = I8X16; - let expr14_0 = C::xmm_to_xmm_mem(ctx, expr3_0); - let expr15_0 = constructor_sse_and(ctx, expr13_0, expr12_0, &expr14_0); - let expr16_0: Type = I8X16; - let expr17_0 = C::popcount_4bit_table(ctx); - let expr18_0 = constructor_x64_xmm_load_const(ctx, expr16_0, expr17_0); - let expr19_0 = C::xmm_to_xmm_mem(ctx, expr7_0); - let expr20_0 = constructor_x64_pshufb(ctx, expr18_0, &expr19_0); - let expr21_0 = C::xmm_to_xmm_mem(ctx, expr15_0); - let expr22_0 = constructor_x64_pshufb(ctx, expr18_0, &expr21_0); - let expr23_0 = C::xmm_to_xmm_mem(ctx, expr22_0); - let expr24_0 = constructor_x64_paddb(ctx, expr20_0, &expr23_0); - let expr25_0 = constructor_output_xmm(ctx, expr24_0); - return Some(expr25_0); - } - _ => {} - } - } - &InstructionData::Binary { - opcode: ref pattern5_0, - args: ref pattern5_1, - } => { - match pattern5_0 { - &Opcode::Smin => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 1394. - let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0); - let expr1_0 = C::put_in_xmm_mem(ctx, pattern7_1); - let expr2_0 = constructor_x64_pminsb(ctx, expr0_0, &expr1_0); - let expr3_0 = constructor_output_xmm(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::Umin => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 1416. - let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0); - let expr1_0 = C::put_in_xmm_mem(ctx, pattern7_1); - let expr2_0 = constructor_x64_pminub(ctx, expr0_0, &expr1_0); - let expr3_0 = constructor_output_xmm(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::Smax => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 1383. - let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0); - let expr1_0 = C::put_in_xmm_mem(ctx, pattern7_1); - let expr2_0 = constructor_x64_pmaxsb(ctx, expr0_0, &expr1_0); - let expr3_0 = constructor_output_xmm(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::Umax => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 1405. - let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0); - let expr1_0 = C::put_in_xmm_mem(ctx, pattern7_1); - let expr2_0 = constructor_x64_pmaxub(ctx, expr0_0, &expr1_0); - let expr3_0 = constructor_output_xmm(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::Ishl => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 443. - let expr0_0: Type = I64; - let expr1_0 = constructor_put_in_gpr(ctx, pattern7_1); - let expr2_0 = C::shift_mask(ctx, pattern2_0); - let expr3_0 = RegMemImm::Imm { simm32: expr2_0 }; - let expr4_0 = C::gpr_mem_imm_new(ctx, &expr3_0); - let expr5_0 = constructor_x64_and(ctx, expr0_0, expr1_0, &expr4_0); - let expr6_0 = C::gpr_to_reg(ctx, expr5_0); - let expr7_0 = constructor_put_in_xmm(ctx, pattern7_0); - let expr8_0 = C::reg_to_reg_mem_imm(ctx, expr6_0); - let expr9_0 = constructor_mov_rmi_to_xmm(ctx, &expr8_0); - let expr10_0 = constructor_x64_psllw(ctx, expr7_0, &expr9_0); - let expr11_0 = C::reg_to_reg_mem_imm(ctx, expr6_0); - let expr12_0 = constructor_ishl_i8x16_mask(ctx, &expr11_0); - let expr13_0: Type = I8X16; - let expr14_0 = ExtKind::None; - let expr15_0 = - constructor_x64_load(ctx, expr13_0, &expr12_0, &expr14_0); - let expr16_0: Type = I8X16; - let expr17_0 = RegMem::Reg { reg: expr15_0 }; - let expr18_0 = C::reg_mem_to_xmm_mem(ctx, &expr17_0); - let expr19_0 = constructor_sse_and(ctx, expr16_0, expr10_0, &expr18_0); - let expr20_0 = constructor_output_xmm(ctx, expr19_0); - return Some(expr20_0); - } - &Opcode::Ushr => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 550. - let expr0_0: Type = I64; - let expr1_0 = constructor_put_in_gpr(ctx, pattern7_1); - let expr2_0 = C::shift_mask(ctx, pattern2_0); - let expr3_0 = RegMemImm::Imm { simm32: expr2_0 }; - let expr4_0 = C::gpr_mem_imm_new(ctx, &expr3_0); - let expr5_0 = constructor_x64_and(ctx, expr0_0, expr1_0, &expr4_0); - let expr6_0 = C::gpr_to_reg(ctx, expr5_0); - let expr7_0 = constructor_put_in_xmm(ctx, pattern7_0); - let expr8_0 = C::reg_to_reg_mem_imm(ctx, expr6_0); - let expr9_0 = constructor_mov_rmi_to_xmm(ctx, &expr8_0); - let expr10_0 = constructor_x64_psrlw(ctx, expr7_0, &expr9_0); - let expr11_0 = C::reg_to_reg_mem_imm(ctx, expr6_0); - let expr12_0 = constructor_ushr_i8x16_mask(ctx, &expr11_0); - let expr13_0: Type = I8X16; - let expr14_0 = ExtKind::None; - let expr15_0 = - constructor_x64_load(ctx, expr13_0, &expr12_0, &expr14_0); - let expr16_0: Type = I8X16; - let expr17_0 = RegMem::Reg { reg: expr15_0 }; - let expr18_0 = C::reg_mem_to_xmm_mem(ctx, &expr17_0); - let expr19_0 = constructor_sse_and(ctx, expr16_0, expr10_0, &expr18_0); - let expr20_0 = constructor_output_xmm(ctx, expr19_0); - return Some(expr20_0); - } - &Opcode::Sshr => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - let pattern8_0 = C::value_type(ctx, pattern7_1); - // Rule at src/isa/x64/lower.isle line 671. - let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0); - let expr1_0: Type = I64; - let expr2_0 = constructor_put_in_gpr(ctx, pattern7_1); - let expr3_0 = C::shift_mask(ctx, pattern2_0); - let expr4_0 = RegMemImm::Imm { simm32: expr3_0 }; - let expr5_0 = C::gpr_mem_imm_new(ctx, &expr4_0); - let expr6_0 = constructor_x64_and(ctx, expr1_0, expr2_0, &expr5_0); - let expr7_0 = C::gpr_to_reg(ctx, expr6_0); - let expr8_0 = C::xmm_to_xmm_mem(ctx, expr0_0); - let expr9_0 = constructor_x64_punpcklbw(ctx, expr0_0, &expr8_0); - let expr10_0 = C::xmm_to_xmm_mem(ctx, expr0_0); - let expr11_0 = constructor_x64_punpckhbw(ctx, expr0_0, &expr10_0); - let expr12_0 = C::reg_to_reg_mem_imm(ctx, expr7_0); - let expr13_0 = - constructor_sshr_i8x16_bigger_shift(ctx, pattern8_0, &expr12_0); - let expr14_0 = constructor_x64_psraw(ctx, expr9_0, &expr13_0); - let expr15_0 = constructor_x64_psraw(ctx, expr11_0, &expr13_0); - let expr16_0 = C::xmm_to_xmm_mem(ctx, expr15_0); - let expr17_0 = constructor_x64_packsswb(ctx, expr14_0, &expr16_0); - let expr18_0 = constructor_output_xmm(ctx, expr17_0); - return Some(expr18_0); - } - &Opcode::Snarrow => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - let pattern8_0 = C::value_type(ctx, pattern7_0); - if pattern8_0 == I16X8 { - // Rule at src/isa/x64/lower.isle line 3275. - let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0); - let expr1_0 = C::put_in_xmm_mem(ctx, pattern7_1); - let expr2_0 = constructor_x64_packsswb(ctx, expr0_0, &expr1_0); - let expr3_0 = constructor_output_xmm(ctx, expr2_0); - return Some(expr3_0); - } - } - &Opcode::Unarrow => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - let pattern8_0 = C::value_type(ctx, pattern7_0); - if pattern8_0 == I16X8 { - // Rule at src/isa/x64/lower.isle line 3309. - let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0); - let expr1_0 = C::put_in_xmm_mem(ctx, pattern7_1); - let expr2_0 = constructor_x64_packuswb(ctx, expr0_0, &expr1_0); - let expr3_0 = constructor_output_xmm(ctx, expr2_0); - return Some(expr3_0); - } - } - _ => {} - } - } - _ => {} - } - } - if pattern2_0 == I16X8 { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - match &pattern4_0 { - &InstructionData::Unary { - opcode: ref pattern5_0, - arg: pattern5_1, - } => { - match pattern5_0 { - &Opcode::Ineg => { - // Rule at src/isa/x64/lower.isle line 789. - let expr0_0: Type = I16X8; - let expr1_0: u64 = 0i128 as u64; - let expr2_0 = constructor_imm(ctx, expr0_0, expr1_0); - let expr3_0 = C::xmm_new(ctx, expr2_0); - let expr4_0 = C::put_in_xmm_mem(ctx, pattern5_1); - let expr5_0 = constructor_x64_psubw(ctx, expr3_0, &expr4_0); - let expr6_0 = constructor_output_xmm(ctx, expr5_0); - return Some(expr6_0); - } - &Opcode::Iabs => { - // Rule at src/isa/x64/lower.isle line 1110. - let expr0_0 = C::put_in_xmm_mem(ctx, pattern5_1); - let expr1_0 = constructor_x64_pabsw(ctx, &expr0_0); - let expr2_0 = constructor_output_xmm(ctx, expr1_0); - return Some(expr2_0); - } - &Opcode::SwidenLow => { - let pattern7_0 = C::value_type(ctx, pattern5_1); - if pattern7_0 == I8X16 { - // Rule at src/isa/x64/lower.isle line 3227. - let expr0_0 = C::put_in_xmm_mem(ctx, pattern5_1); - let expr1_0 = constructor_x64_pmovsxbw(ctx, &expr0_0); - let expr2_0 = constructor_output_xmm(ctx, expr1_0); - return Some(expr2_0); - } - } - &Opcode::SwidenHigh => { - let pattern7_0 = C::value_type(ctx, pattern5_1); - if pattern7_0 == I8X16 { - // Rule at src/isa/x64/lower.isle line 3238. - let expr0_0 = constructor_put_in_xmm(ctx, pattern5_1); - let expr1_0 = C::xmm_to_xmm_mem(ctx, expr0_0); - let expr2_0: u8 = 8i128 as u8; - let expr3_0 = OperandSize::Size32; - let expr4_0 = constructor_x64_palignr( - ctx, expr0_0, &expr1_0, expr2_0, &expr3_0, - ); - let expr5_0 = C::xmm_to_xmm_mem(ctx, expr4_0); - let expr6_0 = constructor_x64_pmovsxbw(ctx, &expr5_0); - let expr7_0 = constructor_output_xmm(ctx, expr6_0); - return Some(expr7_0); - } - } - &Opcode::UwidenLow => { - let pattern7_0 = C::value_type(ctx, pattern5_1); - if pattern7_0 == I8X16 { - // Rule at src/isa/x64/lower.isle line 3251. - let expr0_0 = C::put_in_xmm_mem(ctx, pattern5_1); - let expr1_0 = constructor_x64_pmovzxbw(ctx, &expr0_0); - let expr2_0 = constructor_output_xmm(ctx, expr1_0); - return Some(expr2_0); - } - } - &Opcode::UwidenHigh => { - let pattern7_0 = C::value_type(ctx, pattern5_1); - if pattern7_0 == I8X16 { - // Rule at src/isa/x64/lower.isle line 3262. - let expr0_0 = constructor_put_in_xmm(ctx, pattern5_1); - let expr1_0 = C::xmm_to_xmm_mem(ctx, expr0_0); - let expr2_0: u8 = 8i128 as u8; - let expr3_0 = OperandSize::Size32; - let expr4_0 = constructor_x64_palignr( - ctx, expr0_0, &expr1_0, expr2_0, &expr3_0, - ); - let expr5_0 = C::xmm_to_xmm_mem(ctx, expr4_0); - let expr6_0 = constructor_x64_pmovzxbw(ctx, &expr5_0); - let expr7_0 = constructor_output_xmm(ctx, expr6_0); - return Some(expr7_0); - } - } - _ => {} - } - } - &InstructionData::Load { - opcode: ref pattern5_0, - arg: pattern5_1, - flags: pattern5_2, - offset: pattern5_3, - } => { - match pattern5_0 { - &Opcode::Uload8x8 => { - // Rule at src/isa/x64/lower.isle line 2570. - let expr0_0 = - constructor_to_amode(ctx, pattern5_2, pattern5_1, pattern5_3); - let expr1_0 = constructor_amode_to_xmm_mem(ctx, &expr0_0); - let expr2_0 = constructor_x64_pmovzxbw(ctx, &expr1_0); - let expr3_0 = constructor_output_xmm(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::Sload8x8 => { - // Rule at src/isa/x64/lower.isle line 2568. - let expr0_0 = - constructor_to_amode(ctx, pattern5_2, pattern5_1, pattern5_3); - let expr1_0 = constructor_amode_to_xmm_mem(ctx, &expr0_0); - let expr2_0 = constructor_x64_pmovsxbw(ctx, &expr1_0); - let expr3_0 = constructor_output_xmm(ctx, expr2_0); - return Some(expr3_0); - } - _ => {} - } - } - &InstructionData::Binary { - opcode: ref pattern5_0, - args: ref pattern5_1, - } => { - match pattern5_0 { - &Opcode::Smin => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 1397. - let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0); - let expr1_0 = C::put_in_xmm_mem(ctx, pattern7_1); - let expr2_0 = constructor_x64_pminsw(ctx, expr0_0, &expr1_0); - let expr3_0 = constructor_output_xmm(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::Umin => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 1419. - let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0); - let expr1_0 = C::put_in_xmm_mem(ctx, pattern7_1); - let expr2_0 = constructor_x64_pminuw(ctx, expr0_0, &expr1_0); - let expr3_0 = constructor_output_xmm(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::Smax => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 1386. - let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0); - let expr1_0 = C::put_in_xmm_mem(ctx, pattern7_1); - let expr2_0 = constructor_x64_pmaxsw(ctx, expr0_0, &expr1_0); - let expr3_0 = constructor_output_xmm(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::Umax => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 1408. - let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0); - let expr1_0 = C::put_in_xmm_mem(ctx, pattern7_1); - let expr2_0 = constructor_x64_pmaxuw(ctx, expr0_0, &expr1_0); - let expr3_0 = constructor_output_xmm(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::Ishl => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 487. - let expr0_0: Type = I64; - let expr1_0 = constructor_put_in_gpr(ctx, pattern7_1); - let expr2_0 = C::shift_mask(ctx, pattern2_0); - let expr3_0 = RegMemImm::Imm { simm32: expr2_0 }; - let expr4_0 = C::gpr_mem_imm_new(ctx, &expr3_0); - let expr5_0 = constructor_x64_and(ctx, expr0_0, expr1_0, &expr4_0); - let expr6_0 = C::gpr_to_reg(ctx, expr5_0); - let expr7_0 = constructor_put_in_xmm(ctx, pattern7_0); - let expr8_0 = C::reg_to_reg_mem_imm(ctx, expr6_0); - let expr9_0 = constructor_mov_rmi_to_xmm(ctx, &expr8_0); - let expr10_0 = constructor_x64_psllw(ctx, expr7_0, &expr9_0); - let expr11_0 = constructor_output_xmm(ctx, expr10_0); - return Some(expr11_0); - } - &Opcode::Ushr => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 597. - let expr0_0: Type = I64; - let expr1_0 = constructor_put_in_gpr(ctx, pattern7_1); - let expr2_0 = C::shift_mask(ctx, pattern2_0); - let expr3_0 = RegMemImm::Imm { simm32: expr2_0 }; - let expr4_0 = C::gpr_mem_imm_new(ctx, &expr3_0); - let expr5_0 = constructor_x64_and(ctx, expr0_0, expr1_0, &expr4_0); - let expr6_0 = C::gpr_to_reg(ctx, expr5_0); - let expr7_0 = constructor_put_in_xmm(ctx, pattern7_0); - let expr8_0 = C::reg_to_reg_mem_imm(ctx, expr6_0); - let expr9_0 = constructor_mov_rmi_to_xmm(ctx, &expr8_0); - let expr10_0 = constructor_x64_psrlw(ctx, expr7_0, &expr9_0); - let expr11_0 = constructor_output_xmm(ctx, expr10_0); - return Some(expr11_0); - } - &Opcode::Sshr => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 700. - let expr0_0: Type = I64; - let expr1_0 = constructor_put_in_gpr(ctx, pattern7_1); - let expr2_0 = C::shift_mask(ctx, pattern2_0); - let expr3_0 = RegMemImm::Imm { simm32: expr2_0 }; - let expr4_0 = C::gpr_mem_imm_new(ctx, &expr3_0); - let expr5_0 = constructor_x64_and(ctx, expr0_0, expr1_0, &expr4_0); - let expr6_0 = C::gpr_to_reg(ctx, expr5_0); - let expr7_0 = constructor_put_in_xmm(ctx, pattern7_0); - let expr8_0 = C::reg_to_reg_mem_imm(ctx, expr6_0); - let expr9_0 = constructor_mov_rmi_to_xmm(ctx, &expr8_0); - let expr10_0 = constructor_x64_psraw(ctx, expr7_0, &expr9_0); - let expr11_0 = constructor_output_xmm(ctx, expr10_0); - return Some(expr11_0); - } - &Opcode::Snarrow => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - let pattern8_0 = C::value_type(ctx, pattern7_0); - if pattern8_0 == I32X4 { - // Rule at src/isa/x64/lower.isle line 3278. - let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0); - let expr1_0 = C::put_in_xmm_mem(ctx, pattern7_1); - let expr2_0 = constructor_x64_packssdw(ctx, expr0_0, &expr1_0); - let expr3_0 = constructor_output_xmm(ctx, expr2_0); - return Some(expr3_0); - } - } - &Opcode::Unarrow => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - let pattern8_0 = C::value_type(ctx, pattern7_0); - if pattern8_0 == I32X4 { - // Rule at src/isa/x64/lower.isle line 3312. - let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0); - let expr1_0 = C::put_in_xmm_mem(ctx, pattern7_1); - let expr2_0 = constructor_x64_packusdw(ctx, expr0_0, &expr1_0); - let expr3_0 = constructor_output_xmm(ctx, expr2_0); - return Some(expr3_0); - } - } - &Opcode::IaddPairwise => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - if let Some(pattern8_0) = C::def_inst(ctx, pattern7_0) { - let pattern9_0 = C::inst_data(ctx, pattern8_0); - if let &InstructionData::Unary { - opcode: ref pattern10_0, - arg: pattern10_1, - } = &pattern9_0 - { - match pattern10_0 { - &Opcode::SwidenLow => { - let pattern12_0 = C::value_type(ctx, pattern10_1); - if pattern12_0 == I8X16 { - if let Some(pattern14_0) = - C::def_inst(ctx, pattern7_1) - { - let pattern15_0 = - C::inst_data(ctx, pattern14_0); - if let &InstructionData::Unary { - opcode: ref pattern16_0, - arg: pattern16_1, - } = &pattern15_0 - { - if let &Opcode::SwidenHigh = pattern16_0 { - if pattern16_1 == pattern10_1 { - // Rule at src/isa/x64/lower.isle line 3191. - let expr0_0: Type = I8X16; - let expr1_0 = - C::iadd_pairwise_mul_const_16( - ctx, - ); - let expr2_0 = - constructor_x64_xmm_load_const( - ctx, expr0_0, expr1_0, - ); - let expr3_0 = C::put_in_xmm_mem( - ctx, - pattern10_1, - ); - let expr4_0 = - constructor_x64_pmaddubsw( - ctx, expr2_0, &expr3_0, - ); - let expr5_0 = - constructor_output_xmm( - ctx, expr4_0, - ); - return Some(expr5_0); - } - } - } - } - } - } - &Opcode::UwidenLow => { - let pattern12_0 = C::value_type(ctx, pattern10_1); - if pattern12_0 == I8X16 { - if let Some(pattern14_0) = - C::def_inst(ctx, pattern7_1) - { - let pattern15_0 = - C::inst_data(ctx, pattern14_0); - if let &InstructionData::Unary { - opcode: ref pattern16_0, - arg: pattern16_1, - } = &pattern15_0 - { - if let &Opcode::UwidenHigh = pattern16_0 { - if pattern16_1 == pattern10_1 { - // Rule at src/isa/x64/lower.isle line 3205. - let expr0_0: Type = I8X16; - let expr1_0 = - C::iadd_pairwise_mul_const_16( - ctx, - ); - let expr2_0 = - constructor_x64_xmm_load_const( - ctx, expr0_0, expr1_0, - ); - let expr3_0 = - constructor_put_in_xmm( - ctx, - pattern10_1, - ); - let expr4_0 = - C::xmm_to_xmm_mem(ctx, expr2_0); - let expr5_0 = - constructor_x64_pmaddubsw( - ctx, expr3_0, &expr4_0, - ); - let expr6_0 = - constructor_output_xmm( - ctx, expr5_0, - ); - return Some(expr6_0); - } - } - } - } - } - } - _ => {} - } - } - } - } - _ => {} - } - } - _ => {} - } - } - if pattern2_0 == I32X4 { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - match &pattern4_0 { - &InstructionData::Unary { - opcode: ref pattern5_0, - arg: pattern5_1, - } => { - match pattern5_0 { - &Opcode::Ineg => { - // Rule at src/isa/x64/lower.isle line 792. - let expr0_0: Type = I32X4; - let expr1_0: u64 = 0i128 as u64; - let expr2_0 = constructor_imm(ctx, expr0_0, expr1_0); - let expr3_0 = C::xmm_new(ctx, expr2_0); - let expr4_0 = C::put_in_xmm_mem(ctx, pattern5_1); - let expr5_0 = constructor_x64_psubd(ctx, expr3_0, &expr4_0); - let expr6_0 = constructor_output_xmm(ctx, expr5_0); - return Some(expr6_0); - } - &Opcode::Iabs => { - // Rule at src/isa/x64/lower.isle line 1113. - let expr0_0 = C::put_in_xmm_mem(ctx, pattern5_1); - let expr1_0 = constructor_x64_pabsd(ctx, &expr0_0); - let expr2_0 = constructor_output_xmm(ctx, expr1_0); - return Some(expr2_0); - } - &Opcode::SwidenLow => { - let pattern7_0 = C::value_type(ctx, pattern5_1); - if pattern7_0 == I16X8 { - // Rule at src/isa/x64/lower.isle line 3230. - let expr0_0 = C::put_in_xmm_mem(ctx, pattern5_1); - let expr1_0 = constructor_x64_pmovsxwd(ctx, &expr0_0); - let expr2_0 = constructor_output_xmm(ctx, expr1_0); - return Some(expr2_0); - } - } - &Opcode::SwidenHigh => { - let pattern7_0 = C::value_type(ctx, pattern5_1); - if pattern7_0 == I16X8 { - // Rule at src/isa/x64/lower.isle line 3242. - let expr0_0 = constructor_put_in_xmm(ctx, pattern5_1); - let expr1_0 = C::xmm_to_xmm_mem(ctx, expr0_0); - let expr2_0: u8 = 8i128 as u8; - let expr3_0 = OperandSize::Size32; - let expr4_0 = constructor_x64_palignr( - ctx, expr0_0, &expr1_0, expr2_0, &expr3_0, - ); - let expr5_0 = C::xmm_to_xmm_mem(ctx, expr4_0); - let expr6_0 = constructor_x64_pmovsxwd(ctx, &expr5_0); - let expr7_0 = constructor_output_xmm(ctx, expr6_0); - return Some(expr7_0); - } - } - &Opcode::UwidenLow => { - let pattern7_0 = C::value_type(ctx, pattern5_1); - if pattern7_0 == I16X8 { - // Rule at src/isa/x64/lower.isle line 3254. - let expr0_0 = C::put_in_xmm_mem(ctx, pattern5_1); - let expr1_0 = constructor_x64_pmovzxwd(ctx, &expr0_0); - let expr2_0 = constructor_output_xmm(ctx, expr1_0); - return Some(expr2_0); - } - } - &Opcode::UwidenHigh => { - let pattern7_0 = C::value_type(ctx, pattern5_1); - if pattern7_0 == I16X8 { - // Rule at src/isa/x64/lower.isle line 3266. - let expr0_0 = constructor_put_in_xmm(ctx, pattern5_1); - let expr1_0 = C::xmm_to_xmm_mem(ctx, expr0_0); - let expr2_0: u8 = 8i128 as u8; - let expr3_0 = OperandSize::Size32; - let expr4_0 = constructor_x64_palignr( - ctx, expr0_0, &expr1_0, expr2_0, &expr3_0, - ); - let expr5_0 = C::xmm_to_xmm_mem(ctx, expr4_0); - let expr6_0 = constructor_x64_pmovzxwd(ctx, &expr5_0); - let expr7_0 = constructor_output_xmm(ctx, expr6_0); - return Some(expr7_0); - } - } - _ => {} - } - } - &InstructionData::Load { - opcode: ref pattern5_0, - arg: pattern5_1, - flags: pattern5_2, - offset: pattern5_3, - } => { - match pattern5_0 { - &Opcode::Uload16x4 => { - // Rule at src/isa/x64/lower.isle line 2574. - let expr0_0 = - constructor_to_amode(ctx, pattern5_2, pattern5_1, pattern5_3); - let expr1_0 = constructor_amode_to_xmm_mem(ctx, &expr0_0); - let expr2_0 = constructor_x64_pmovzxwd(ctx, &expr1_0); - let expr3_0 = constructor_output_xmm(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::Sload16x4 => { - // Rule at src/isa/x64/lower.isle line 2572. - let expr0_0 = - constructor_to_amode(ctx, pattern5_2, pattern5_1, pattern5_3); - let expr1_0 = constructor_amode_to_xmm_mem(ctx, &expr0_0); - let expr2_0 = constructor_x64_pmovsxwd(ctx, &expr1_0); - let expr3_0 = constructor_output_xmm(ctx, expr2_0); - return Some(expr3_0); - } - _ => {} - } - } - &InstructionData::Binary { - opcode: ref pattern5_0, - args: ref pattern5_1, - } => { - match pattern5_0 { - &Opcode::Smin => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 1400. - let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0); - let expr1_0 = C::put_in_xmm_mem(ctx, pattern7_1); - let expr2_0 = constructor_x64_pminsd(ctx, expr0_0, &expr1_0); - let expr3_0 = constructor_output_xmm(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::Umin => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 1422. - let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0); - let expr1_0 = C::put_in_xmm_mem(ctx, pattern7_1); - let expr2_0 = constructor_x64_pminud(ctx, expr0_0, &expr1_0); - let expr3_0 = constructor_output_xmm(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::Smax => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 1389. - let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0); - let expr1_0 = C::put_in_xmm_mem(ctx, pattern7_1); - let expr2_0 = constructor_x64_pmaxsd(ctx, expr0_0, &expr1_0); - let expr3_0 = constructor_output_xmm(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::Umax => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 1411. - let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0); - let expr1_0 = C::put_in_xmm_mem(ctx, pattern7_1); - let expr2_0 = constructor_x64_pmaxud(ctx, expr0_0, &expr1_0); - let expr3_0 = constructor_output_xmm(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::Ishl => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 491. - let expr0_0: Type = I64; - let expr1_0 = constructor_put_in_gpr(ctx, pattern7_1); - let expr2_0 = C::shift_mask(ctx, pattern2_0); - let expr3_0 = RegMemImm::Imm { simm32: expr2_0 }; - let expr4_0 = C::gpr_mem_imm_new(ctx, &expr3_0); - let expr5_0 = constructor_x64_and(ctx, expr0_0, expr1_0, &expr4_0); - let expr6_0 = C::gpr_to_reg(ctx, expr5_0); - let expr7_0 = constructor_put_in_xmm(ctx, pattern7_0); - let expr8_0 = C::reg_to_reg_mem_imm(ctx, expr6_0); - let expr9_0 = constructor_mov_rmi_to_xmm(ctx, &expr8_0); - let expr10_0 = constructor_x64_pslld(ctx, expr7_0, &expr9_0); - let expr11_0 = constructor_output_xmm(ctx, expr10_0); - return Some(expr11_0); - } - &Opcode::Ushr => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 601. - let expr0_0: Type = I64; - let expr1_0 = constructor_put_in_gpr(ctx, pattern7_1); - let expr2_0 = C::shift_mask(ctx, pattern2_0); - let expr3_0 = RegMemImm::Imm { simm32: expr2_0 }; - let expr4_0 = C::gpr_mem_imm_new(ctx, &expr3_0); - let expr5_0 = constructor_x64_and(ctx, expr0_0, expr1_0, &expr4_0); - let expr6_0 = C::gpr_to_reg(ctx, expr5_0); - let expr7_0 = constructor_put_in_xmm(ctx, pattern7_0); - let expr8_0 = C::reg_to_reg_mem_imm(ctx, expr6_0); - let expr9_0 = constructor_mov_rmi_to_xmm(ctx, &expr8_0); - let expr10_0 = constructor_x64_psrld(ctx, expr7_0, &expr9_0); - let expr11_0 = constructor_output_xmm(ctx, expr10_0); - return Some(expr11_0); - } - &Opcode::Sshr => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 704. - let expr0_0: Type = I64; - let expr1_0 = constructor_put_in_gpr(ctx, pattern7_1); - let expr2_0 = C::shift_mask(ctx, pattern2_0); - let expr3_0 = RegMemImm::Imm { simm32: expr2_0 }; - let expr4_0 = C::gpr_mem_imm_new(ctx, &expr3_0); - let expr5_0 = constructor_x64_and(ctx, expr0_0, expr1_0, &expr4_0); - let expr6_0 = C::gpr_to_reg(ctx, expr5_0); - let expr7_0 = constructor_put_in_xmm(ctx, pattern7_0); - let expr8_0 = C::reg_to_reg_mem_imm(ctx, expr6_0); - let expr9_0 = constructor_mov_rmi_to_xmm(ctx, &expr8_0); - let expr10_0 = constructor_x64_psrad(ctx, expr7_0, &expr9_0); - let expr11_0 = constructor_output_xmm(ctx, expr10_0); - return Some(expr11_0); - } - &Opcode::Snarrow => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - if let Some(pattern8_0) = C::def_inst(ctx, pattern7_0) { - if let Some(pattern9_0) = C::first_result(ctx, pattern8_0) { - let pattern10_0 = C::value_type(ctx, pattern9_0); - if pattern10_0 == I64X2 { - let pattern12_0 = C::inst_data(ctx, pattern8_0); - if let &InstructionData::Unary { - opcode: ref pattern13_0, - arg: pattern13_1, - } = &pattern12_0 - { - if let &Opcode::FcvtToSintSat = pattern13_0 { - if let Some(pattern15_0) = - C::def_inst(ctx, pattern7_1) - { - let pattern16_0 = - C::inst_data(ctx, pattern15_0); - if let &InstructionData::UnaryConst { - opcode: ref pattern17_0, - constant_handle: pattern17_1, - } = &pattern16_0 - { - if let &Opcode::Vconst = pattern17_0 { - if let Some(pattern19_0) = - C::u128_from_constant( - ctx, - pattern17_1, - ) - { - if pattern19_0 == 0i128 as u128 { - // Rule at src/isa/x64/lower.isle line 3287. - let expr0_0 = - constructor_put_in_xmm( - ctx, - pattern13_1, - ); - let expr1_0 = C::xmm_to_xmm_mem( - ctx, expr0_0, - ); - let expr2_0 = FcmpImm::Equal; - let expr3_0 = - constructor_x64_cmppd( - ctx, expr0_0, &expr1_0, - &expr2_0, - ); - let expr4_0: Type = F64X2; - let expr5_0 = - C::snarrow_umax_mask(ctx); - let expr6_0 = constructor_x64_xmm_load_const(ctx, expr4_0, expr5_0); - let expr7_0 = C::xmm_to_xmm_mem( - ctx, expr6_0, - ); - let expr8_0 = - constructor_x64_andps( - ctx, expr3_0, &expr7_0, - ); - let expr9_0 = - constructor_x64_minpd( - ctx, expr0_0, expr8_0, - ); - let expr10_0 = - C::xmm_to_xmm_mem( - ctx, expr9_0, - ); - let expr11_0 = - constructor_x64_cvttpd2dq( - ctx, &expr10_0, - ); - let expr12_0 = - constructor_output_xmm( - ctx, expr11_0, - ); - return Some(expr12_0); - } - } - } - } - } - } - } - } - } - } - } - &Opcode::IaddPairwise => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - if let Some(pattern8_0) = C::def_inst(ctx, pattern7_0) { - let pattern9_0 = C::inst_data(ctx, pattern8_0); - if let &InstructionData::Unary { - opcode: ref pattern10_0, - arg: pattern10_1, - } = &pattern9_0 - { - match pattern10_0 { - &Opcode::SwidenLow => { - let pattern12_0 = C::value_type(ctx, pattern10_1); - if pattern12_0 == I16X8 { - if let Some(pattern14_0) = - C::def_inst(ctx, pattern7_1) - { - let pattern15_0 = - C::inst_data(ctx, pattern14_0); - if let &InstructionData::Unary { - opcode: ref pattern16_0, - arg: pattern16_1, - } = &pattern15_0 - { - if let &Opcode::SwidenHigh = pattern16_0 { - if pattern16_1 == pattern10_1 { - // Rule at src/isa/x64/lower.isle line 3198. - let expr0_0: Type = I16X8; - let expr1_0 = - C::iadd_pairwise_mul_const_32( - ctx, - ); - let expr2_0 = - constructor_x64_xmm_load_const( - ctx, expr0_0, expr1_0, - ); - let expr3_0 = - constructor_put_in_xmm( - ctx, - pattern10_1, - ); - let expr4_0 = - C::xmm_to_xmm_mem(ctx, expr2_0); - let expr5_0 = - constructor_x64_pmaddwd( - ctx, expr3_0, &expr4_0, - ); - let expr6_0 = - constructor_output_xmm( - ctx, expr5_0, - ); - return Some(expr6_0); - } - } - } - } - } - } - &Opcode::UwidenLow => { - let pattern12_0 = C::value_type(ctx, pattern10_1); - if pattern12_0 == I16X8 { - if let Some(pattern14_0) = - C::def_inst(ctx, pattern7_1) - { - let pattern15_0 = - C::inst_data(ctx, pattern14_0); - if let &InstructionData::Unary { - opcode: ref pattern16_0, - arg: pattern16_1, - } = &pattern15_0 - { - if let &Opcode::UwidenHigh = pattern16_0 { - if pattern16_1 == pattern10_1 { - // Rule at src/isa/x64/lower.isle line 3212. - let expr0_0: Type = I16X8; - let expr1_0 = - C::iadd_pairwise_xor_const_32( - ctx, - ); - let expr2_0 = - constructor_x64_xmm_load_const( - ctx, expr0_0, expr1_0, - ); - let expr3_0 = - constructor_put_in_xmm( - ctx, - pattern10_1, - ); - let expr4_0 = - C::xmm_to_xmm_mem(ctx, expr2_0); - let expr5_0 = constructor_x64_pxor( - ctx, expr3_0, &expr4_0, - ); - let expr6_0: Type = I16X8; - let expr7_0 = - C::iadd_pairwise_mul_const_32( - ctx, - ); - let expr8_0 = - constructor_x64_xmm_load_const( - ctx, expr6_0, expr7_0, - ); - let expr9_0 = - C::xmm_to_xmm_mem(ctx, expr8_0); - let expr10_0 = - constructor_x64_pmaddwd( - ctx, expr5_0, &expr9_0, - ); - let expr11_0: Type = I16X8; - let expr12_0 = - C::iadd_pairwise_addd_const_32( - ctx, - ); - let expr13_0 = - constructor_x64_xmm_load_const( - ctx, expr11_0, expr12_0, - ); - let expr14_0 = C::xmm_to_xmm_mem( - ctx, expr13_0, - ); - let expr15_0 = - constructor_x64_paddd( - ctx, expr10_0, &expr14_0, - ); - let expr16_0 = - constructor_output_xmm( - ctx, expr15_0, - ); - return Some(expr16_0); - } - } - } - } - } - } - _ => {} - } - } - } - } - &Opcode::WideningPairwiseDotProductS => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 2228. - let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0); - let expr1_0 = C::put_in_xmm_mem(ctx, pattern7_1); - let expr2_0 = constructor_x64_pmaddwd(ctx, expr0_0, &expr1_0); - let expr3_0 = constructor_output_xmm(ctx, expr2_0); - return Some(expr3_0); - } - _ => {} - } - } - _ => {} - } - } - if pattern2_0 == I64X2 { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - match &pattern4_0 { - &InstructionData::Unary { - opcode: ref pattern5_0, - arg: pattern5_1, - } => { - match pattern5_0 { - &Opcode::Ineg => { - // Rule at src/isa/x64/lower.isle line 795. - let expr0_0: Type = I64X2; - let expr1_0: u64 = 0i128 as u64; - let expr2_0 = constructor_imm(ctx, expr0_0, expr1_0); - let expr3_0 = C::xmm_new(ctx, expr2_0); - let expr4_0 = C::put_in_xmm_mem(ctx, pattern5_1); - let expr5_0 = constructor_x64_psubq(ctx, expr3_0, &expr4_0); - let expr6_0 = constructor_output_xmm(ctx, expr5_0); - return Some(expr6_0); - } - &Opcode::Iabs => { - // Rule at src/isa/x64/lower.isle line 1127. - let expr0_0 = constructor_put_in_xmm(ctx, pattern5_1); - let expr1_0: Type = I64X2; - let expr2_0: u64 = 0i128 as u64; - let expr3_0 = constructor_imm(ctx, expr1_0, expr2_0); - let expr4_0 = C::xmm_new(ctx, expr3_0); - let expr5_0 = C::xmm_to_xmm_mem(ctx, expr0_0); - let expr6_0 = constructor_x64_psubq(ctx, expr4_0, &expr5_0); - let expr7_0 = C::xmm_to_xmm_mem(ctx, expr0_0); - let expr8_0 = constructor_x64_blendvpd(ctx, expr6_0, &expr7_0, expr6_0); - let expr9_0 = constructor_output_xmm(ctx, expr8_0); - return Some(expr9_0); - } - &Opcode::SwidenLow => { - let pattern7_0 = C::value_type(ctx, pattern5_1); - if pattern7_0 == I32X4 { - // Rule at src/isa/x64/lower.isle line 3233. - let expr0_0 = C::put_in_xmm_mem(ctx, pattern5_1); - let expr1_0 = constructor_x64_pmovsxdq(ctx, &expr0_0); - let expr2_0 = constructor_output_xmm(ctx, expr1_0); - return Some(expr2_0); - } - } - &Opcode::SwidenHigh => { - let pattern7_0 = C::value_type(ctx, pattern5_1); - if pattern7_0 == I32X4 { - // Rule at src/isa/x64/lower.isle line 3246. - let expr0_0 = C::put_in_xmm_mem(ctx, pattern5_1); - let expr1_0: u8 = 238i128 as u8; - let expr2_0 = OperandSize::Size32; - let expr3_0 = - constructor_x64_pshufd(ctx, &expr0_0, expr1_0, &expr2_0); - let expr4_0 = C::xmm_to_xmm_mem(ctx, expr3_0); - let expr5_0 = constructor_x64_pmovsxdq(ctx, &expr4_0); - let expr6_0 = constructor_output_xmm(ctx, expr5_0); - return Some(expr6_0); - } - } - &Opcode::UwidenLow => { - let pattern7_0 = C::value_type(ctx, pattern5_1); - if pattern7_0 == I32X4 { - // Rule at src/isa/x64/lower.isle line 3257. - let expr0_0 = C::put_in_xmm_mem(ctx, pattern5_1); - let expr1_0 = constructor_x64_pmovzxdq(ctx, &expr0_0); - let expr2_0 = constructor_output_xmm(ctx, expr1_0); - return Some(expr2_0); - } - } - &Opcode::UwidenHigh => { - let pattern7_0 = C::value_type(ctx, pattern5_1); - if pattern7_0 == I32X4 { - // Rule at src/isa/x64/lower.isle line 3270. - let expr0_0 = C::put_in_xmm_mem(ctx, pattern5_1); - let expr1_0: u8 = 238i128 as u8; - let expr2_0 = OperandSize::Size32; - let expr3_0 = - constructor_x64_pshufd(ctx, &expr0_0, expr1_0, &expr2_0); - let expr4_0 = C::xmm_to_xmm_mem(ctx, expr3_0); - let expr5_0 = constructor_x64_pmovzxdq(ctx, &expr4_0); - let expr6_0 = constructor_output_xmm(ctx, expr5_0); - return Some(expr6_0); - } - } - _ => {} - } - } - &InstructionData::Load { - opcode: ref pattern5_0, - arg: pattern5_1, - flags: pattern5_2, - offset: pattern5_3, - } => { - match pattern5_0 { - &Opcode::Uload32x2 => { - // Rule at src/isa/x64/lower.isle line 2578. - let expr0_0 = - constructor_to_amode(ctx, pattern5_2, pattern5_1, pattern5_3); - let expr1_0 = constructor_amode_to_xmm_mem(ctx, &expr0_0); - let expr2_0 = constructor_x64_pmovzxdq(ctx, &expr1_0); - let expr3_0 = constructor_output_xmm(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::Sload32x2 => { - // Rule at src/isa/x64/lower.isle line 2576. - let expr0_0 = - constructor_to_amode(ctx, pattern5_2, pattern5_1, pattern5_3); - let expr1_0 = constructor_amode_to_xmm_mem(ctx, &expr0_0); - let expr2_0 = constructor_x64_pmovsxdq(ctx, &expr1_0); - let expr3_0 = constructor_output_xmm(ctx, expr2_0); - return Some(expr3_0); - } - _ => {} - } - } - &InstructionData::Binary { - opcode: ref pattern5_0, - args: ref pattern5_1, - } => { - match pattern5_0 { - &Opcode::Ishl => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 495. - let expr0_0: Type = I64; - let expr1_0 = constructor_put_in_gpr(ctx, pattern7_1); - let expr2_0 = C::shift_mask(ctx, pattern2_0); - let expr3_0 = RegMemImm::Imm { simm32: expr2_0 }; - let expr4_0 = C::gpr_mem_imm_new(ctx, &expr3_0); - let expr5_0 = constructor_x64_and(ctx, expr0_0, expr1_0, &expr4_0); - let expr6_0 = C::gpr_to_reg(ctx, expr5_0); - let expr7_0 = constructor_put_in_xmm(ctx, pattern7_0); - let expr8_0 = C::reg_to_reg_mem_imm(ctx, expr6_0); - let expr9_0 = constructor_mov_rmi_to_xmm(ctx, &expr8_0); - let expr10_0 = constructor_x64_psllq(ctx, expr7_0, &expr9_0); - let expr11_0 = constructor_output_xmm(ctx, expr10_0); - return Some(expr11_0); - } - &Opcode::Ushr => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 605. - let expr0_0: Type = I64; - let expr1_0 = constructor_put_in_gpr(ctx, pattern7_1); - let expr2_0 = C::shift_mask(ctx, pattern2_0); - let expr3_0 = RegMemImm::Imm { simm32: expr2_0 }; - let expr4_0 = C::gpr_mem_imm_new(ctx, &expr3_0); - let expr5_0 = constructor_x64_and(ctx, expr0_0, expr1_0, &expr4_0); - let expr6_0 = C::gpr_to_reg(ctx, expr5_0); - let expr7_0 = constructor_put_in_xmm(ctx, pattern7_0); - let expr8_0 = C::reg_to_reg_mem_imm(ctx, expr6_0); - let expr9_0 = constructor_mov_rmi_to_xmm(ctx, &expr8_0); - let expr10_0 = constructor_x64_psrlq(ctx, expr7_0, &expr9_0); - let expr11_0 = constructor_output_xmm(ctx, expr10_0); - return Some(expr11_0); - } - &Opcode::Sshr => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 716. - let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0); - let expr1_0: Type = I64; - let expr2_0: u8 = 0i128 as u8; - let expr3_0 = constructor_x64_pextrd(ctx, expr1_0, expr0_0, expr2_0); - let expr4_0: Type = I64; - let expr5_0: u8 = 1i128 as u8; - let expr6_0 = constructor_x64_pextrd(ctx, expr4_0, expr0_0, expr5_0); - let expr7_0: Type = I64; - let expr8_0 = - constructor_put_masked_in_imm8_gpr(ctx, pattern7_1, expr7_0); - let expr9_0: Type = I64; - let expr10_0 = constructor_x64_sar(ctx, expr9_0, expr3_0, &expr8_0); - let expr11_0: Type = I64; - let expr12_0 = constructor_x64_sar(ctx, expr11_0, expr6_0, &expr8_0); - let expr13_0 = C::gpr_to_gpr_mem(ctx, expr10_0); - let expr14_0 = C::gpr_to_gpr_mem(ctx, expr12_0); - let expr15_0 = - constructor_make_i64x2_from_lanes(ctx, &expr13_0, &expr14_0); - let expr16_0 = constructor_output_xmm(ctx, expr15_0); - return Some(expr16_0); - } - _ => {} - } - } - _ => {} - } - } - if pattern2_0 == F32X4 { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - match &pattern4_0 { - &InstructionData::Unary { - opcode: ref pattern5_0, - arg: pattern5_1, - } => { - match pattern5_0 { - &Opcode::Sqrt => { - // Rule at src/isa/x64/lower.isle line 2285. - let expr0_0 = constructor_put_in_xmm(ctx, pattern5_1); - let expr1_0 = constructor_x64_sqrtps(ctx, expr0_0); - let expr2_0 = constructor_output_xmm(ctx, expr1_0); - return Some(expr2_0); - } - &Opcode::Fneg => { - // Rule at src/isa/x64/lower.isle line 1160. - let expr0_0 = constructor_put_in_xmm(ctx, pattern5_1); - let expr1_0 = constructor_vector_all_ones(ctx); - let expr2_0: u32 = 31i128 as u32; - let expr3_0 = RegMemImm::Imm { simm32: expr2_0 }; - let expr4_0 = constructor_mov_rmi_to_xmm(ctx, &expr3_0); - let expr5_0 = constructor_x64_pslld(ctx, expr1_0, &expr4_0); - let expr6_0 = C::xmm_to_xmm_mem(ctx, expr5_0); - let expr7_0 = constructor_x64_xorps(ctx, expr0_0, &expr6_0); - let expr8_0 = constructor_output_xmm(ctx, expr7_0); - return Some(expr8_0); - } - &Opcode::Fabs => { - // Rule at src/isa/x64/lower.isle line 1141. - let expr0_0 = constructor_put_in_xmm(ctx, pattern5_1); - let expr1_0 = constructor_vector_all_ones(ctx); - let expr2_0: u32 = 1i128 as u32; - let expr3_0 = RegMemImm::Imm { simm32: expr2_0 }; - let expr4_0 = constructor_mov_rmi_to_xmm(ctx, &expr3_0); - let expr5_0 = constructor_x64_psrld(ctx, expr1_0, &expr4_0); - let expr6_0 = C::xmm_to_xmm_mem(ctx, expr5_0); - let expr7_0 = constructor_x64_andps(ctx, expr0_0, &expr6_0); - let expr8_0 = constructor_output_xmm(ctx, expr7_0); - return Some(expr8_0); - } - &Opcode::Fvdemote => { - // Rule at src/isa/x64/lower.isle line 2303. - let expr0_0 = constructor_put_in_xmm(ctx, pattern5_1); - let expr1_0 = constructor_x64_cvtpd2ps(ctx, expr0_0); - let expr2_0 = constructor_output_xmm(ctx, expr1_0); - return Some(expr2_0); - } - _ => {} - } - } - &InstructionData::Load { - opcode: ref pattern5_0, - arg: pattern5_1, - flags: pattern5_2, - offset: pattern5_3, - } => { - if let &Opcode::Load = pattern5_0 { - // Rule at src/isa/x64/lower.isle line 2550. - let expr0_0 = constructor_to_amode(ctx, pattern5_2, pattern5_1, pattern5_3); - let expr1_0 = constructor_amode_to_xmm_mem(ctx, &expr0_0); - let expr2_0 = constructor_x64_movups(ctx, &expr1_0); - let expr3_0 = constructor_output_xmm(ctx, expr2_0); - return Some(expr3_0); - } - } - &InstructionData::Binary { - opcode: ref pattern5_0, - args: ref pattern5_1, - } => { - match pattern5_0 { - &Opcode::Fadd => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 2242. - let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0); - let expr1_0 = C::put_in_xmm_mem(ctx, pattern7_1); - let expr2_0 = constructor_x64_addps(ctx, expr0_0, &expr1_0); - let expr3_0 = constructor_output_xmm(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::Fsub => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 2253. - let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0); - let expr1_0 = C::put_in_xmm_mem(ctx, pattern7_1); - let expr2_0 = constructor_x64_subps(ctx, expr0_0, &expr1_0); - let expr3_0 = constructor_output_xmm(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::Fmul => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 2264. - let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0); - let expr1_0 = C::put_in_xmm_mem(ctx, pattern7_1); - let expr2_0 = constructor_x64_mulps(ctx, expr0_0, &expr1_0); - let expr3_0 = constructor_output_xmm(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::Fdiv => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 2275. - let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0); - let expr1_0 = C::put_in_xmm_mem(ctx, pattern7_1); - let expr2_0 = constructor_x64_divps(ctx, expr0_0, &expr1_0); - let expr3_0 = constructor_output_xmm(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::Fmin => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 2325. - let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0); - let expr1_0 = constructor_put_in_xmm(ctx, pattern7_1); - let expr2_0 = constructor_x64_minps(ctx, expr0_0, expr1_0); - let expr3_0 = constructor_put_in_xmm(ctx, pattern7_1); - let expr4_0 = constructor_put_in_xmm(ctx, pattern7_0); - let expr5_0 = constructor_x64_minps(ctx, expr3_0, expr4_0); - let expr6_0 = C::xmm_to_xmm_mem(ctx, expr5_0); - let expr7_0 = constructor_x64_orps(ctx, expr2_0, &expr6_0); - let expr8_0 = C::xmm_to_xmm_mem(ctx, expr5_0); - let expr9_0 = FcmpImm::Unordered; - let expr10_0 = constructor_x64_cmpps(ctx, expr7_0, &expr8_0, &expr9_0); - let expr11_0 = C::xmm_to_xmm_mem(ctx, expr10_0); - let expr12_0 = constructor_x64_orps(ctx, expr7_0, &expr11_0); - let expr13_0: u32 = 10i128 as u32; - let expr14_0 = RegMemImm::Imm { simm32: expr13_0 }; - let expr15_0 = constructor_mov_rmi_to_xmm(ctx, &expr14_0); - let expr16_0 = constructor_x64_psrld(ctx, expr10_0, &expr15_0); - let expr17_0 = C::xmm_to_xmm_mem(ctx, expr12_0); - let expr18_0 = constructor_x64_andnps(ctx, expr16_0, &expr17_0); - let expr19_0 = constructor_output_xmm(ctx, expr18_0); - return Some(expr19_0); - } - &Opcode::FminPseudo => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 2481. - let expr0_0 = constructor_put_in_xmm(ctx, pattern7_1); - let expr1_0 = constructor_put_in_xmm(ctx, pattern7_0); - let expr2_0 = constructor_x64_minps(ctx, expr0_0, expr1_0); - let expr3_0 = constructor_output_xmm(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::Fmax => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 2388. - let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0); - let expr1_0 = constructor_put_in_xmm(ctx, pattern7_1); - let expr2_0 = constructor_x64_maxps(ctx, expr0_0, expr1_0); - let expr3_0 = constructor_put_in_xmm(ctx, pattern7_1); - let expr4_0 = constructor_put_in_xmm(ctx, pattern7_0); - let expr5_0 = constructor_x64_maxps(ctx, expr3_0, expr4_0); - let expr6_0 = C::xmm_to_xmm_mem(ctx, expr5_0); - let expr7_0 = constructor_x64_xorps(ctx, expr2_0, &expr6_0); - let expr8_0 = C::xmm_to_xmm_mem(ctx, expr7_0); - let expr9_0 = constructor_x64_orps(ctx, expr2_0, &expr8_0); - let expr10_0 = C::xmm_to_xmm_mem(ctx, expr7_0); - let expr11_0 = constructor_x64_subps(ctx, expr9_0, &expr10_0); - let expr12_0 = C::xmm_to_xmm_mem(ctx, expr9_0); - let expr13_0 = FcmpImm::Unordered; - let expr14_0 = - constructor_x64_cmpps(ctx, expr9_0, &expr12_0, &expr13_0); - let expr15_0: u32 = 10i128 as u32; - let expr16_0 = RegMemImm::Imm { simm32: expr15_0 }; - let expr17_0 = constructor_mov_rmi_to_xmm(ctx, &expr16_0); - let expr18_0 = constructor_x64_psrld(ctx, expr14_0, &expr17_0); - let expr19_0 = C::xmm_to_xmm_mem(ctx, expr11_0); - let expr20_0 = constructor_x64_andnps(ctx, expr18_0, &expr19_0); - let expr21_0 = constructor_output_xmm(ctx, expr20_0); - return Some(expr21_0); - } - &Opcode::FmaxPseudo => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 2492. - let expr0_0 = constructor_put_in_xmm(ctx, pattern7_1); - let expr1_0 = constructor_put_in_xmm(ctx, pattern7_0); - let expr2_0 = constructor_x64_maxps(ctx, expr0_0, expr1_0); - let expr3_0 = constructor_output_xmm(ctx, expr2_0); - return Some(expr3_0); - } - _ => {} - } - } - _ => {} - } - } - if pattern2_0 == F64X2 { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - match &pattern4_0 { - &InstructionData::Unary { - opcode: ref pattern5_0, - arg: pattern5_1, - } => { - match pattern5_0 { - &Opcode::Sqrt => { - // Rule at src/isa/x64/lower.isle line 2287. - let expr0_0 = constructor_put_in_xmm(ctx, pattern5_1); - let expr1_0 = constructor_x64_sqrtpd(ctx, expr0_0); - let expr2_0 = constructor_output_xmm(ctx, expr1_0); - return Some(expr2_0); - } - &Opcode::Fneg => { - // Rule at src/isa/x64/lower.isle line 1165. - let expr0_0 = constructor_put_in_xmm(ctx, pattern5_1); - let expr1_0 = constructor_vector_all_ones(ctx); - let expr2_0: u32 = 63i128 as u32; - let expr3_0 = RegMemImm::Imm { simm32: expr2_0 }; - let expr4_0 = constructor_mov_rmi_to_xmm(ctx, &expr3_0); - let expr5_0 = constructor_x64_psllq(ctx, expr1_0, &expr4_0); - let expr6_0 = C::xmm_to_xmm_mem(ctx, expr5_0); - let expr7_0 = constructor_x64_xorpd(ctx, expr0_0, &expr6_0); - let expr8_0 = constructor_output_xmm(ctx, expr7_0); - return Some(expr8_0); - } - &Opcode::Fabs => { - // Rule at src/isa/x64/lower.isle line 1147. - let expr0_0 = constructor_put_in_xmm(ctx, pattern5_1); - let expr1_0 = constructor_vector_all_ones(ctx); - let expr2_0: u32 = 1i128 as u32; - let expr3_0 = RegMemImm::Imm { simm32: expr2_0 }; - let expr4_0 = constructor_mov_rmi_to_xmm(ctx, &expr3_0); - let expr5_0 = constructor_x64_psrlq(ctx, expr1_0, &expr4_0); - let expr6_0 = C::xmm_to_xmm_mem(ctx, expr5_0); - let expr7_0 = constructor_x64_andpd(ctx, expr0_0, &expr6_0); - let expr8_0 = constructor_output_xmm(ctx, expr7_0); - return Some(expr8_0); - } - &Opcode::FvpromoteLow => { - // Rule at src/isa/x64/lower.isle line 2295. - let expr0_0 = constructor_put_in_xmm(ctx, pattern5_1); - let expr1_0 = constructor_x64_cvtps2pd(ctx, expr0_0); - let expr2_0 = constructor_output_xmm(ctx, expr1_0); - return Some(expr2_0); - } - _ => {} - } - } - &InstructionData::Load { - opcode: ref pattern5_0, - arg: pattern5_1, - flags: pattern5_2, - offset: pattern5_3, - } => { - if let &Opcode::Load = pattern5_0 { - // Rule at src/isa/x64/lower.isle line 2552. - let expr0_0 = constructor_to_amode(ctx, pattern5_2, pattern5_1, pattern5_3); - let expr1_0 = constructor_amode_to_xmm_mem(ctx, &expr0_0); - let expr2_0 = constructor_x64_movupd(ctx, &expr1_0); - let expr3_0 = constructor_output_xmm(ctx, expr2_0); - return Some(expr3_0); - } - } - &InstructionData::Binary { - opcode: ref pattern5_0, - args: ref pattern5_1, - } => { - match pattern5_0 { - &Opcode::Fadd => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 2244. - let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0); - let expr1_0 = C::put_in_xmm_mem(ctx, pattern7_1); - let expr2_0 = constructor_x64_addpd(ctx, expr0_0, &expr1_0); - let expr3_0 = constructor_output_xmm(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::Fsub => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 2255. - let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0); - let expr1_0 = C::put_in_xmm_mem(ctx, pattern7_1); - let expr2_0 = constructor_x64_subpd(ctx, expr0_0, &expr1_0); - let expr3_0 = constructor_output_xmm(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::Fmul => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 2266. - let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0); - let expr1_0 = C::put_in_xmm_mem(ctx, pattern7_1); - let expr2_0 = constructor_x64_mulpd(ctx, expr0_0, &expr1_0); - let expr3_0 = constructor_output_xmm(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::Fdiv => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 2277. - let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0); - let expr1_0 = C::put_in_xmm_mem(ctx, pattern7_1); - let expr2_0 = constructor_x64_divpd(ctx, expr0_0, &expr1_0); - let expr3_0 = constructor_output_xmm(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::Fmin => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 2368. - let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0); - let expr1_0 = constructor_put_in_xmm(ctx, pattern7_1); - let expr2_0 = constructor_x64_minpd(ctx, expr0_0, expr1_0); - let expr3_0 = constructor_put_in_xmm(ctx, pattern7_1); - let expr4_0 = constructor_put_in_xmm(ctx, pattern7_0); - let expr5_0 = constructor_x64_minpd(ctx, expr3_0, expr4_0); - let expr6_0 = C::xmm_to_xmm_mem(ctx, expr5_0); - let expr7_0 = constructor_x64_orpd(ctx, expr2_0, &expr6_0); - let expr8_0 = C::xmm_to_xmm_mem(ctx, expr5_0); - let expr9_0 = FcmpImm::Unordered; - let expr10_0 = constructor_x64_cmppd(ctx, expr2_0, &expr8_0, &expr9_0); - let expr11_0 = C::xmm_to_xmm_mem(ctx, expr10_0); - let expr12_0 = constructor_x64_orpd(ctx, expr7_0, &expr11_0); - let expr13_0: u32 = 13i128 as u32; - let expr14_0 = RegMemImm::Imm { simm32: expr13_0 }; - let expr15_0 = constructor_mov_rmi_to_xmm(ctx, &expr14_0); - let expr16_0 = constructor_x64_psrlq(ctx, expr10_0, &expr15_0); - let expr17_0 = C::xmm_to_xmm_mem(ctx, expr12_0); - let expr18_0 = constructor_x64_andnpd(ctx, expr16_0, &expr17_0); - let expr19_0 = constructor_output_xmm(ctx, expr18_0); - return Some(expr19_0); - } - &Opcode::FminPseudo => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 2483. - let expr0_0 = constructor_put_in_xmm(ctx, pattern7_1); - let expr1_0 = constructor_put_in_xmm(ctx, pattern7_0); - let expr2_0 = constructor_x64_minpd(ctx, expr0_0, expr1_0); - let expr3_0 = constructor_output_xmm(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::Fmax => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 2431. - let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0); - let expr1_0 = constructor_put_in_xmm(ctx, pattern7_1); - let expr2_0 = constructor_x64_maxpd(ctx, expr0_0, expr1_0); - let expr3_0 = constructor_put_in_xmm(ctx, pattern7_1); - let expr4_0 = constructor_put_in_xmm(ctx, pattern7_0); - let expr5_0 = constructor_x64_maxpd(ctx, expr3_0, expr4_0); - let expr6_0 = C::xmm_to_xmm_mem(ctx, expr5_0); - let expr7_0 = constructor_x64_xorpd(ctx, expr2_0, &expr6_0); - let expr8_0 = C::xmm_to_xmm_mem(ctx, expr7_0); - let expr9_0 = constructor_x64_orpd(ctx, expr2_0, &expr8_0); - let expr10_0 = C::xmm_to_xmm_mem(ctx, expr7_0); - let expr11_0 = constructor_x64_subpd(ctx, expr9_0, &expr10_0); - let expr12_0 = C::xmm_to_xmm_mem(ctx, expr9_0); - let expr13_0 = FcmpImm::Unordered; - let expr14_0 = - constructor_x64_cmppd(ctx, expr9_0, &expr12_0, &expr13_0); - let expr15_0: u32 = 13i128 as u32; - let expr16_0 = RegMemImm::Imm { simm32: expr15_0 }; - let expr17_0 = constructor_mov_rmi_to_xmm(ctx, &expr16_0); - let expr18_0 = constructor_x64_psrlq(ctx, expr14_0, &expr17_0); - let expr19_0 = C::xmm_to_xmm_mem(ctx, expr11_0); - let expr20_0 = constructor_x64_andnpd(ctx, expr18_0, &expr19_0); - let expr21_0 = constructor_output_xmm(ctx, expr20_0); - return Some(expr21_0); - } - &Opcode::FmaxPseudo => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 2494. - let expr0_0 = constructor_put_in_xmm(ctx, pattern7_1); - let expr1_0 = constructor_put_in_xmm(ctx, pattern7_0); - let expr2_0 = constructor_x64_maxpd(ctx, expr0_0, expr1_0); - let expr3_0 = constructor_output_xmm(ctx, expr2_0); - return Some(expr3_0); - } - _ => {} - } - } - _ => {} - } - } - if let Some((pattern3_0, pattern3_1)) = C::multi_lane(ctx, pattern2_0) { - if pattern3_0 == 8i128 as u32 { - if pattern3_1 == 16i128 as u32 { - let pattern6_0 = C::inst_data(ctx, pattern0_0); - match &pattern6_0 { - &InstructionData::Unary { - opcode: ref pattern7_0, - arg: pattern7_1, - } => { - if let &Opcode::Splat = pattern7_0 { - // Rule at src/isa/x64/lower.isle line 3610. - let expr0_0: Type = I8X16; - let expr1_0 = constructor_xmm_uninit_value(ctx); - let expr2_0 = C::put_in_reg_mem(ctx, pattern7_1); - let expr3_0: u8 = 0i128 as u8; - let expr4_0 = constructor_vec_insert_lane( - ctx, expr0_0, expr1_0, &expr2_0, expr3_0, - ); - let expr5_0 = C::xmm_to_xmm_mem(ctx, expr4_0); - let expr6_0 = constructor_x64_pxor(ctx, expr4_0, &expr5_0); - let expr7_0 = C::xmm_to_xmm_mem(ctx, expr6_0); - let expr8_0 = constructor_x64_pshufb(ctx, expr4_0, &expr7_0); - let expr9_0 = constructor_output_xmm(ctx, expr8_0); - return Some(expr9_0); - } - } - &InstructionData::Binary { - opcode: ref pattern7_0, - args: ref pattern7_1, - } => { - match pattern7_0 { - &Opcode::AvgRound => { - let (pattern9_0, pattern9_1) = - C::unpack_value_array_2(ctx, pattern7_1); - // Rule at src/isa/x64/lower.isle line 800. - let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0); - let expr1_0 = C::put_in_xmm_mem(ctx, pattern9_1); - let expr2_0 = constructor_x64_pavgb(ctx, expr0_0, &expr1_0); - let expr3_0 = constructor_output_xmm(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::UaddSat => { - let (pattern9_0, pattern9_1) = - C::unpack_value_array_2(ctx, pattern7_1); - // Rule at src/isa/x64/lower.isle line 130. - let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0); - let expr1_0 = C::put_in_xmm_mem(ctx, pattern9_1); - let expr2_0 = constructor_x64_paddusb(ctx, expr0_0, &expr1_0); - let expr3_0 = constructor_output_xmm(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::SaddSat => { - let (pattern9_0, pattern9_1) = - C::unpack_value_array_2(ctx, pattern7_1); - // Rule at src/isa/x64/lower.isle line 120. - let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0); - let expr1_0 = C::put_in_xmm_mem(ctx, pattern9_1); - let expr2_0 = constructor_x64_paddsb(ctx, expr0_0, &expr1_0); - let expr3_0 = constructor_output_xmm(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::UsubSat => { - let (pattern9_0, pattern9_1) = - C::unpack_value_array_2(ctx, pattern7_1); - // Rule at src/isa/x64/lower.isle line 202. - let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0); - let expr1_0 = C::put_in_xmm_mem(ctx, pattern9_1); - let expr2_0 = constructor_x64_psubusb(ctx, expr0_0, &expr1_0); - let expr3_0 = constructor_output_xmm(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::SsubSat => { - let (pattern9_0, pattern9_1) = - C::unpack_value_array_2(ctx, pattern7_1); - // Rule at src/isa/x64/lower.isle line 192. - let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0); - let expr1_0 = C::put_in_xmm_mem(ctx, pattern9_1); - let expr2_0 = constructor_x64_psubsb(ctx, expr0_0, &expr1_0); - let expr3_0 = constructor_output_xmm(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::Iadd => { - let (pattern9_0, pattern9_1) = - C::unpack_value_array_2(ctx, pattern7_1); - // Rule at src/isa/x64/lower.isle line 75. - let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0); - let expr1_0 = C::put_in_xmm_mem(ctx, pattern9_1); - let expr2_0 = constructor_x64_paddb(ctx, expr0_0, &expr1_0); - let expr3_0 = constructor_output_xmm(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::Isub => { - let (pattern9_0, pattern9_1) = - C::unpack_value_array_2(ctx, pattern7_1); - // Rule at src/isa/x64/lower.isle line 160. - let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0); - let expr1_0 = C::put_in_xmm_mem(ctx, pattern9_1); - let expr2_0 = constructor_x64_psubb(ctx, expr0_0, &expr1_0); - let expr3_0 = constructor_output_xmm(ctx, expr2_0); - return Some(expr3_0); - } - _ => {} - } - } - _ => {} - } - } - } - if pattern3_0 == 16i128 as u32 { - if pattern3_1 == 8i128 as u32 { - let pattern6_0 = C::inst_data(ctx, pattern0_0); - match &pattern6_0 { - &InstructionData::Unary { - opcode: ref pattern7_0, - arg: pattern7_1, - } => { - if let &Opcode::Splat = pattern7_0 { - // Rule at src/isa/x64/lower.isle line 3616. - let expr0_0 = C::put_in_reg(ctx, pattern7_1); - let expr1_0 = RegMem::Reg { reg: expr0_0 }; - let expr2_0: Type = I16X8; - let expr3_0 = constructor_xmm_uninit_value(ctx); - let expr4_0: u8 = 0i128 as u8; - let expr5_0 = constructor_vec_insert_lane( - ctx, expr2_0, expr3_0, &expr1_0, expr4_0, - ); - let expr6_0: Type = I16X8; - let expr7_0: u8 = 1i128 as u8; - let expr8_0 = constructor_vec_insert_lane( - ctx, expr6_0, expr5_0, &expr1_0, expr7_0, - ); - let expr9_0 = C::xmm_to_xmm_mem(ctx, expr8_0); - let expr10_0: u8 = 0i128 as u8; - let expr11_0 = OperandSize::Size32; - let expr12_0 = - constructor_x64_pshufd(ctx, &expr9_0, expr10_0, &expr11_0); - let expr13_0 = constructor_output_xmm(ctx, expr12_0); - return Some(expr13_0); - } - } - &InstructionData::Binary { - opcode: ref pattern7_0, - args: ref pattern7_1, - } => { - match pattern7_0 { - &Opcode::AvgRound => { - let (pattern9_0, pattern9_1) = - C::unpack_value_array_2(ctx, pattern7_1); - // Rule at src/isa/x64/lower.isle line 804. - let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0); - let expr1_0 = C::put_in_xmm_mem(ctx, pattern9_1); - let expr2_0 = constructor_x64_pavgw(ctx, expr0_0, &expr1_0); - let expr3_0 = constructor_output_xmm(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::UaddSat => { - let (pattern9_0, pattern9_1) = - C::unpack_value_array_2(ctx, pattern7_1); - // Rule at src/isa/x64/lower.isle line 134. - let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0); - let expr1_0 = C::put_in_xmm_mem(ctx, pattern9_1); - let expr2_0 = constructor_x64_paddusw(ctx, expr0_0, &expr1_0); - let expr3_0 = constructor_output_xmm(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::SaddSat => { - let (pattern9_0, pattern9_1) = - C::unpack_value_array_2(ctx, pattern7_1); - // Rule at src/isa/x64/lower.isle line 124. - let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0); - let expr1_0 = C::put_in_xmm_mem(ctx, pattern9_1); - let expr2_0 = constructor_x64_paddsw(ctx, expr0_0, &expr1_0); - let expr3_0 = constructor_output_xmm(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::UsubSat => { - let (pattern9_0, pattern9_1) = - C::unpack_value_array_2(ctx, pattern7_1); - // Rule at src/isa/x64/lower.isle line 206. - let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0); - let expr1_0 = C::put_in_xmm_mem(ctx, pattern9_1); - let expr2_0 = constructor_x64_psubusw(ctx, expr0_0, &expr1_0); - let expr3_0 = constructor_output_xmm(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::SsubSat => { - let (pattern9_0, pattern9_1) = - C::unpack_value_array_2(ctx, pattern7_1); - // Rule at src/isa/x64/lower.isle line 196. - let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0); - let expr1_0 = C::put_in_xmm_mem(ctx, pattern9_1); - let expr2_0 = constructor_x64_psubsw(ctx, expr0_0, &expr1_0); - let expr3_0 = constructor_output_xmm(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::Iadd => { - let (pattern9_0, pattern9_1) = - C::unpack_value_array_2(ctx, pattern7_1); - // Rule at src/isa/x64/lower.isle line 79. - let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0); - let expr1_0 = C::put_in_xmm_mem(ctx, pattern9_1); - let expr2_0 = constructor_x64_paddw(ctx, expr0_0, &expr1_0); - let expr3_0 = constructor_output_xmm(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::Isub => { - let (pattern9_0, pattern9_1) = - C::unpack_value_array_2(ctx, pattern7_1); - // Rule at src/isa/x64/lower.isle line 164. - let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0); - let expr1_0 = C::put_in_xmm_mem(ctx, pattern9_1); - let expr2_0 = constructor_x64_psubw(ctx, expr0_0, &expr1_0); - let expr3_0 = constructor_output_xmm(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::Imul => { - let (pattern9_0, pattern9_1) = - C::unpack_value_array_2(ctx, pattern7_1); - // Rule at src/isa/x64/lower.isle line 881. - let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0); - let expr1_0 = C::put_in_xmm_mem(ctx, pattern9_1); - let expr2_0 = constructor_x64_pmullw(ctx, expr0_0, &expr1_0); - let expr3_0 = constructor_output_xmm(ctx, expr2_0); - return Some(expr3_0); - } - _ => {} - } - } - _ => {} - } - } - } - if pattern3_0 == 32i128 as u32 { - if pattern3_1 == 4i128 as u32 { - let pattern6_0 = C::inst_data(ctx, pattern0_0); - match &pattern6_0 { - &InstructionData::Unary { - opcode: ref pattern7_0, - arg: pattern7_1, - } => { - if let &Opcode::Splat = pattern7_0 { - // Rule at src/isa/x64/lower.isle line 3628. - let expr0_0: Type = I32X4; - let expr1_0 = - constructor_lower_splat_32x4(ctx, expr0_0, pattern7_1); - let expr2_0 = constructor_output_xmm(ctx, expr1_0); - return Some(expr2_0); - } - } - &InstructionData::Binary { - opcode: ref pattern7_0, - args: ref pattern7_1, - } => { - match pattern7_0 { - &Opcode::Iadd => { - let (pattern9_0, pattern9_1) = - C::unpack_value_array_2(ctx, pattern7_1); - // Rule at src/isa/x64/lower.isle line 83. - let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0); - let expr1_0 = C::put_in_xmm_mem(ctx, pattern9_1); - let expr2_0 = constructor_x64_paddd(ctx, expr0_0, &expr1_0); - let expr3_0 = constructor_output_xmm(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::Isub => { - let (pattern9_0, pattern9_1) = - C::unpack_value_array_2(ctx, pattern7_1); - // Rule at src/isa/x64/lower.isle line 168. - let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0); - let expr1_0 = C::put_in_xmm_mem(ctx, pattern9_1); - let expr2_0 = constructor_x64_psubd(ctx, expr0_0, &expr1_0); - let expr3_0 = constructor_output_xmm(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::Imul => { - let (pattern9_0, pattern9_1) = - C::unpack_value_array_2(ctx, pattern7_1); - // Rule at src/isa/x64/lower.isle line 884. - let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0); - let expr1_0 = C::put_in_xmm_mem(ctx, pattern9_1); - let expr2_0 = constructor_x64_pmulld(ctx, expr0_0, &expr1_0); - let expr3_0 = constructor_output_xmm(ctx, expr2_0); - return Some(expr3_0); - } - _ => {} - } - } - _ => {} - } - } - } - if pattern3_0 == 64i128 as u32 { - if pattern3_1 == 2i128 as u32 { - let pattern6_0 = C::inst_data(ctx, pattern0_0); - match &pattern6_0 { - &InstructionData::Unary { - opcode: ref pattern7_0, - arg: pattern7_1, - } => { - if let &Opcode::Splat = pattern7_0 { - // Rule at src/isa/x64/lower.isle line 3641. - let expr0_0: Type = I64X2; - let expr1_0 = - constructor_lower_splat_64x2(ctx, expr0_0, pattern7_1); - let expr2_0 = constructor_output_xmm(ctx, expr1_0); - return Some(expr2_0); - } - } - &InstructionData::Binary { - opcode: ref pattern7_0, - args: ref pattern7_1, - } => { - match pattern7_0 { - &Opcode::Iadd => { - let (pattern9_0, pattern9_1) = - C::unpack_value_array_2(ctx, pattern7_1); - // Rule at src/isa/x64/lower.isle line 87. - let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0); - let expr1_0 = C::put_in_xmm_mem(ctx, pattern9_1); - let expr2_0 = constructor_x64_paddq(ctx, expr0_0, &expr1_0); - let expr3_0 = constructor_output_xmm(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::Isub => { - let (pattern9_0, pattern9_1) = - C::unpack_value_array_2(ctx, pattern7_1); - // Rule at src/isa/x64/lower.isle line 172. - let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0); - let expr1_0 = C::put_in_xmm_mem(ctx, pattern9_1); - let expr2_0 = constructor_x64_psubq(ctx, expr0_0, &expr1_0); - let expr3_0 = constructor_output_xmm(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::Imul => { - let (pattern9_0, pattern9_1) = - C::unpack_value_array_2(ctx, pattern7_1); - // Rule at src/isa/x64/lower.isle line 915. - let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0); - let expr1_0 = constructor_put_in_xmm(ctx, pattern9_1); - let expr2_0: u32 = 32i128 as u32; - let expr3_0 = RegMemImm::Imm { simm32: expr2_0 }; - let expr4_0 = constructor_mov_rmi_to_xmm(ctx, &expr3_0); - let expr5_0 = constructor_x64_psrlq(ctx, expr0_0, &expr4_0); - let expr6_0 = C::xmm_to_xmm_mem(ctx, expr1_0); - let expr7_0 = constructor_x64_pmuludq(ctx, expr5_0, &expr6_0); - let expr8_0: u32 = 32i128 as u32; - let expr9_0 = RegMemImm::Imm { simm32: expr8_0 }; - let expr10_0 = constructor_mov_rmi_to_xmm(ctx, &expr9_0); - let expr11_0 = constructor_x64_psrlq(ctx, expr1_0, &expr10_0); - let expr12_0 = C::xmm_to_xmm_mem(ctx, expr11_0); - let expr13_0 = constructor_x64_pmuludq(ctx, expr0_0, &expr12_0); - let expr14_0 = C::xmm_to_xmm_mem(ctx, expr13_0); - let expr15_0 = constructor_x64_paddq(ctx, expr7_0, &expr14_0); - let expr16_0: u32 = 32i128 as u32; - let expr17_0 = RegMemImm::Imm { simm32: expr16_0 }; - let expr18_0 = constructor_mov_rmi_to_xmm(ctx, &expr17_0); - let expr19_0 = constructor_x64_psllq(ctx, expr15_0, &expr18_0); - let expr20_0 = C::xmm_to_xmm_mem(ctx, expr1_0); - let expr21_0 = constructor_x64_pmuludq(ctx, expr0_0, &expr20_0); - let expr22_0 = C::xmm_to_xmm_mem(ctx, expr19_0); - let expr23_0 = constructor_x64_paddq(ctx, expr21_0, &expr22_0); - let expr24_0 = constructor_output_xmm(ctx, expr23_0); - return Some(expr24_0); - } - _ => {} - } - } - _ => {} - } - } - } - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Ternary { - opcode: ref pattern5_0, - args: ref pattern5_1, - } = &pattern4_0 - { - match pattern5_0 { - &Opcode::Bitselect => { - let (pattern7_0, pattern7_1, pattern7_2) = - C::unpack_value_array_3(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 1248. - let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0); - let expr1_0 = constructor_put_in_xmm(ctx, pattern7_1); - let expr2_0 = C::xmm_to_xmm_mem(ctx, expr0_0); - let expr3_0 = constructor_sse_and(ctx, pattern2_0, expr1_0, &expr2_0); - let expr4_0 = C::put_in_xmm_mem(ctx, pattern7_2); - let expr5_0 = constructor_sse_and_not(ctx, pattern2_0, expr0_0, &expr4_0); - let expr6_0 = C::xmm_to_xmm_mem(ctx, expr3_0); - let expr7_0 = constructor_sse_or(ctx, pattern2_0, expr5_0, &expr6_0); - let expr8_0 = constructor_output_xmm(ctx, expr7_0); - return Some(expr8_0); - } - &Opcode::Vselect => { - let (pattern7_0, pattern7_1, pattern7_2) = - C::unpack_value_array_3(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 1282. - let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0); - let expr1_0 = C::put_in_xmm_mem(ctx, pattern7_1); - let expr2_0 = constructor_put_in_xmm(ctx, pattern7_2); - let expr3_0 = - constructor_x64_blend(ctx, pattern2_0, expr0_0, &expr1_0, expr2_0); - let expr4_0 = constructor_output_xmm(ctx, expr3_0); - return Some(expr4_0); - } - _ => {} - } - } - } - if let Some(pattern3_0) = C::fits_in_32(ctx, pattern2_0) { - if let Some(pattern4_0) = C::ty_int(ctx, pattern2_0) { - let pattern5_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::LoadNoOffset { - opcode: ref pattern6_0, - arg: pattern6_1, - flags: pattern6_2, - } = &pattern5_0 - { - if let &Opcode::AtomicLoad = pattern6_0 { - // Rule at src/isa/x64/lower.isle line 2811. - let expr0_0 = C::ty_bits_u16(ctx, pattern3_0); - let expr1_0: u16 = 64i128 as u16; - let expr2_0 = C::ext_mode(ctx, expr0_0, expr1_0); - let expr3_0 = C::zero_offset(ctx); - let expr4_0 = constructor_to_amode(ctx, pattern6_2, pattern6_1, expr3_0); - let expr5_0 = constructor_amode_to_gpr_mem(ctx, &expr4_0); - let expr6_0 = constructor_x64_movzx(ctx, &expr2_0, &expr5_0); - let expr7_0 = constructor_output_gpr(ctx, expr6_0); - return Some(expr7_0); - } - } - } - } - if let Some(pattern3_0) = C::fits_in_64(ctx, pattern2_0) { - if let Some(pattern4_0) = C::ty_int(ctx, pattern2_0) { - let pattern5_0 = C::inst_data(ctx, pattern0_0); - match &pattern5_0 { - &InstructionData::AtomicRmw { - opcode: ref pattern6_0, - args: ref pattern6_1, - flags: pattern6_2, - op: ref pattern6_3, - } => { - if let &Opcode::AtomicRmw = pattern6_0 { - let (pattern8_0, pattern8_1) = C::unpack_value_array_2(ctx, pattern6_1); - // Rule at src/isa/x64/lower.isle line 2844. - let expr0_0 = C::atomic_rmw_op_to_mach_atomic_rmw_op(ctx, pattern6_3); - let expr1_0 = C::zero_offset(ctx); - let expr2_0 = - constructor_to_amode(ctx, pattern6_2, pattern8_0, expr1_0); - let expr3_0 = C::amode_to_synthetic_amode(ctx, &expr2_0); - let expr4_0 = constructor_put_in_gpr(ctx, pattern8_1); - let expr5_0 = constructor_x64_atomic_rmw_seq( - ctx, pattern3_0, &expr0_0, &expr3_0, expr4_0, - ); - let expr6_0 = constructor_output_gpr(ctx, expr5_0); - return Some(expr6_0); - } - } - &InstructionData::AtomicCas { - opcode: ref pattern6_0, - args: ref pattern6_1, - flags: pattern6_2, - } => { - if let &Opcode::AtomicCas = pattern6_0 { - let (pattern8_0, pattern8_1, pattern8_2) = - C::unpack_value_array_3(ctx, pattern6_1); - // Rule at src/isa/x64/lower.isle line 2828. - let expr0_0 = constructor_put_in_gpr(ctx, pattern8_1); - let expr1_0 = constructor_put_in_gpr(ctx, pattern8_2); - let expr2_0 = C::zero_offset(ctx); - let expr3_0 = - constructor_to_amode(ctx, pattern6_2, pattern8_0, expr2_0); - let expr4_0 = C::amode_to_synthetic_amode(ctx, &expr3_0); - let expr5_0 = constructor_x64_cmpxchg( - ctx, pattern3_0, expr0_0, expr1_0, &expr4_0, - ); - let expr6_0 = constructor_output_gpr(ctx, expr5_0); - return Some(expr6_0); - } - } - _ => {} - } - } - let pattern4_0 = C::inst_data(ctx, pattern0_0); - match &pattern4_0 { - &InstructionData::UnaryImm { - opcode: ref pattern5_0, - imm: pattern5_1, - } => { - if let &Opcode::Iconst = pattern5_0 { - let pattern7_0 = C::u64_from_imm64(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 15. - let expr0_0 = constructor_imm(ctx, pattern3_0, pattern7_0); - let expr1_0 = constructor_output_reg(ctx, expr0_0); - return Some(expr1_0); - } - } - &InstructionData::IntAddTrap { - opcode: ref pattern5_0, - args: ref pattern5_1, - code: ref pattern5_2, - } => { - if let &Opcode::UaddOverflowTrap = pattern5_0 { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 1432. - let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0); - let expr1_0 = constructor_put_in_gpr_mem_imm(ctx, pattern7_1); - let expr2_0 = constructor_x64_add_with_flags_paired( - ctx, pattern3_0, expr0_0, &expr1_0, - ); - let expr3_0 = CC::B; - let expr4_0 = constructor_trap_if(ctx, &expr3_0, pattern5_2); - let expr5_0 = constructor_with_flags(ctx, &expr2_0, &expr4_0); - let expr6_0 = C::output(ctx, expr5_0); - return Some(expr6_0); - } - } - _ => {} - } - } - if let Some(pattern3_0) = C::type_register_class(ctx, pattern2_0) { - if let &RegisterClass::Gpr { - single_register: pattern4_0, - } = &pattern3_0 - { - let pattern5_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Load { - opcode: ref pattern6_0, - arg: pattern6_1, - flags: pattern6_2, - offset: pattern6_3, - } = &pattern5_0 - { - match pattern6_0 { - &Opcode::Uload8 => { - // Rule at src/isa/x64/lower.isle line 2529. - let expr0_0 = ExtMode::BQ; - let expr1_0 = - constructor_to_amode(ctx, pattern6_2, pattern6_1, pattern6_3); - let expr2_0 = constructor_amode_to_gpr_mem(ctx, &expr1_0); - let expr3_0 = constructor_x64_movzx(ctx, &expr0_0, &expr2_0); - let expr4_0 = constructor_output_gpr(ctx, expr3_0); - return Some(expr4_0); - } - &Opcode::Sload8 => { - // Rule at src/isa/x64/lower.isle line 2531. - let expr0_0 = ExtMode::BQ; - let expr1_0 = - constructor_to_amode(ctx, pattern6_2, pattern6_1, pattern6_3); - let expr2_0 = constructor_amode_to_gpr_mem(ctx, &expr1_0); - let expr3_0 = constructor_x64_movsx(ctx, &expr0_0, &expr2_0); - let expr4_0 = constructor_output_gpr(ctx, expr3_0); - return Some(expr4_0); - } - &Opcode::Uload16 => { - // Rule at src/isa/x64/lower.isle line 2533. - let expr0_0 = ExtMode::WQ; - let expr1_0 = - constructor_to_amode(ctx, pattern6_2, pattern6_1, pattern6_3); - let expr2_0 = constructor_amode_to_gpr_mem(ctx, &expr1_0); - let expr3_0 = constructor_x64_movzx(ctx, &expr0_0, &expr2_0); - let expr4_0 = constructor_output_gpr(ctx, expr3_0); - return Some(expr4_0); - } - &Opcode::Sload16 => { - // Rule at src/isa/x64/lower.isle line 2535. - let expr0_0 = ExtMode::WQ; - let expr1_0 = - constructor_to_amode(ctx, pattern6_2, pattern6_1, pattern6_3); - let expr2_0 = constructor_amode_to_gpr_mem(ctx, &expr1_0); - let expr3_0 = constructor_x64_movsx(ctx, &expr0_0, &expr2_0); - let expr4_0 = constructor_output_gpr(ctx, expr3_0); - return Some(expr4_0); - } - &Opcode::Uload32 => { - // Rule at src/isa/x64/lower.isle line 2537. - let expr0_0 = ExtMode::LQ; - let expr1_0 = - constructor_to_amode(ctx, pattern6_2, pattern6_1, pattern6_3); - let expr2_0 = constructor_amode_to_gpr_mem(ctx, &expr1_0); - let expr3_0 = constructor_x64_movzx(ctx, &expr0_0, &expr2_0); - let expr4_0 = constructor_output_gpr(ctx, expr3_0); - return Some(expr4_0); - } - &Opcode::Sload32 => { - // Rule at src/isa/x64/lower.isle line 2539. - let expr0_0 = ExtMode::LQ; - let expr1_0 = - constructor_to_amode(ctx, pattern6_2, pattern6_1, pattern6_3); - let expr2_0 = constructor_amode_to_gpr_mem(ctx, &expr1_0); - let expr3_0 = constructor_x64_movsx(ctx, &expr0_0, &expr2_0); - let expr4_0 = constructor_output_gpr(ctx, expr3_0); - return Some(expr4_0); - } - _ => {} - } - } - } - } - let pattern3_0 = C::inst_data(ctx, pattern0_0); - match &pattern3_0 { - &InstructionData::NullAry { - opcode: ref pattern4_0, - } => { - if let &Opcode::Null = pattern4_0 { - // Rule at src/isa/x64/lower.isle line 37. - let expr0_0: u64 = 0i128 as u64; - let expr1_0 = constructor_imm(ctx, pattern2_0, expr0_0); - let expr2_0 = constructor_output_reg(ctx, expr1_0); - return Some(expr2_0); - } - } - &InstructionData::Unary { - opcode: ref pattern4_0, - arg: pattern4_1, - } => { - match pattern4_0 { - &Opcode::Bmask => { - let pattern6_0 = C::value_type(ctx, pattern4_1); - // Rule at src/isa/x64/lower.isle line 1211. - let expr0_0 = C::put_in_regs(ctx, pattern4_1); - let expr1_0 = constructor_lower_bmask(ctx, pattern2_0, pattern6_0, expr0_0); - let expr2_0 = C::output(ctx, expr1_0); - return Some(expr2_0); - } - &Opcode::Ireduce => { - let pattern6_0 = C::value_type(ctx, pattern4_1); - if pattern6_0 == pattern2_0 { - // Rule at src/isa/x64/lower.isle line 2212. - let expr0_0 = constructor_output_value(ctx, pattern4_1); - return Some(expr0_0); - } - } - &Opcode::Sextend => { - let pattern6_0 = C::value_type(ctx, pattern4_1); - // Rule at src/isa/x64/lower.isle line 2204. - let expr0_0 = - constructor_generic_sextend(ctx, pattern4_1, pattern6_0, pattern2_0); - return Some(expr0_0); - } - &Opcode::FcvtToUint => { - let pattern6_0 = C::value_type(ctx, pattern4_1); - if let Some(pattern7_0) = C::ty_scalar_float(ctx, pattern6_0) { - // Rule at src/isa/x64/lower.isle line 3060. - let expr0_0: bool = false; - let expr1_0 = constructor_cvt_float_to_uint_seq( - ctx, pattern2_0, pattern4_1, expr0_0, - ); - let expr2_0 = constructor_output_gpr(ctx, expr1_0); - return Some(expr2_0); - } - } - &Opcode::FcvtToSint => { - let pattern6_0 = C::value_type(ctx, pattern4_1); - if let Some(pattern7_0) = C::ty_scalar_float(ctx, pattern6_0) { - // Rule at src/isa/x64/lower.isle line 3066. - let expr0_0: bool = false; - let expr1_0 = constructor_cvt_float_to_sint_seq( - ctx, pattern2_0, pattern4_1, expr0_0, - ); - let expr2_0 = constructor_output_gpr(ctx, expr1_0); - return Some(expr2_0); - } - } - &Opcode::FcvtToUintSat => { - let pattern6_0 = C::value_type(ctx, pattern4_1); - if let Some(pattern7_0) = C::ty_scalar_float(ctx, pattern6_0) { - // Rule at src/isa/x64/lower.isle line 3063. - let expr0_0: bool = true; - let expr1_0 = constructor_cvt_float_to_uint_seq( - ctx, pattern2_0, pattern4_1, expr0_0, - ); - let expr2_0 = constructor_output_gpr(ctx, expr1_0); - return Some(expr2_0); - } - } - &Opcode::FcvtToSintSat => { - let pattern6_0 = C::value_type(ctx, pattern4_1); - if let Some(pattern7_0) = C::ty_scalar_float(ctx, pattern6_0) { - // Rule at src/isa/x64/lower.isle line 3069. - let expr0_0: bool = true; - let expr1_0 = constructor_cvt_float_to_sint_seq( - ctx, pattern2_0, pattern4_1, expr0_0, - ); - let expr2_0 = constructor_output_gpr(ctx, expr1_0); - return Some(expr2_0); - } - } - &Opcode::FcvtFromUint => { - let pattern6_0 = C::value_type(ctx, pattern4_1); - if pattern6_0 == I64 { - // Rule at src/isa/x64/lower.isle line 2994. - let expr0_0 = constructor_put_in_gpr(ctx, pattern4_1); - let expr1_0 = - constructor_cvt_u64_to_float_seq(ctx, pattern2_0, expr0_0); - let expr2_0 = constructor_output_xmm(ctx, expr1_0); - return Some(expr2_0); - } - } - _ => {} - } - } - &InstructionData::UnaryConst { - opcode: ref pattern4_0, - constant_handle: pattern4_1, - } => { - if let &Opcode::Vconst = pattern4_0 { - // Rule at src/isa/x64/lower.isle line 3505. - let expr0_0 = C::const_to_vconst(ctx, pattern4_1); - let expr1_0 = constructor_x64_xmm_load_const(ctx, pattern2_0, expr0_0); - let expr2_0 = constructor_output_xmm(ctx, expr1_0); - return Some(expr2_0); - } - } - &InstructionData::Binary { - opcode: ref pattern4_0, - args: ref pattern4_1, - } => { - match pattern4_0 { - &Opcode::Band => { - let (pattern6_0, pattern6_1) = C::unpack_value_array_2(ctx, pattern4_1); - let mut closure7 = || { - let expr0_0 = C::ty_int_ref_scalar_64(ctx, pattern2_0)?; - return Some(expr0_0); - }; - if let Some(pattern7_0) = closure7() { - // Rule at src/isa/x64/lower.isle line 215. - let expr0_0 = constructor_put_in_gpr(ctx, pattern6_0); - let expr1_0 = constructor_put_in_gpr_mem_imm(ctx, pattern6_1); - let expr2_0 = constructor_x64_and(ctx, pattern2_0, expr0_0, &expr1_0); - let expr3_0 = constructor_output_gpr(ctx, expr2_0); - return Some(expr3_0); - } - } - &Opcode::Bor => { - let (pattern6_0, pattern6_1) = C::unpack_value_array_2(ctx, pattern4_1); - let mut closure7 = || { - let expr0_0 = C::ty_int_ref_scalar_64(ctx, pattern2_0)?; - return Some(expr0_0); - }; - if let Some(pattern7_0) = closure7() { - // Rule at src/isa/x64/lower.isle line 277. - let expr0_0 = constructor_put_in_gpr(ctx, pattern6_0); - let expr1_0 = constructor_put_in_gpr_mem_imm(ctx, pattern6_1); - let expr2_0 = constructor_x64_or(ctx, pattern2_0, expr0_0, &expr1_0); - let expr3_0 = constructor_output_gpr(ctx, expr2_0); - return Some(expr3_0); - } - } - &Opcode::Bxor => { - let (pattern6_0, pattern6_1) = C::unpack_value_array_2(ctx, pattern4_1); - let mut closure7 = || { - let expr0_0 = C::ty_int_ref_scalar_64(ctx, pattern2_0)?; - return Some(expr0_0); - }; - if let Some(pattern7_0) = closure7() { - // Rule at src/isa/x64/lower.isle line 340. - let expr0_0 = constructor_put_in_gpr(ctx, pattern6_0); - let expr1_0 = constructor_put_in_gpr_mem_imm(ctx, pattern6_1); - let expr2_0 = constructor_x64_xor(ctx, pattern2_0, expr0_0, &expr1_0); - let expr3_0 = constructor_output_gpr(ctx, expr2_0); - return Some(expr3_0); - } - } - &Opcode::BandNot => { - let (pattern6_0, pattern6_1) = C::unpack_value_array_2(ctx, pattern4_1); - // Rule at src/isa/x64/lower.isle line 1102. - let expr0_0 = constructor_put_in_xmm(ctx, pattern6_1); - let expr1_0 = C::put_in_xmm_mem(ctx, pattern6_0); - let expr2_0 = constructor_sse_and_not(ctx, pattern2_0, expr0_0, &expr1_0); - let expr3_0 = constructor_output_xmm(ctx, expr2_0); - return Some(expr3_0); - } - _ => {} - } - } - &InstructionData::Ternary { - opcode: ref pattern4_0, - args: ref pattern4_1, - } => { - if let &Opcode::Select = pattern4_0 { - let (pattern6_0, pattern6_1, pattern6_2) = - C::unpack_value_array_3(ctx, pattern4_1); - if let Some(pattern7_0) = C::maybe_uextend(ctx, pattern6_0) { - if let Some(pattern8_0) = C::def_inst(ctx, pattern7_0) { - let pattern9_0 = C::inst_data(ctx, pattern8_0); - match &pattern9_0 { - &InstructionData::FloatCompare { - opcode: ref pattern10_0, - args: ref pattern10_1, - cond: ref pattern10_2, - } => { - if let &Opcode::Fcmp = pattern10_0 { - let (pattern12_0, pattern12_1) = - C::unpack_value_array_2(ctx, pattern10_1); - match pattern10_2 { - &FloatCC::Equal => { - // Rule at src/isa/x64/lower.isle line 1727. - let expr0_0 = constructor_x64_ucomis( - ctx, - pattern12_0, - pattern12_1, - ); - let expr1_0 = CC::NZ; - let expr2_0 = CC::P; - let expr3_0 = constructor_cmove_or_from_values( - ctx, pattern2_0, &expr1_0, &expr2_0, - pattern6_2, pattern6_1, - ); - let expr4_0 = - constructor_with_flags(ctx, &expr0_0, &expr3_0); - let expr5_0 = C::output(ctx, expr4_0); - return Some(expr5_0); - } - &FloatCC::GreaterThan => { - // Rule at src/isa/x64/lower.isle line 1679. - let expr0_0 = constructor_x64_ucomis( - ctx, - pattern12_1, - pattern12_0, - ); - let expr1_0 = CC::NBE; - let expr2_0 = constructor_cmove_from_values( - ctx, pattern2_0, &expr1_0, pattern6_1, - pattern6_2, - ); - let expr3_0 = - constructor_with_flags(ctx, &expr0_0, &expr2_0); - let expr4_0 = C::output(ctx, expr3_0); - return Some(expr4_0); - } - &FloatCC::GreaterThanOrEqual => { - // Rule at src/isa/x64/lower.isle line 1682. - let expr0_0 = constructor_x64_ucomis( - ctx, - pattern12_1, - pattern12_0, - ); - let expr1_0 = CC::NB; - let expr2_0 = constructor_cmove_from_values( - ctx, pattern2_0, &expr1_0, pattern6_1, - pattern6_2, - ); - let expr3_0 = - constructor_with_flags(ctx, &expr0_0, &expr2_0); - let expr4_0 = C::output(ctx, expr3_0); - return Some(expr4_0); - } - &FloatCC::LessThan => { - // Rule at src/isa/x64/lower.isle line 1702. - let expr0_0 = constructor_x64_ucomis( - ctx, - pattern12_0, - pattern12_1, - ); - let expr1_0 = CC::NBE; - let expr2_0 = constructor_cmove_from_values( - ctx, pattern2_0, &expr1_0, pattern6_1, - pattern6_2, - ); - let expr3_0 = - constructor_with_flags(ctx, &expr0_0, &expr2_0); - let expr4_0 = C::output(ctx, expr3_0); - return Some(expr4_0); - } - &FloatCC::LessThanOrEqual => { - // Rule at src/isa/x64/lower.isle line 1705. - let expr0_0 = constructor_x64_ucomis( - ctx, - pattern12_0, - pattern12_1, - ); - let expr1_0 = CC::NB; - let expr2_0 = constructor_cmove_from_values( - ctx, pattern2_0, &expr1_0, pattern6_1, - pattern6_2, - ); - let expr3_0 = - constructor_with_flags(ctx, &expr0_0, &expr2_0); - let expr4_0 = C::output(ctx, expr3_0); - return Some(expr4_0); - } - &FloatCC::NotEqual => { - // Rule at src/isa/x64/lower.isle line 1730. - let expr0_0 = constructor_x64_ucomis( - ctx, - pattern12_0, - pattern12_1, - ); - let expr1_0 = CC::NZ; - let expr2_0 = CC::P; - let expr3_0 = constructor_cmove_or_from_values( - ctx, pattern2_0, &expr1_0, &expr2_0, - pattern6_1, pattern6_2, - ); - let expr4_0 = - constructor_with_flags(ctx, &expr0_0, &expr3_0); - let expr5_0 = C::output(ctx, expr4_0); - return Some(expr5_0); - } - &FloatCC::Ordered => { - // Rule at src/isa/x64/lower.isle line 1673. - let expr0_0 = constructor_x64_ucomis( - ctx, - pattern12_1, - pattern12_0, - ); - let expr1_0 = CC::NP; - let expr2_0 = constructor_cmove_from_values( - ctx, pattern2_0, &expr1_0, pattern6_1, - pattern6_2, - ); - let expr3_0 = - constructor_with_flags(ctx, &expr0_0, &expr2_0); - let expr4_0 = C::output(ctx, expr3_0); - return Some(expr4_0); - } - &FloatCC::Unordered => { - // Rule at src/isa/x64/lower.isle line 1676. - let expr0_0 = constructor_x64_ucomis( - ctx, - pattern12_1, - pattern12_0, - ); - let expr1_0 = CC::P; - let expr2_0 = constructor_cmove_from_values( - ctx, pattern2_0, &expr1_0, pattern6_1, - pattern6_2, - ); - let expr3_0 = - constructor_with_flags(ctx, &expr0_0, &expr2_0); - let expr4_0 = C::output(ctx, expr3_0); - return Some(expr4_0); - } - &FloatCC::UnorderedOrGreaterThan => { - // Rule at src/isa/x64/lower.isle line 1708. - let expr0_0 = constructor_x64_ucomis( - ctx, - pattern12_0, - pattern12_1, - ); - let expr1_0 = CC::B; - let expr2_0 = constructor_cmove_from_values( - ctx, pattern2_0, &expr1_0, pattern6_1, - pattern6_2, - ); - let expr3_0 = - constructor_with_flags(ctx, &expr0_0, &expr2_0); - let expr4_0 = C::output(ctx, expr3_0); - return Some(expr4_0); - } - &FloatCC::UnorderedOrGreaterThanOrEqual => { - // Rule at src/isa/x64/lower.isle line 1711. - let expr0_0 = constructor_x64_ucomis( - ctx, - pattern12_0, - pattern12_1, - ); - let expr1_0 = CC::BE; - let expr2_0 = constructor_cmove_from_values( - ctx, pattern2_0, &expr1_0, pattern6_1, - pattern6_2, - ); - let expr3_0 = - constructor_with_flags(ctx, &expr0_0, &expr2_0); - let expr4_0 = C::output(ctx, expr3_0); - return Some(expr4_0); - } - &FloatCC::UnorderedOrLessThan => { - // Rule at src/isa/x64/lower.isle line 1685. - let expr0_0 = constructor_x64_ucomis( - ctx, - pattern12_1, - pattern12_0, - ); - let expr1_0 = CC::B; - let expr2_0 = constructor_cmove_from_values( - ctx, pattern2_0, &expr1_0, pattern6_1, - pattern6_2, - ); - let expr3_0 = - constructor_with_flags(ctx, &expr0_0, &expr2_0); - let expr4_0 = C::output(ctx, expr3_0); - return Some(expr4_0); - } - &FloatCC::UnorderedOrLessThanOrEqual => { - // Rule at src/isa/x64/lower.isle line 1688. - let expr0_0 = constructor_x64_ucomis( - ctx, - pattern12_1, - pattern12_0, - ); - let expr1_0 = CC::BE; - let expr2_0 = constructor_cmove_from_values( - ctx, pattern2_0, &expr1_0, pattern6_1, - pattern6_2, - ); - let expr3_0 = - constructor_with_flags(ctx, &expr0_0, &expr2_0); - let expr4_0 = C::output(ctx, expr3_0); - return Some(expr4_0); - } - _ => {} - } - } - } - &InstructionData::IntCompare { - opcode: ref pattern10_0, - args: ref pattern10_1, - cond: ref pattern10_2, - } => { - if let &Opcode::Icmp = pattern10_0 { - let (pattern12_0, pattern12_1) = - C::unpack_value_array_2(ctx, pattern10_1); - let pattern13_0 = C::value_type(ctx, pattern12_0); - if let Some(pattern14_0) = C::fits_in_64(ctx, pattern13_0) { - // Rule at src/isa/x64/lower.isle line 1738. - let expr0_0 = - C::raw_operand_size_of_type(ctx, pattern14_0); - let expr1_0 = - constructor_put_in_gpr_mem_imm(ctx, pattern12_1); - let expr2_0 = constructor_put_in_gpr(ctx, pattern12_0); - let expr3_0 = constructor_x64_cmp( - ctx, &expr0_0, &expr1_0, expr2_0, - ); - let expr4_0 = C::intcc_to_cc(ctx, pattern10_2); - let expr5_0 = constructor_cmove_from_values( - ctx, pattern2_0, &expr4_0, pattern6_1, pattern6_2, - ); - let expr6_0 = - constructor_with_flags(ctx, &expr3_0, &expr5_0); - let expr7_0 = C::output(ctx, expr6_0); - return Some(expr7_0); - } - } - } - _ => {} - } - } - } - } - } - _ => {} - } - let pattern3_0 = C::use_fma(ctx, pattern2_0); - if pattern3_0 == true { - if pattern2_0 == F32X4 { - let pattern6_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Ternary { - opcode: ref pattern7_0, - args: ref pattern7_1, - } = &pattern6_0 - { - if let &Opcode::Fma = pattern7_0 { - let (pattern9_0, pattern9_1, pattern9_2) = - C::unpack_value_array_3(ctx, pattern7_1); - // Rule at src/isa/x64/lower.isle line 2507. - let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0); - let expr1_0 = constructor_put_in_xmm(ctx, pattern9_1); - let expr2_0 = constructor_put_in_xmm(ctx, pattern9_2); - let expr3_0 = constructor_x64_vfmadd213ps(ctx, expr0_0, expr1_0, expr2_0); - let expr4_0 = constructor_output_xmm(ctx, expr3_0); - return Some(expr4_0); - } - } - } - if pattern2_0 == F64X2 { - let pattern6_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Ternary { - opcode: ref pattern7_0, - args: ref pattern7_1, - } = &pattern6_0 - { - if let &Opcode::Fma = pattern7_0 { - let (pattern9_0, pattern9_1, pattern9_2) = - C::unpack_value_array_3(ctx, pattern7_1); - // Rule at src/isa/x64/lower.isle line 2509. - let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0); - let expr1_0 = constructor_put_in_xmm(ctx, pattern9_1); - let expr2_0 = constructor_put_in_xmm(ctx, pattern9_2); - let expr3_0 = constructor_x64_vfmadd213pd(ctx, expr0_0, expr1_0, expr2_0); - let expr4_0 = constructor_output_xmm(ctx, expr3_0); - return Some(expr4_0); - } - } - } - } - let pattern3_0 = C::use_sse41(ctx, pattern2_0); - if pattern3_0 == true { - let pattern5_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Unary { - opcode: ref pattern6_0, - arg: pattern6_1, - } = &pattern5_0 - { - match pattern6_0 { - &Opcode::Ceil => { - let pattern8_0 = C::value_type(ctx, pattern6_1); - if pattern8_0 == F32 { - // Rule at src/isa/x64/lower.isle line 3356. - let expr0_0 = C::put_in_xmm_mem(ctx, pattern6_1); - let expr1_0 = RoundImm::RoundUp; - let expr2_0 = constructor_x64_roundss(ctx, &expr0_0, &expr1_0); - let expr3_0 = constructor_output_xmm(ctx, expr2_0); - return Some(expr3_0); - } - if pattern8_0 == F64 { - // Rule at src/isa/x64/lower.isle line 3362. - let expr0_0 = C::put_in_xmm_mem(ctx, pattern6_1); - let expr1_0 = RoundImm::RoundUp; - let expr2_0 = constructor_x64_roundsd(ctx, &expr0_0, &expr1_0); - let expr3_0 = constructor_output_xmm(ctx, expr2_0); - return Some(expr3_0); - } - if pattern8_0 == F32X4 { - // Rule at src/isa/x64/lower.isle line 3368. - let expr0_0 = C::put_in_xmm_mem(ctx, pattern6_1); - let expr1_0 = RoundImm::RoundUp; - let expr2_0 = constructor_x64_roundps(ctx, &expr0_0, &expr1_0); - let expr3_0 = constructor_output_xmm(ctx, expr2_0); - return Some(expr3_0); - } - if pattern8_0 == F64X2 { - // Rule at src/isa/x64/lower.isle line 3371. - let expr0_0 = C::put_in_xmm_mem(ctx, pattern6_1); - let expr1_0 = RoundImm::RoundUp; - let expr2_0 = constructor_x64_roundpd(ctx, &expr0_0, &expr1_0); - let expr3_0 = constructor_output_xmm(ctx, expr2_0); - return Some(expr3_0); - } - } - &Opcode::Floor => { - let pattern8_0 = C::value_type(ctx, pattern6_1); - if pattern8_0 == F32 { - // Rule at src/isa/x64/lower.isle line 3376. - let expr0_0 = C::put_in_xmm_mem(ctx, pattern6_1); - let expr1_0 = RoundImm::RoundDown; - let expr2_0 = constructor_x64_roundss(ctx, &expr0_0, &expr1_0); - let expr3_0 = constructor_output_xmm(ctx, expr2_0); - return Some(expr3_0); - } - if pattern8_0 == F64 { - // Rule at src/isa/x64/lower.isle line 3382. - let expr0_0 = C::put_in_xmm_mem(ctx, pattern6_1); - let expr1_0 = RoundImm::RoundDown; - let expr2_0 = constructor_x64_roundsd(ctx, &expr0_0, &expr1_0); - let expr3_0 = constructor_output_xmm(ctx, expr2_0); - return Some(expr3_0); - } - if pattern8_0 == F32X4 { - // Rule at src/isa/x64/lower.isle line 3388. - let expr0_0 = C::put_in_xmm_mem(ctx, pattern6_1); - let expr1_0 = RoundImm::RoundDown; - let expr2_0 = constructor_x64_roundps(ctx, &expr0_0, &expr1_0); - let expr3_0 = constructor_output_xmm(ctx, expr2_0); - return Some(expr3_0); - } - if pattern8_0 == F64X2 { - // Rule at src/isa/x64/lower.isle line 3391. - let expr0_0 = C::put_in_xmm_mem(ctx, pattern6_1); - let expr1_0 = RoundImm::RoundDown; - let expr2_0 = constructor_x64_roundpd(ctx, &expr0_0, &expr1_0); - let expr3_0 = constructor_output_xmm(ctx, expr2_0); - return Some(expr3_0); - } - } - &Opcode::Trunc => { - let pattern8_0 = C::value_type(ctx, pattern6_1); - if pattern8_0 == F32 { - // Rule at src/isa/x64/lower.isle line 3416. - let expr0_0 = C::put_in_xmm_mem(ctx, pattern6_1); - let expr1_0 = RoundImm::RoundZero; - let expr2_0 = constructor_x64_roundss(ctx, &expr0_0, &expr1_0); - let expr3_0 = constructor_output_xmm(ctx, expr2_0); - return Some(expr3_0); - } - if pattern8_0 == F64 { - // Rule at src/isa/x64/lower.isle line 3422. - let expr0_0 = C::put_in_xmm_mem(ctx, pattern6_1); - let expr1_0 = RoundImm::RoundZero; - let expr2_0 = constructor_x64_roundsd(ctx, &expr0_0, &expr1_0); - let expr3_0 = constructor_output_xmm(ctx, expr2_0); - return Some(expr3_0); - } - if pattern8_0 == F32X4 { - // Rule at src/isa/x64/lower.isle line 3428. - let expr0_0 = C::put_in_xmm_mem(ctx, pattern6_1); - let expr1_0 = RoundImm::RoundZero; - let expr2_0 = constructor_x64_roundps(ctx, &expr0_0, &expr1_0); - let expr3_0 = constructor_output_xmm(ctx, expr2_0); - return Some(expr3_0); - } - if pattern8_0 == F64X2 { - // Rule at src/isa/x64/lower.isle line 3431. - let expr0_0 = C::put_in_xmm_mem(ctx, pattern6_1); - let expr1_0 = RoundImm::RoundZero; - let expr2_0 = constructor_x64_roundpd(ctx, &expr0_0, &expr1_0); - let expr3_0 = constructor_output_xmm(ctx, expr2_0); - return Some(expr3_0); - } - } - &Opcode::Nearest => { - let pattern8_0 = C::value_type(ctx, pattern6_1); - if pattern8_0 == F32 { - // Rule at src/isa/x64/lower.isle line 3396. - let expr0_0 = C::put_in_xmm_mem(ctx, pattern6_1); - let expr1_0 = RoundImm::RoundNearest; - let expr2_0 = constructor_x64_roundss(ctx, &expr0_0, &expr1_0); - let expr3_0 = constructor_output_xmm(ctx, expr2_0); - return Some(expr3_0); - } - if pattern8_0 == F64 { - // Rule at src/isa/x64/lower.isle line 3402. - let expr0_0 = C::put_in_xmm_mem(ctx, pattern6_1); - let expr1_0 = RoundImm::RoundNearest; - let expr2_0 = constructor_x64_roundsd(ctx, &expr0_0, &expr1_0); - let expr3_0 = constructor_output_xmm(ctx, expr2_0); - return Some(expr3_0); - } - if pattern8_0 == F32X4 { - // Rule at src/isa/x64/lower.isle line 3408. - let expr0_0 = C::put_in_xmm_mem(ctx, pattern6_1); - let expr1_0 = RoundImm::RoundNearest; - let expr2_0 = constructor_x64_roundps(ctx, &expr0_0, &expr1_0); - let expr3_0 = constructor_output_xmm(ctx, expr2_0); - return Some(expr3_0); - } - if pattern8_0 == F64X2 { - // Rule at src/isa/x64/lower.isle line 3411. - let expr0_0 = C::put_in_xmm_mem(ctx, pattern6_1); - let expr1_0 = RoundImm::RoundNearest; - let expr2_0 = constructor_x64_roundpd(ctx, &expr0_0, &expr1_0); - let expr3_0 = constructor_output_xmm(ctx, expr2_0); - return Some(expr3_0); - } - } - _ => {} - } - } - } - if pattern3_0 == false { - let pattern5_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Unary { - opcode: ref pattern6_0, - arg: pattern6_1, - } = &pattern5_0 - { - match pattern6_0 { - &Opcode::Ceil => { - let pattern8_0 = C::value_type(ctx, pattern6_1); - if pattern8_0 == F32 { - // Rule at src/isa/x64/lower.isle line 3359. - let expr0_0 = LibCall::CeilF32; - let expr1_0 = C::put_in_reg(ctx, pattern6_1); - let expr2_0 = C::libcall_1(ctx, &expr0_0, expr1_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - if pattern8_0 == F64 { - // Rule at src/isa/x64/lower.isle line 3365. - let expr0_0 = LibCall::CeilF64; - let expr1_0 = C::put_in_reg(ctx, pattern6_1); - let expr2_0 = C::libcall_1(ctx, &expr0_0, expr1_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - } - &Opcode::Floor => { - let pattern8_0 = C::value_type(ctx, pattern6_1); - if pattern8_0 == F32 { - // Rule at src/isa/x64/lower.isle line 3379. - let expr0_0 = LibCall::FloorF32; - let expr1_0 = C::put_in_reg(ctx, pattern6_1); - let expr2_0 = C::libcall_1(ctx, &expr0_0, expr1_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - if pattern8_0 == F64 { - // Rule at src/isa/x64/lower.isle line 3385. - let expr0_0 = LibCall::FloorF64; - let expr1_0 = C::put_in_reg(ctx, pattern6_1); - let expr2_0 = C::libcall_1(ctx, &expr0_0, expr1_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - } - &Opcode::Trunc => { - let pattern8_0 = C::value_type(ctx, pattern6_1); - if pattern8_0 == F32 { - // Rule at src/isa/x64/lower.isle line 3419. - let expr0_0 = LibCall::TruncF32; - let expr1_0 = C::put_in_reg(ctx, pattern6_1); - let expr2_0 = C::libcall_1(ctx, &expr0_0, expr1_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - if pattern8_0 == F64 { - // Rule at src/isa/x64/lower.isle line 3425. - let expr0_0 = LibCall::TruncF64; - let expr1_0 = C::put_in_reg(ctx, pattern6_1); - let expr2_0 = C::libcall_1(ctx, &expr0_0, expr1_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - } - &Opcode::Nearest => { - let pattern8_0 = C::value_type(ctx, pattern6_1); - if pattern8_0 == F32 { - // Rule at src/isa/x64/lower.isle line 3399. - let expr0_0 = LibCall::NearestF32; - let expr1_0 = C::put_in_reg(ctx, pattern6_1); - let expr2_0 = C::libcall_1(ctx, &expr0_0, expr1_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - if pattern8_0 == F64 { - // Rule at src/isa/x64/lower.isle line 3405. - let expr0_0 = LibCall::NearestF64; - let expr1_0 = C::put_in_reg(ctx, pattern6_1); - let expr2_0 = C::libcall_1(ctx, &expr0_0, expr1_0); - let expr3_0 = constructor_output_reg(ctx, expr2_0); - return Some(expr3_0); - } - } - _ => {} - } - } - } - let pattern3_0 = C::tls_model(ctx, pattern2_0); - match &pattern3_0 { - &TlsModel::ElfGd => { - let pattern5_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::UnaryGlobalValue { - opcode: ref pattern6_0, - global_value: pattern6_1, - } = &pattern5_0 - { - if let &Opcode::TlsValue = pattern6_0 { - if let Some((pattern8_0, pattern8_1, pattern8_2)) = - C::symbol_value_data(ctx, pattern6_1) - { - // Rule at src/isa/x64/lower.isle line 3713. - let expr0_0 = constructor_elf_tls_get_addr(ctx, pattern8_0); - let expr1_0 = constructor_output_gpr(ctx, expr0_0); - return Some(expr1_0); - } - } - } - } - &TlsModel::Macho => { - let pattern5_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::UnaryGlobalValue { - opcode: ref pattern6_0, - global_value: pattern6_1, - } = &pattern5_0 - { - if let &Opcode::TlsValue = pattern6_0 { - if let Some((pattern8_0, pattern8_1, pattern8_2)) = - C::symbol_value_data(ctx, pattern6_1) - { - // Rule at src/isa/x64/lower.isle line 3716. - let expr0_0 = constructor_macho_tls_get_addr(ctx, pattern8_0); - let expr1_0 = constructor_output_gpr(ctx, expr0_0); - return Some(expr1_0); - } - } - } - } - &TlsModel::Coff => { - let pattern5_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::UnaryGlobalValue { - opcode: ref pattern6_0, - global_value: pattern6_1, - } = &pattern5_0 - { - if let &Opcode::TlsValue = pattern6_0 { - if let Some((pattern8_0, pattern8_1, pattern8_2)) = - C::symbol_value_data(ctx, pattern6_1) - { - // Rule at src/isa/x64/lower.isle line 3719. - let expr0_0 = constructor_coff_tls_get_addr(ctx, pattern8_0); - let expr1_0 = constructor_output_gpr(ctx, expr0_0); - return Some(expr1_0); - } - } - } - } - _ => {} - } - } - let pattern1_0 = C::inst_data(ctx, pattern0_0); - match &pattern1_0 { - &InstructionData::NullAry { - opcode: ref pattern2_0, - } => { - match pattern2_0 { - &Opcode::Debugtrap => { - // Rule at src/isa/x64/lower.isle line 2223. - let expr0_0 = constructor_x64_hlt(ctx); - let expr1_0 = constructor_side_effect(ctx, &expr0_0); - return Some(expr1_0); - } - &Opcode::GetPinnedReg => { - // Rule at src/isa/x64/lower.isle line 3495. - let expr0_0 = constructor_read_pinned_gpr(ctx); - let expr1_0 = constructor_output_gpr(ctx, expr0_0); - return Some(expr1_0); - } - &Opcode::GetFramePointer => { - // Rule at src/isa/x64/lower.isle line 2858. - let expr0_0 = constructor_x64_rbp(ctx); - let expr1_0 = constructor_output_reg(ctx, expr0_0); - return Some(expr1_0); - } - &Opcode::GetStackPointer => { - // Rule at src/isa/x64/lower.isle line 2861. - let expr0_0 = constructor_x64_rsp(ctx); - let expr1_0 = constructor_output_reg(ctx, expr0_0); - return Some(expr1_0); - } - &Opcode::GetReturnAddress => { - // Rule at src/isa/x64/lower.isle line 2864. - let expr0_0: Type = I64; - let expr1_0: u32 = 8i128 as u32; - let expr2_0 = constructor_x64_rbp(ctx); - let expr3_0 = C::mem_flags_trusted(ctx); - let expr4_0 = Amode::ImmReg { - simm32: expr1_0, - base: expr2_0, - flags: expr3_0, - }; - let expr5_0 = C::amode_to_synthetic_amode(ctx, &expr4_0); - let expr6_0 = ExtKind::None; - let expr7_0 = constructor_x64_load(ctx, expr0_0, &expr5_0, &expr6_0); - let expr8_0 = constructor_output_reg(ctx, expr7_0); - return Some(expr8_0); - } - &Opcode::Nop => { - // Rule at src/isa/x64/lower.isle line 3773. - let expr0_0 = C::invalid_reg(ctx); - let expr1_0 = constructor_output_reg(ctx, expr0_0); - return Some(expr1_0); - } - &Opcode::Fence => { - // Rule at src/isa/x64/lower.isle line 2787. - let expr0_0 = constructor_x64_mfence(ctx); - let expr1_0 = constructor_side_effect(ctx, &expr0_0); - return Some(expr1_0); - } - _ => {} - } - } - &InstructionData::Unary { - opcode: ref pattern2_0, - arg: pattern2_1, - } => { - match pattern2_0 { - &Opcode::SetPinnedReg => { - let pattern4_0 = C::value_type(ctx, pattern2_1); - // Rule at src/isa/x64/lower.isle line 3500. - let expr0_0 = constructor_put_in_gpr(ctx, pattern2_1); - let expr1_0 = constructor_write_pinned_gpr(ctx, expr0_0); - let expr2_0 = constructor_side_effect(ctx, &expr1_0); - return Some(expr2_0); - } - &Opcode::VanyTrue => { - // Rule at src/isa/x64/lower.isle line 3654. - let expr0_0 = constructor_put_in_xmm(ctx, pattern2_1); - let expr1_0 = C::xmm_to_xmm_mem(ctx, expr0_0); - let expr2_0 = constructor_x64_ptest(ctx, &expr1_0, expr0_0); - let expr3_0 = CC::NZ; - let expr4_0 = constructor_x64_setcc(ctx, &expr3_0); - let expr5_0 = constructor_with_flags(ctx, &expr2_0, &expr4_0); - let expr6_0 = C::output(ctx, expr5_0); - return Some(expr6_0); - } - &Opcode::VallTrue => { - let pattern4_0 = C::value_type(ctx, pattern2_1); - // Rule at src/isa/x64/lower.isle line 3660. - let expr0_0 = constructor_put_in_xmm(ctx, pattern2_1); - let expr1_0 = C::xmm_to_xmm_mem(ctx, expr0_0); - let expr2_0 = constructor_x64_pxor(ctx, expr0_0, &expr1_0); - let expr3_0 = constructor_vec_int_type(ctx, pattern4_0); - let expr4_0 = C::xmm_to_xmm_mem(ctx, expr2_0); - let expr5_0 = constructor_x64_pcmpeq(ctx, expr3_0, expr0_0, &expr4_0); - let expr6_0 = C::xmm_to_xmm_mem(ctx, expr5_0); - let expr7_0 = constructor_x64_ptest(ctx, &expr6_0, expr5_0); - let expr8_0 = CC::Z; - let expr9_0 = constructor_x64_setcc(ctx, &expr8_0); - let expr10_0 = constructor_with_flags(ctx, &expr7_0, &expr9_0); - let expr11_0 = C::output(ctx, expr10_0); - return Some(expr11_0); - } - &Opcode::VhighBits => { - let pattern4_0 = C::value_type(ctx, pattern2_1); - if let Some((pattern5_0, pattern5_1)) = C::multi_lane(ctx, pattern4_0) { - if pattern5_0 == 8i128 as u32 { - if pattern5_1 == 16i128 as u32 { - // Rule at src/isa/x64/lower.isle line 3677. - let expr0_0 = OperandSize::Size32; - let expr1_0 = constructor_put_in_xmm(ctx, pattern2_1); - let expr2_0 = constructor_x64_pmovmskb(ctx, &expr0_0, expr1_0); - let expr3_0 = constructor_output_gpr(ctx, expr2_0); - return Some(expr3_0); - } - } - if pattern5_0 == 16i128 as u32 { - if pattern5_1 == 8i128 as u32 { - // Rule at src/isa/x64/lower.isle line 3692. - let expr0_0 = constructor_put_in_xmm(ctx, pattern2_1); - let expr1_0 = C::xmm_to_xmm_mem(ctx, expr0_0); - let expr2_0 = constructor_x64_packsswb(ctx, expr0_0, &expr1_0); - let expr3_0 = OperandSize::Size32; - let expr4_0 = constructor_x64_pmovmskb(ctx, &expr3_0, expr2_0); - let expr5_0: Type = I64; - let expr6_0: u8 = 8i128 as u8; - let expr7_0 = Imm8Reg::Imm8 { imm: expr6_0 }; - let expr8_0 = C::imm8_reg_to_imm8_gpr(ctx, &expr7_0); - let expr9_0 = constructor_x64_shr(ctx, expr5_0, expr4_0, &expr8_0); - let expr10_0 = constructor_output_gpr(ctx, expr9_0); - return Some(expr10_0); - } - } - if pattern5_0 == 32i128 as u32 { - if pattern5_1 == 4i128 as u32 { - // Rule at src/isa/x64/lower.isle line 3680. - let expr0_0 = OperandSize::Size32; - let expr1_0 = constructor_put_in_xmm(ctx, pattern2_1); - let expr2_0 = constructor_x64_movmskps(ctx, &expr0_0, expr1_0); - let expr3_0 = constructor_output_gpr(ctx, expr2_0); - return Some(expr3_0); - } - } - if pattern5_0 == 64i128 as u32 { - if pattern5_1 == 2i128 as u32 { - // Rule at src/isa/x64/lower.isle line 3683. - let expr0_0 = OperandSize::Size32; - let expr1_0 = constructor_put_in_xmm(ctx, pattern2_1); - let expr2_0 = constructor_x64_movmskpd(ctx, &expr0_0, expr1_0); - let expr3_0 = constructor_output_gpr(ctx, expr2_0); - return Some(expr3_0); - } - } - } - } - &Opcode::IsNull => { - let pattern4_0 = C::value_type(ctx, pattern2_1); - if pattern4_0 == R64 { - // Rule at src/isa/x64/lower.isle line 2097. - let expr0_0 = OperandSize::Size64; - let expr1_0: u32 = 0i128 as u32; - let expr2_0 = constructor_put_in_gpr(ctx, pattern2_1); - let expr3_0 = constructor_x64_cmp_imm(ctx, &expr0_0, expr1_0, expr2_0); - let expr4_0 = CC::Z; - let expr5_0 = constructor_x64_setcc(ctx, &expr4_0); - let expr6_0 = constructor_with_flags(ctx, &expr3_0, &expr5_0); - let expr7_0 = C::output(ctx, expr6_0); - return Some(expr7_0); - } - } - &Opcode::IsInvalid => { - let pattern4_0 = C::value_type(ctx, pattern2_1); - if pattern4_0 == R64 { - // Rule at src/isa/x64/lower.isle line 2105. - let expr0_0 = OperandSize::Size64; - let expr1_0: u32 = 4294967295i128 as u32; - let expr2_0 = constructor_put_in_gpr(ctx, pattern2_1); - let expr3_0 = constructor_x64_cmp_imm(ctx, &expr0_0, expr1_0, expr2_0); - let expr4_0 = CC::Z; - let expr5_0 = constructor_x64_setcc(ctx, &expr4_0); - let expr6_0 = constructor_with_flags(ctx, &expr3_0, &expr5_0); - let expr7_0 = C::output(ctx, expr6_0); - return Some(expr7_0); - } - } - &Opcode::ScalarToVector => { - let pattern4_0 = C::value_type(ctx, pattern2_1); - // Rule at src/isa/x64/lower.isle line 3598. - let expr0_0 = constructor_put_in_gpr(ctx, pattern2_1); - let expr1_0 = constructor_bitcast_gpr_to_xmm(ctx, pattern4_0, expr0_0); - let expr2_0 = constructor_output_xmm(ctx, expr1_0); - return Some(expr2_0); - } - &Opcode::FcvtFromSint => { - let pattern4_0 = C::value_type(ctx, pattern2_1); - if pattern4_0 == I32X4 { - // Rule at src/isa/x64/lower.isle line 2978. - let expr0_0 = constructor_put_in_xmm(ctx, pattern2_1); - let expr1_0 = constructor_x64_cvtdq2ps(ctx, expr0_0); - let expr2_0 = constructor_output_xmm(ctx, expr1_0); - return Some(expr2_0); - } - } - &Opcode::FcvtLowFromSint => { - let pattern4_0 = C::value_type(ctx, pattern2_1); - // Rule at src/isa/x64/lower.isle line 2983. - let expr0_0 = constructor_put_in_xmm(ctx, pattern2_1); - let expr1_0 = constructor_x64_cvtdq2pd(ctx, pattern4_0, expr0_0); - let expr2_0 = constructor_output_xmm(ctx, expr1_0); - return Some(expr2_0); - } - &Opcode::Isplit => { - let pattern4_0 = C::value_type(ctx, pattern2_1); - if pattern4_0 == I128 { - // Rule at src/isa/x64/lower.isle line 3705. - let expr0_0 = C::put_in_regs(ctx, pattern2_1); - let expr1_0: usize = 0i128 as usize; - let expr2_0 = C::value_regs_get(ctx, expr0_0, expr1_0); - let expr3_0: usize = 1i128 as usize; - let expr4_0 = C::value_regs_get(ctx, expr0_0, expr3_0); - let expr5_0 = C::value_reg(ctx, expr2_0); - let expr6_0 = C::value_reg(ctx, expr4_0); - let expr7_0 = C::output_pair(ctx, expr5_0, expr6_0); - return Some(expr7_0); - } - } - _ => {} - } - } - &InstructionData::BinaryImm8 { - opcode: ref pattern2_0, - arg: pattern2_1, - imm: pattern2_2, - } => { - if let &Opcode::Extractlane = pattern2_0 { - let pattern4_0 = C::value_type(ctx, pattern2_1); - if let Some((pattern5_0, pattern5_1)) = C::multi_lane(ctx, pattern4_0) { - if pattern5_0 == 8i128 as u32 { - if pattern5_1 == 16i128 as u32 { - let pattern8_0 = C::u8_from_uimm8(ctx, pattern2_2); - // Rule at src/isa/x64/lower.isle line 3575. - let expr0_0 = constructor_put_in_xmm(ctx, pattern2_1); - let expr1_0 = - constructor_x64_pextrb(ctx, pattern4_0, expr0_0, pattern8_0); - let expr2_0 = constructor_output_gpr(ctx, expr1_0); - return Some(expr2_0); - } - } - if pattern5_0 == 16i128 as u32 { - if pattern5_1 == 8i128 as u32 { - let pattern8_0 = C::u8_from_uimm8(ctx, pattern2_2); - // Rule at src/isa/x64/lower.isle line 3578. - let expr0_0 = constructor_put_in_xmm(ctx, pattern2_1); - let expr1_0 = - constructor_x64_pextrw(ctx, pattern4_0, expr0_0, pattern8_0); - let expr2_0 = constructor_output_gpr(ctx, expr1_0); - return Some(expr2_0); - } - } - if pattern5_0 == 32i128 as u32 { - if pattern5_1 == 4i128 as u32 { - let pattern8_0 = C::u8_from_uimm8(ctx, pattern2_2); - // Rule at src/isa/x64/lower.isle line 3581. - let expr0_0 = constructor_put_in_xmm(ctx, pattern2_1); - let expr1_0 = - constructor_x64_pextrd(ctx, pattern4_0, expr0_0, pattern8_0); - let expr2_0 = constructor_output_gpr(ctx, expr1_0); - return Some(expr2_0); - } - } - if pattern5_0 == 64i128 as u32 { - if pattern5_1 == 2i128 as u32 { - let pattern8_0 = C::u8_from_uimm8(ctx, pattern2_2); - // Rule at src/isa/x64/lower.isle line 3584. - let expr0_0 = constructor_put_in_xmm(ctx, pattern2_1); - let expr1_0 = - constructor_x64_pextrd(ctx, pattern4_0, expr0_0, pattern8_0); - let expr2_0 = constructor_output_gpr(ctx, expr1_0); - return Some(expr2_0); - } - } - } - } - } - &InstructionData::MultiAry { - opcode: ref pattern2_0, - args: pattern2_1, - } => { - if let &Opcode::Return = pattern2_0 { - let pattern4_0 = C::value_list_slice(ctx, pattern2_1); - // Rule at src/isa/x64/lower.isle line 1473. - let expr0_0: usize = 0i128 as usize; - let expr1_0 = C::value_slice_len(ctx, pattern4_0); - let expr2_0 = C::range(ctx, expr0_0, expr1_0); - let expr3_0 = constructor_lower_return(ctx, expr2_0, pattern4_0); - return Some(expr3_0); - } - } - &InstructionData::Call { - opcode: ref pattern2_0, - args: pattern2_1, - func_ref: pattern2_2, - } => { - if let &Opcode::Call = pattern2_0 { - let pattern4_0 = C::value_list_slice(ctx, pattern2_1); - let (pattern5_0, pattern5_1, pattern5_2) = C::func_ref_data(ctx, pattern2_2); - // Rule at src/isa/x64/lower.isle line 2850. - let expr0_0 = C::gen_call(ctx, pattern5_0, pattern5_1, pattern5_2, pattern4_0); - return Some(expr0_0); - } - } - &InstructionData::CallIndirect { - opcode: ref pattern2_0, - args: pattern2_1, - sig_ref: pattern2_2, - } => { - if let &Opcode::CallIndirect = pattern2_0 { - let pattern4_0 = C::value_list_slice(ctx, pattern2_1); - if let Some((pattern5_0, pattern5_1)) = C::value_slice_unwrap(ctx, pattern4_0) { - // Rule at src/isa/x64/lower.isle line 2853. - let expr0_0 = C::gen_call_indirect(ctx, pattern2_2, pattern5_0, pattern5_1); - return Some(expr0_0); - } - } - } - &InstructionData::FuncAddr { - opcode: ref pattern2_0, - func_ref: pattern2_1, - } => { - if let &Opcode::FuncAddr = pattern2_0 { - let (pattern4_0, pattern4_1, pattern4_2) = C::func_ref_data(ctx, pattern2_1); - // Rule at src/isa/x64/lower.isle line 2792. - let expr0_0: i64 = 0i128 as i64; - let expr1_0 = constructor_load_ext_name(ctx, pattern4_1, expr0_0); - let expr2_0 = constructor_output_reg(ctx, expr1_0); - return Some(expr2_0); - } - } - &InstructionData::UnaryGlobalValue { - opcode: ref pattern2_0, - global_value: pattern2_1, - } => { - if let &Opcode::SymbolValue = pattern2_0 { - if let Some((pattern4_0, pattern4_1, pattern4_2)) = - C::symbol_value_data(ctx, pattern2_1) - { - // Rule at src/isa/x64/lower.isle line 2797. - let expr0_0 = constructor_load_ext_name(ctx, pattern4_0, pattern4_2); - let expr1_0 = constructor_output_reg(ctx, expr0_0); - return Some(expr1_0); - } - } - } - &InstructionData::UnaryIeee32 { - opcode: ref pattern2_0, - imm: pattern2_1, - } => { - if let &Opcode::F32const = pattern2_0 { - let pattern4_0 = C::u64_from_ieee32(ctx, pattern2_1); - // Rule at src/isa/x64/lower.isle line 27. - let expr0_0: Type = F32; - let expr1_0 = constructor_imm(ctx, expr0_0, pattern4_0); - let expr2_0 = constructor_output_reg(ctx, expr1_0); - return Some(expr2_0); - } - } - &InstructionData::UnaryIeee64 { - opcode: ref pattern2_0, - imm: pattern2_1, - } => { - if let &Opcode::F64const = pattern2_0 { - let pattern4_0 = C::u64_from_ieee64(ctx, pattern2_1); - // Rule at src/isa/x64/lower.isle line 32. - let expr0_0: Type = F64; - let expr1_0 = constructor_imm(ctx, expr0_0, pattern4_0); - let expr2_0 = constructor_output_reg(ctx, expr1_0); - return Some(expr2_0); - } - } - &InstructionData::StackLoad { - opcode: ref pattern2_0, - stack_slot: pattern2_1, - offset: pattern2_2, - } => { - if let &Opcode::StackAddr = pattern2_0 { - // Rule at src/isa/x64/lower.isle line 3436. - let expr0_0 = constructor_stack_addr_impl(ctx, pattern2_1, pattern2_2); - let expr1_0 = constructor_output_gpr(ctx, expr0_0); - return Some(expr1_0); - } - } - &InstructionData::Trap { - opcode: ref pattern2_0, - code: ref pattern2_1, - } => { - match pattern2_0 { - &Opcode::Trap => { - // Rule at src/isa/x64/lower.isle line 1427. - let expr0_0 = constructor_x64_ud2(ctx, pattern2_1); - let expr1_0 = constructor_side_effect(ctx, &expr0_0); - return Some(expr1_0); - } - &Opcode::ResumableTrap => { - // Rule at src/isa/x64/lower.isle line 1467. - let expr0_0 = constructor_x64_ud2(ctx, pattern2_1); - let expr1_0 = constructor_side_effect(ctx, &expr0_0); - return Some(expr1_0); - } - _ => {} - } - } - &InstructionData::Binary { - opcode: ref pattern2_0, - args: ref pattern2_1, - } => { - match pattern2_0 { - &Opcode::Swizzle => { - let (pattern4_0, pattern4_1) = C::unpack_value_array_2(ctx, pattern2_1); - // Rule at src/isa/x64/lower.isle line 3550. - let expr0_0 = constructor_put_in_xmm(ctx, pattern4_1); - let expr1_0: Type = I8X16; - let expr2_0 = C::swizzle_zero_mask(ctx); - let expr3_0 = constructor_x64_xmm_load_const(ctx, expr1_0, expr2_0); - let expr4_0 = C::xmm_to_xmm_mem(ctx, expr3_0); - let expr5_0 = constructor_x64_paddusb(ctx, expr0_0, &expr4_0); - let expr6_0 = constructor_put_in_xmm(ctx, pattern4_0); - let expr7_0 = C::xmm_to_xmm_mem(ctx, expr5_0); - let expr8_0 = constructor_x64_pshufb(ctx, expr6_0, &expr7_0); - let expr9_0 = constructor_output_xmm(ctx, expr8_0); - return Some(expr9_0); - } - &Opcode::Umulhi => { - let (pattern4_0, pattern4_1) = C::unpack_value_array_2(ctx, pattern2_1); - let pattern5_0 = C::value_type(ctx, pattern4_0); - if pattern5_0 == I16 { - // Rule at src/isa/x64/lower.isle line 3461. - let expr0_0: Type = I16; - let expr1_0: bool = false; - let expr2_0 = constructor_put_in_gpr(ctx, pattern4_0); - let expr3_0 = constructor_put_in_gpr_mem(ctx, pattern4_1); - let expr4_0 = constructor_mul_hi(ctx, expr0_0, expr1_0, expr2_0, &expr3_0); - let expr5_0: usize = 1i128 as usize; - let expr6_0 = constructor_value_regs_get_gpr(ctx, expr4_0, expr5_0); - let expr7_0 = constructor_output_gpr(ctx, expr6_0); - return Some(expr7_0); - } - if pattern5_0 == I32 { - // Rule at src/isa/x64/lower.isle line 3466. - let expr0_0: Type = I32; - let expr1_0: bool = false; - let expr2_0 = constructor_put_in_gpr(ctx, pattern4_0); - let expr3_0 = constructor_put_in_gpr_mem(ctx, pattern4_1); - let expr4_0 = constructor_mul_hi(ctx, expr0_0, expr1_0, expr2_0, &expr3_0); - let expr5_0: usize = 1i128 as usize; - let expr6_0 = constructor_value_regs_get_gpr(ctx, expr4_0, expr5_0); - let expr7_0 = constructor_output_gpr(ctx, expr6_0); - return Some(expr7_0); - } - if pattern5_0 == I64 { - // Rule at src/isa/x64/lower.isle line 3471. - let expr0_0: Type = I64; - let expr1_0: bool = false; - let expr2_0 = constructor_put_in_gpr(ctx, pattern4_0); - let expr3_0 = constructor_put_in_gpr_mem(ctx, pattern4_1); - let expr4_0 = constructor_mul_hi(ctx, expr0_0, expr1_0, expr2_0, &expr3_0); - let expr5_0: usize = 1i128 as usize; - let expr6_0 = constructor_value_regs_get_gpr(ctx, expr4_0, expr5_0); - let expr7_0 = constructor_output_gpr(ctx, expr6_0); - return Some(expr7_0); - } - } - &Opcode::Smulhi => { - let (pattern4_0, pattern4_1) = C::unpack_value_array_2(ctx, pattern2_1); - let pattern5_0 = C::value_type(ctx, pattern4_0); - if pattern5_0 == I16 { - // Rule at src/isa/x64/lower.isle line 3478. - let expr0_0: Type = I16; - let expr1_0: bool = true; - let expr2_0 = constructor_put_in_gpr(ctx, pattern4_0); - let expr3_0 = constructor_put_in_gpr_mem(ctx, pattern4_1); - let expr4_0 = constructor_mul_hi(ctx, expr0_0, expr1_0, expr2_0, &expr3_0); - let expr5_0: usize = 1i128 as usize; - let expr6_0 = constructor_value_regs_get_gpr(ctx, expr4_0, expr5_0); - let expr7_0 = constructor_output_gpr(ctx, expr6_0); - return Some(expr7_0); - } - if pattern5_0 == I32 { - // Rule at src/isa/x64/lower.isle line 3483. - let expr0_0: Type = I32; - let expr1_0: bool = true; - let expr2_0 = constructor_put_in_gpr(ctx, pattern4_0); - let expr3_0 = constructor_put_in_gpr_mem(ctx, pattern4_1); - let expr4_0 = constructor_mul_hi(ctx, expr0_0, expr1_0, expr2_0, &expr3_0); - let expr5_0: usize = 1i128 as usize; - let expr6_0 = constructor_value_regs_get_gpr(ctx, expr4_0, expr5_0); - let expr7_0 = constructor_output_gpr(ctx, expr6_0); - return Some(expr7_0); - } - if pattern5_0 == I64 { - // Rule at src/isa/x64/lower.isle line 3488. - let expr0_0: Type = I64; - let expr1_0: bool = true; - let expr2_0 = constructor_put_in_gpr(ctx, pattern4_0); - let expr3_0 = constructor_put_in_gpr_mem(ctx, pattern4_1); - let expr4_0 = constructor_mul_hi(ctx, expr0_0, expr1_0, expr2_0, &expr3_0); - let expr5_0: usize = 1i128 as usize; - let expr6_0 = constructor_value_regs_get_gpr(ctx, expr4_0, expr5_0); - let expr7_0 = constructor_output_gpr(ctx, expr6_0); - return Some(expr7_0); - } - } - &Opcode::SqmulRoundSat => { - let (pattern4_0, pattern4_1) = C::unpack_value_array_2(ctx, pattern2_1); - let pattern5_0 = C::value_type(ctx, pattern4_0); - if pattern5_0 == I16X8 { - // Rule at src/isa/x64/lower.isle line 3724. - let expr0_0 = constructor_put_in_xmm(ctx, pattern4_0); - let expr1_0 = constructor_put_in_xmm(ctx, pattern4_1); - let expr2_0: Type = I16X8; - let expr3_0 = C::sqmul_round_sat_mask(ctx); - let expr4_0 = constructor_x64_xmm_load_const(ctx, expr2_0, expr3_0); - let expr5_0 = C::xmm_to_xmm_mem(ctx, expr1_0); - let expr6_0 = constructor_x64_pmulhrsw(ctx, expr0_0, &expr5_0); - let expr7_0 = C::xmm_to_xmm_mem(ctx, expr6_0); - let expr8_0 = constructor_x64_pcmpeqw(ctx, expr4_0, &expr7_0); - let expr9_0 = C::xmm_to_xmm_mem(ctx, expr8_0); - let expr10_0 = constructor_x64_pxor(ctx, expr6_0, &expr9_0); - let expr11_0 = constructor_output_xmm(ctx, expr10_0); - return Some(expr11_0); - } - } - &Opcode::Udiv => { - let (pattern4_0, pattern4_1) = C::unpack_value_array_2(ctx, pattern2_1); - let pattern5_0 = C::value_type(ctx, pattern4_0); - // Rule at src/isa/x64/lower.isle line 3441. - let expr0_0 = DivOrRemKind::UnsignedDiv; - let expr1_0 = constructor_div_or_rem(ctx, &expr0_0, pattern4_0, pattern4_1); - let expr2_0 = constructor_output_gpr(ctx, expr1_0); - return Some(expr2_0); - } - &Opcode::Sdiv => { - let (pattern4_0, pattern4_1) = C::unpack_value_array_2(ctx, pattern2_1); - let pattern5_0 = C::value_type(ctx, pattern4_0); - // Rule at src/isa/x64/lower.isle line 3446. - let expr0_0 = DivOrRemKind::SignedDiv; - let expr1_0 = constructor_div_or_rem(ctx, &expr0_0, pattern4_0, pattern4_1); - let expr2_0 = constructor_output_gpr(ctx, expr1_0); - return Some(expr2_0); - } - &Opcode::Urem => { - let (pattern4_0, pattern4_1) = C::unpack_value_array_2(ctx, pattern2_1); - let pattern5_0 = C::value_type(ctx, pattern4_0); - // Rule at src/isa/x64/lower.isle line 3451. - let expr0_0 = DivOrRemKind::UnsignedRem; - let expr1_0 = constructor_div_or_rem(ctx, &expr0_0, pattern4_0, pattern4_1); - let expr2_0 = constructor_output_gpr(ctx, expr1_0); - return Some(expr2_0); - } - &Opcode::Srem => { - let (pattern4_0, pattern4_1) = C::unpack_value_array_2(ctx, pattern2_1); - let pattern5_0 = C::value_type(ctx, pattern4_0); - // Rule at src/isa/x64/lower.isle line 3456. - let expr0_0 = DivOrRemKind::SignedRem; - let expr1_0 = constructor_div_or_rem(ctx, &expr0_0, pattern4_0, pattern4_1); - let expr2_0 = constructor_output_gpr(ctx, expr1_0); - return Some(expr2_0); - } - &Opcode::IaddCout => { - let (pattern4_0, pattern4_1) = C::unpack_value_array_2(ctx, pattern2_1); - let pattern5_0 = C::value_type(ctx, pattern4_1); - if let Some(pattern6_0) = C::ty_32_or_64(ctx, pattern5_0) { - // Rule at src/isa/x64/lower.isle line 112. - let expr0_0 = constructor_put_in_gpr(ctx, pattern4_0); - let expr1_0 = constructor_put_in_gpr_mem_imm(ctx, pattern4_1); - let expr2_0 = constructor_x64_add_with_flags_paired( - ctx, pattern6_0, expr0_0, &expr1_0, - ); - let expr3_0 = CC::O; - let expr4_0 = constructor_x64_setcc_paired(ctx, &expr3_0); - let expr5_0 = constructor_with_flags(ctx, &expr2_0, &expr4_0); - let expr6_0: usize = 0i128 as usize; - let expr7_0 = C::value_regs_get(ctx, expr5_0, expr6_0); - let expr8_0 = C::value_reg(ctx, expr7_0); - let expr9_0: usize = 1i128 as usize; - let expr10_0 = C::value_regs_get(ctx, expr5_0, expr9_0); - let expr11_0 = C::value_reg(ctx, expr10_0); - let expr12_0 = C::output_pair(ctx, expr8_0, expr11_0); - return Some(expr12_0); - } - } - &Opcode::Uunarrow => { - let (pattern4_0, pattern4_1) = C::unpack_value_array_2(ctx, pattern2_1); - if let Some(pattern5_0) = C::def_inst(ctx, pattern4_0) { - let pattern6_0 = C::inst_data(ctx, pattern5_0); - if let &InstructionData::Unary { - opcode: ref pattern7_0, - arg: pattern7_1, - } = &pattern6_0 - { - if let &Opcode::FcvtToUintSat = pattern7_0 { - let pattern9_0 = C::value_type(ctx, pattern7_1); - if pattern9_0 == F64X2 { - if let Some(pattern11_0) = C::def_inst(ctx, pattern4_1) { - let pattern12_0 = C::inst_data(ctx, pattern11_0); - if let &InstructionData::UnaryConst { - opcode: ref pattern13_0, - constant_handle: pattern13_1, - } = &pattern12_0 - { - if let &Opcode::Vconst = pattern13_0 { - if let Some(pattern15_0) = - C::u128_from_constant(ctx, pattern13_1) - { - if pattern15_0 == 0i128 as u128 { - // Rule at src/isa/x64/lower.isle line 3747. - let expr0_0 = - constructor_put_in_xmm(ctx, pattern7_1); - let expr1_0 = - C::xmm_to_xmm_mem(ctx, expr0_0); - let expr2_0 = constructor_x64_xorpd( - ctx, expr0_0, &expr1_0, - ); - let expr3_0 = constructor_x64_maxpd( - ctx, expr0_0, expr2_0, - ); - let expr4_0: Type = F64X2; - let expr5_0 = C::uunarrow_umax_mask(ctx); - let expr6_0 = - constructor_x64_xmm_load_const( - ctx, expr4_0, expr5_0, - ); - let expr7_0 = constructor_x64_minpd( - ctx, expr3_0, expr6_0, - ); - let expr8_0 = - C::xmm_to_xmm_mem(ctx, expr7_0); - let expr9_0 = RoundImm::RoundZero; - let expr10_0 = constructor_x64_roundpd( - ctx, &expr8_0, &expr9_0, - ); - let expr11_0: Type = F64X2; - let expr12_0 = C::uunarrow_uint_mask(ctx); - let expr13_0 = - constructor_x64_xmm_load_const( - ctx, expr11_0, expr12_0, - ); - let expr14_0 = - C::xmm_to_xmm_mem(ctx, expr13_0); - let expr15_0 = constructor_x64_addpd( - ctx, expr10_0, &expr14_0, - ); - let expr16_0 = - C::xmm_to_xmm_mem(ctx, expr2_0); - let expr17_0: u8 = 136i128 as u8; - let expr18_0 = constructor_x64_shufps( - ctx, expr15_0, &expr16_0, expr17_0, - ); - let expr19_0 = - constructor_output_xmm(ctx, expr18_0); - return Some(expr19_0); - } - } - } - } - } - } - } - } - } - } - &Opcode::Iconcat => { - let (pattern4_0, pattern4_1) = C::unpack_value_array_2(ctx, pattern2_1); - let pattern5_0 = C::value_type(ctx, pattern4_0); - if pattern5_0 == I64 { - // Rule at src/isa/x64/lower.isle line 3700. - let expr0_0 = C::put_in_reg(ctx, pattern4_0); - let expr1_0 = C::put_in_reg(ctx, pattern4_1); - let expr2_0 = C::value_regs(ctx, expr0_0, expr1_0); - let expr3_0 = C::output(ctx, expr2_0); - return Some(expr3_0); - } - } - _ => {} - } - } - &InstructionData::Shuffle { - opcode: ref pattern2_0, - args: ref pattern2_1, - imm: pattern2_2, - } => { - if let &Opcode::Shuffle = pattern2_0 { - let (pattern4_0, pattern4_1) = C::unpack_value_array_2(ctx, pattern2_1); - if let Some(pattern5_0) = C::vec_mask_from_immediate(ctx, pattern2_2) { - // Rule at src/isa/x64/lower.isle line 3537. - let expr0_0 = constructor_put_in_xmm(ctx, pattern4_0); - let expr1_0: Type = I8X16; - let expr2_0 = C::shuffle_0_15_mask(ctx, &pattern5_0); - let expr3_0 = constructor_x64_xmm_load_const(ctx, expr1_0, expr2_0); - let expr4_0 = C::xmm_to_xmm_mem(ctx, expr3_0); - let expr5_0 = constructor_x64_pshufb(ctx, expr0_0, &expr4_0); - let expr6_0 = constructor_put_in_xmm(ctx, pattern4_1); - let expr7_0: Type = I8X16; - let expr8_0 = C::shuffle_16_31_mask(ctx, &pattern5_0); - let expr9_0 = constructor_x64_xmm_load_const(ctx, expr7_0, expr8_0); - let expr10_0 = C::xmm_to_xmm_mem(ctx, expr9_0); - let expr11_0 = constructor_x64_pshufb(ctx, expr6_0, &expr10_0); - let expr12_0 = C::xmm_to_xmm_mem(ctx, expr11_0); - let expr13_0 = constructor_x64_por(ctx, expr5_0, &expr12_0); - let expr14_0 = constructor_output_xmm(ctx, expr13_0); - return Some(expr14_0); - } - } - } - &InstructionData::StoreNoOffset { - opcode: ref pattern2_0, - args: ref pattern2_1, - flags: pattern2_2, - } => { - if let &Opcode::AtomicStore = pattern2_0 { - let (pattern4_0, pattern4_1) = C::unpack_value_array_2(ctx, pattern2_1); - let pattern5_0 = C::value_type(ctx, pattern4_0); - if let Some(pattern6_0) = C::fits_in_64(ctx, pattern5_0) { - if let Some(pattern7_0) = C::ty_int(ctx, pattern5_0) { - // Rule at src/isa/x64/lower.isle line 2819. - let expr0_0 = C::zero_offset(ctx); - let expr1_0 = constructor_to_amode(ctx, pattern2_2, pattern4_1, expr0_0); - let expr2_0 = C::amode_to_synthetic_amode(ctx, &expr1_0); - let expr3_0 = constructor_put_in_gpr(ctx, pattern4_0); - let expr4_0 = constructor_x64_movrm(ctx, pattern6_0, &expr2_0, expr3_0); - let expr5_0 = constructor_x64_mfence(ctx); - let expr6_0 = constructor_side_effect_concat(ctx, &expr4_0, &expr5_0); - let expr7_0 = constructor_side_effect(ctx, &expr6_0); - return Some(expr7_0); - } - } - } - } - &InstructionData::Store { - opcode: ref pattern2_0, - args: ref pattern2_1, - flags: pattern2_2, - offset: pattern2_3, - } => { - match pattern2_0 { - &Opcode::Store => { - let (pattern4_0, pattern4_1) = C::unpack_value_array_2(ctx, pattern2_1); - let pattern5_0 = C::value_type(ctx, pattern4_0); - if pattern5_0 == I128 { - // Rule at src/isa/x64/lower.isle line 2643. - let expr0_0 = C::put_in_regs(ctx, pattern4_0); - let expr1_0: usize = 0i128 as usize; - let expr2_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr1_0); - let expr3_0: usize = 1i128 as usize; - let expr4_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr3_0); - let expr5_0 = constructor_to_amode(ctx, pattern2_2, pattern4_1, pattern2_3); - let expr6_0: u32 = 8i128 as u32; - let expr7_0 = C::amode_offset(ctx, &expr5_0, expr6_0); - let expr8_0: Type = I64; - let expr9_0 = C::amode_to_synthetic_amode(ctx, &expr5_0); - let expr10_0 = constructor_x64_movrm(ctx, expr8_0, &expr9_0, expr2_0); - let expr11_0: Type = I64; - let expr12_0 = C::amode_to_synthetic_amode(ctx, &expr7_0); - let expr13_0 = constructor_x64_movrm(ctx, expr11_0, &expr12_0, expr4_0); - let expr14_0 = constructor_side_effect_concat(ctx, &expr10_0, &expr13_0); - let expr15_0 = constructor_side_effect(ctx, &expr14_0); - return Some(expr15_0); - } - } - &Opcode::Istore8 => { - let (pattern4_0, pattern4_1) = C::unpack_value_array_2(ctx, pattern2_1); - // Rule at src/isa/x64/lower.isle line 2592. - let expr0_0: Type = I8; - let expr1_0 = constructor_to_amode(ctx, pattern2_2, pattern4_1, pattern2_3); - let expr2_0 = C::amode_to_synthetic_amode(ctx, &expr1_0); - let expr3_0 = constructor_put_in_gpr(ctx, pattern4_0); - let expr4_0 = constructor_x64_movrm(ctx, expr0_0, &expr2_0, expr3_0); - let expr5_0 = constructor_side_effect(ctx, &expr4_0); - return Some(expr5_0); - } - &Opcode::Istore16 => { - let (pattern4_0, pattern4_1) = C::unpack_value_array_2(ctx, pattern2_1); - // Rule at src/isa/x64/lower.isle line 2595. - let expr0_0: Type = I16; - let expr1_0 = constructor_to_amode(ctx, pattern2_2, pattern4_1, pattern2_3); - let expr2_0 = C::amode_to_synthetic_amode(ctx, &expr1_0); - let expr3_0 = constructor_put_in_gpr(ctx, pattern4_0); - let expr4_0 = constructor_x64_movrm(ctx, expr0_0, &expr2_0, expr3_0); - let expr5_0 = constructor_side_effect(ctx, &expr4_0); - return Some(expr5_0); - } - &Opcode::Istore32 => { - let (pattern4_0, pattern4_1) = C::unpack_value_array_2(ctx, pattern2_1); - // Rule at src/isa/x64/lower.isle line 2598. - let expr0_0: Type = I32; - let expr1_0 = constructor_to_amode(ctx, pattern2_2, pattern4_1, pattern2_3); - let expr2_0 = C::amode_to_synthetic_amode(ctx, &expr1_0); - let expr3_0 = constructor_put_in_gpr(ctx, pattern4_0); - let expr4_0 = constructor_x64_movrm(ctx, expr0_0, &expr2_0, expr3_0); - let expr5_0 = constructor_side_effect(ctx, &expr4_0); - return Some(expr5_0); - } - _ => {} - } - } - &InstructionData::TernaryImm8 { - opcode: ref pattern2_0, - args: ref pattern2_1, - imm: pattern2_2, - } => { - if let &Opcode::Insertlane = pattern2_0 { - let (pattern4_0, pattern4_1) = C::unpack_value_array_2(ctx, pattern2_1); - let pattern5_0 = C::value_type(ctx, pattern4_0); - let pattern6_0 = C::u8_from_uimm8(ctx, pattern2_2); - // Rule at src/isa/x64/lower.isle line 1291. - let expr0_0 = constructor_put_in_xmm(ctx, pattern4_0); - let expr1_0 = C::put_in_reg_mem(ctx, pattern4_1); - let expr2_0 = - constructor_vec_insert_lane(ctx, pattern5_0, expr0_0, &expr1_0, pattern6_0); - let expr3_0 = constructor_output_xmm(ctx, expr2_0); - return Some(expr3_0); - } - } - &InstructionData::FloatCompare { - opcode: ref pattern2_0, - args: ref pattern2_1, - cond: ref pattern2_2, - } => { - if let &Opcode::Fcmp = pattern2_0 { - let (pattern4_0, pattern4_1) = C::unpack_value_array_2(ctx, pattern2_1); - let pattern5_0 = C::value_type(ctx, pattern4_0); - if let Some(pattern6_0) = C::ty_vec128(ctx, pattern5_0) { - match pattern2_2 { - &FloatCC::Equal => { - // Rule at src/isa/x64/lower.isle line 1613. - let expr0_0 = constructor_put_in_xmm(ctx, pattern4_0); - let expr1_0 = C::put_in_xmm_mem(ctx, pattern4_1); - let expr2_0 = FcmpImm::Equal; - let expr3_0 = - constructor_x64_cmpp(ctx, pattern6_0, expr0_0, &expr1_0, &expr2_0); - let expr4_0 = constructor_output_xmm(ctx, expr3_0); - return Some(expr4_0); - } - &FloatCC::GreaterThan => { - // Rule at src/isa/x64/lower.isle line 1633. - let expr0_0 = constructor_put_in_xmm(ctx, pattern4_1); - let expr1_0 = C::put_in_xmm_mem(ctx, pattern4_0); - let expr2_0 = FcmpImm::LessThan; - let expr3_0 = - constructor_x64_cmpp(ctx, pattern6_0, expr0_0, &expr1_0, &expr2_0); - let expr4_0 = constructor_output_xmm(ctx, expr3_0); - return Some(expr4_0); - } - &FloatCC::GreaterThanOrEqual => { - // Rule at src/isa/x64/lower.isle line 1635. - let expr0_0 = constructor_put_in_xmm(ctx, pattern4_1); - let expr1_0 = C::put_in_xmm_mem(ctx, pattern4_0); - let expr2_0 = FcmpImm::LessThanOrEqual; - let expr3_0 = - constructor_x64_cmpp(ctx, pattern6_0, expr0_0, &expr1_0, &expr2_0); - let expr4_0 = constructor_output_xmm(ctx, expr3_0); - return Some(expr4_0); - } - &FloatCC::LessThan => { - // Rule at src/isa/x64/lower.isle line 1617. - let expr0_0 = constructor_put_in_xmm(ctx, pattern4_0); - let expr1_0 = C::put_in_xmm_mem(ctx, pattern4_1); - let expr2_0 = FcmpImm::LessThan; - let expr3_0 = - constructor_x64_cmpp(ctx, pattern6_0, expr0_0, &expr1_0, &expr2_0); - let expr4_0 = constructor_output_xmm(ctx, expr3_0); - return Some(expr4_0); - } - &FloatCC::LessThanOrEqual => { - // Rule at src/isa/x64/lower.isle line 1619. - let expr0_0 = constructor_put_in_xmm(ctx, pattern4_0); - let expr1_0 = C::put_in_xmm_mem(ctx, pattern4_1); - let expr2_0 = FcmpImm::LessThanOrEqual; - let expr3_0 = - constructor_x64_cmpp(ctx, pattern6_0, expr0_0, &expr1_0, &expr2_0); - let expr4_0 = constructor_output_xmm(ctx, expr3_0); - return Some(expr4_0); - } - &FloatCC::NotEqual => { - // Rule at src/isa/x64/lower.isle line 1615. - let expr0_0 = constructor_put_in_xmm(ctx, pattern4_0); - let expr1_0 = C::put_in_xmm_mem(ctx, pattern4_1); - let expr2_0 = FcmpImm::NotEqual; - let expr3_0 = - constructor_x64_cmpp(ctx, pattern6_0, expr0_0, &expr1_0, &expr2_0); - let expr4_0 = constructor_output_xmm(ctx, expr3_0); - return Some(expr4_0); - } - &FloatCC::Ordered => { - // Rule at src/isa/x64/lower.isle line 1621. - let expr0_0 = constructor_put_in_xmm(ctx, pattern4_0); - let expr1_0 = C::put_in_xmm_mem(ctx, pattern4_1); - let expr2_0 = FcmpImm::Ordered; - let expr3_0 = - constructor_x64_cmpp(ctx, pattern6_0, expr0_0, &expr1_0, &expr2_0); - let expr4_0 = constructor_output_xmm(ctx, expr3_0); - return Some(expr4_0); - } - &FloatCC::Unordered => { - // Rule at src/isa/x64/lower.isle line 1623. - let expr0_0 = constructor_put_in_xmm(ctx, pattern4_0); - let expr1_0 = C::put_in_xmm_mem(ctx, pattern4_1); - let expr2_0 = FcmpImm::Unordered; - let expr3_0 = - constructor_x64_cmpp(ctx, pattern6_0, expr0_0, &expr1_0, &expr2_0); - let expr4_0 = constructor_output_xmm(ctx, expr3_0); - return Some(expr4_0); - } - &FloatCC::UnorderedOrGreaterThan => { - // Rule at src/isa/x64/lower.isle line 1625. - let expr0_0 = constructor_put_in_xmm(ctx, pattern4_0); - let expr1_0 = C::put_in_xmm_mem(ctx, pattern4_1); - let expr2_0 = FcmpImm::UnorderedOrGreaterThan; - let expr3_0 = - constructor_x64_cmpp(ctx, pattern6_0, expr0_0, &expr1_0, &expr2_0); - let expr4_0 = constructor_output_xmm(ctx, expr3_0); - return Some(expr4_0); - } - &FloatCC::UnorderedOrGreaterThanOrEqual => { - // Rule at src/isa/x64/lower.isle line 1627. - let expr0_0 = constructor_put_in_xmm(ctx, pattern4_0); - let expr1_0 = C::put_in_xmm_mem(ctx, pattern4_1); - let expr2_0 = FcmpImm::UnorderedOrGreaterThanOrEqual; - let expr3_0 = - constructor_x64_cmpp(ctx, pattern6_0, expr0_0, &expr1_0, &expr2_0); - let expr4_0 = constructor_output_xmm(ctx, expr3_0); - return Some(expr4_0); - } - &FloatCC::UnorderedOrLessThan => { - // Rule at src/isa/x64/lower.isle line 1637. - let expr0_0 = constructor_put_in_xmm(ctx, pattern4_1); - let expr1_0 = C::put_in_xmm_mem(ctx, pattern4_0); - let expr2_0 = FcmpImm::UnorderedOrGreaterThan; - let expr3_0 = - constructor_x64_cmpp(ctx, pattern6_0, expr0_0, &expr1_0, &expr2_0); - let expr4_0 = constructor_output_xmm(ctx, expr3_0); - return Some(expr4_0); - } - &FloatCC::UnorderedOrLessThanOrEqual => { - // Rule at src/isa/x64/lower.isle line 1639. - let expr0_0 = constructor_put_in_xmm(ctx, pattern4_1); - let expr1_0 = C::put_in_xmm_mem(ctx, pattern4_0); - let expr2_0 = FcmpImm::UnorderedOrGreaterThanOrEqual; - let expr3_0 = - constructor_x64_cmpp(ctx, pattern6_0, expr0_0, &expr1_0, &expr2_0); - let expr4_0 = constructor_output_xmm(ctx, expr3_0); - return Some(expr4_0); - } - _ => {} - } - } - } - } - &InstructionData::IntCompare { - opcode: ref pattern2_0, - args: ref pattern2_1, - cond: ref pattern2_2, - } => { - if let &Opcode::Icmp = pattern2_0 { - let (pattern4_0, pattern4_1) = C::unpack_value_array_2(ctx, pattern2_1); - let pattern5_0 = C::value_type(ctx, pattern4_0); - if let Some(pattern6_0) = C::ty_vec128(ctx, pattern5_0) { - match pattern2_2 { - &IntCC::Equal => { - // Rule at src/isa/x64/lower.isle line 1521. - let expr0_0 = constructor_put_in_xmm(ctx, pattern4_0); - let expr1_0 = C::put_in_xmm_mem(ctx, pattern4_1); - let expr2_0 = - constructor_x64_pcmpeq(ctx, pattern6_0, expr0_0, &expr1_0); - let expr3_0 = constructor_output_xmm(ctx, expr2_0); - return Some(expr3_0); - } - &IntCC::NotEqual => { - // Rule at src/isa/x64/lower.isle line 1526. - let expr0_0 = constructor_put_in_xmm(ctx, pattern4_0); - let expr1_0 = C::put_in_xmm_mem(ctx, pattern4_1); - let expr2_0 = - constructor_x64_pcmpeq(ctx, pattern6_0, expr0_0, &expr1_0); - let expr3_0 = constructor_vector_all_ones(ctx); - let expr4_0 = C::xmm_to_xmm_mem(ctx, expr3_0); - let expr5_0 = constructor_x64_pxor(ctx, expr2_0, &expr4_0); - let expr6_0 = constructor_output_xmm(ctx, expr5_0); - return Some(expr6_0); - } - &IntCC::SignedGreaterThan => { - // Rule at src/isa/x64/lower.isle line 1533. - let expr0_0 = constructor_put_in_xmm(ctx, pattern4_0); - let expr1_0 = C::put_in_xmm_mem(ctx, pattern4_1); - let expr2_0 = - constructor_x64_pcmpgt(ctx, pattern6_0, expr0_0, &expr1_0); - let expr3_0 = constructor_output_xmm(ctx, expr2_0); - return Some(expr3_0); - } - &IntCC::SignedGreaterThanOrEqual => { - // Rule at src/isa/x64/lower.isle line 1558. - let expr0_0 = constructor_put_in_xmm(ctx, pattern4_0); - let expr1_0 = C::put_in_xmm_mem(ctx, pattern4_1); - let expr2_0 = constructor_x64_pmaxs(ctx, pattern6_0, expr0_0, &expr1_0); - let expr3_0 = constructor_put_in_xmm(ctx, pattern4_0); - let expr4_0 = C::xmm_to_xmm_mem(ctx, expr2_0); - let expr5_0 = - constructor_x64_pcmpeq(ctx, pattern6_0, expr3_0, &expr4_0); - let expr6_0 = constructor_output_xmm(ctx, expr5_0); - return Some(expr6_0); - } - &IntCC::SignedLessThan => { - // Rule at src/isa/x64/lower.isle line 1535. - let expr0_0 = constructor_put_in_xmm(ctx, pattern4_1); - let expr1_0 = C::put_in_xmm_mem(ctx, pattern4_0); - let expr2_0 = - constructor_x64_pcmpgt(ctx, pattern6_0, expr0_0, &expr1_0); - let expr3_0 = constructor_output_xmm(ctx, expr2_0); - return Some(expr3_0); - } - &IntCC::SignedLessThanOrEqual => { - // Rule at src/isa/x64/lower.isle line 1561. - let expr0_0 = constructor_put_in_xmm(ctx, pattern4_0); - let expr1_0 = C::put_in_xmm_mem(ctx, pattern4_1); - let expr2_0 = constructor_x64_pmins(ctx, pattern6_0, expr0_0, &expr1_0); - let expr3_0 = constructor_put_in_xmm(ctx, pattern4_0); - let expr4_0 = C::xmm_to_xmm_mem(ctx, expr2_0); - let expr5_0 = - constructor_x64_pcmpeq(ctx, pattern6_0, expr3_0, &expr4_0); - let expr6_0 = constructor_output_xmm(ctx, expr5_0); - return Some(expr6_0); - } - &IntCC::UnsignedGreaterThan => { - // Rule at src/isa/x64/lower.isle line 1537. - let expr0_0 = constructor_put_in_xmm(ctx, pattern4_0); - let expr1_0 = constructor_put_in_xmm(ctx, pattern4_1); - let expr2_0 = C::xmm_to_xmm_mem(ctx, expr1_0); - let expr3_0 = constructor_x64_pmaxu(ctx, pattern6_0, expr0_0, &expr2_0); - let expr4_0 = C::xmm_to_xmm_mem(ctx, expr1_0); - let expr5_0 = - constructor_x64_pcmpeq(ctx, pattern6_0, expr3_0, &expr4_0); - let expr6_0 = constructor_vector_all_ones(ctx); - let expr7_0 = C::xmm_to_xmm_mem(ctx, expr6_0); - let expr8_0 = constructor_x64_pxor(ctx, expr5_0, &expr7_0); - let expr9_0 = constructor_output_xmm(ctx, expr8_0); - return Some(expr9_0); - } - &IntCC::UnsignedGreaterThanOrEqual => { - // Rule at src/isa/x64/lower.isle line 1564. - let expr0_0 = constructor_put_in_xmm(ctx, pattern4_0); - let expr1_0 = C::put_in_xmm_mem(ctx, pattern4_1); - let expr2_0 = constructor_x64_pmaxu(ctx, pattern6_0, expr0_0, &expr1_0); - let expr3_0 = constructor_put_in_xmm(ctx, pattern4_0); - let expr4_0 = C::xmm_to_xmm_mem(ctx, expr2_0); - let expr5_0 = - constructor_x64_pcmpeq(ctx, pattern6_0, expr3_0, &expr4_0); - let expr6_0 = constructor_output_xmm(ctx, expr5_0); - return Some(expr6_0); - } - &IntCC::UnsignedLessThan => { - // Rule at src/isa/x64/lower.isle line 1547. - let expr0_0 = constructor_put_in_xmm(ctx, pattern4_0); - let expr1_0 = constructor_put_in_xmm(ctx, pattern4_1); - let expr2_0 = C::xmm_to_xmm_mem(ctx, expr1_0); - let expr3_0 = constructor_x64_pminu(ctx, pattern6_0, expr0_0, &expr2_0); - let expr4_0 = C::xmm_to_xmm_mem(ctx, expr1_0); - let expr5_0 = - constructor_x64_pcmpeq(ctx, pattern6_0, expr3_0, &expr4_0); - let expr6_0 = constructor_vector_all_ones(ctx); - let expr7_0 = C::xmm_to_xmm_mem(ctx, expr6_0); - let expr8_0 = constructor_x64_pxor(ctx, expr5_0, &expr7_0); - let expr9_0 = constructor_output_xmm(ctx, expr8_0); - return Some(expr9_0); - } - &IntCC::UnsignedLessThanOrEqual => { - // Rule at src/isa/x64/lower.isle line 1567. - let expr0_0 = constructor_put_in_xmm(ctx, pattern4_0); - let expr1_0 = C::put_in_xmm_mem(ctx, pattern4_1); - let expr2_0 = constructor_x64_pminu(ctx, pattern6_0, expr0_0, &expr1_0); - let expr3_0 = constructor_put_in_xmm(ctx, pattern4_0); - let expr4_0 = C::xmm_to_xmm_mem(ctx, expr2_0); - let expr5_0 = - constructor_x64_pcmpeq(ctx, pattern6_0, expr3_0, &expr4_0); - let expr6_0 = constructor_output_xmm(ctx, expr5_0); - return Some(expr6_0); - } - _ => {} - } - } - } - } - &InstructionData::Ternary { - opcode: ref pattern2_0, - args: ref pattern2_1, - } => { - if let &Opcode::SelectSpectreGuard = pattern2_0 { - let (pattern4_0, pattern4_1, pattern4_2) = C::unpack_value_array_3(ctx, pattern2_1); - if let Some(pattern5_0) = C::def_inst(ctx, pattern4_0) { - let pattern6_0 = C::inst_data(ctx, pattern5_0); - if let &InstructionData::IntCompare { - opcode: ref pattern7_0, - args: ref pattern7_1, - cond: ref pattern7_2, - } = &pattern6_0 - { - if let &Opcode::Icmp = pattern7_0 { - let (pattern9_0, pattern9_1) = C::unpack_value_array_2(ctx, pattern7_1); - // Rule at src/isa/x64/lower.isle line 2946. - let expr0_0 = - constructor_emit_cmp(ctx, pattern7_2, pattern9_0, pattern9_1); - let expr1_0 = - constructor_select_icmp(ctx, &expr0_0, pattern4_1, pattern4_2); - let expr2_0 = C::output(ctx, expr1_0); - return Some(expr2_0); - } - } - } - } - } - _ => {} - } - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::first_result(ctx, pattern0_0) { - let pattern2_0 = C::value_type(ctx, pattern1_0); - if pattern2_0 == I64 { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Unary { - opcode: ref pattern5_0, - arg: pattern5_1, - } = &pattern4_0 - { - if let &Opcode::Uextend = pattern5_0 { - let pattern7_0 = C::value_type(ctx, pattern5_1); - if let Some(pattern8_0) = C::fits_in_32(ctx, pattern7_0) { - // Rule at src/isa/x64/lower.isle line 2126. - let expr0_0: Type = I64; - let expr1_0 = ExtendKind::Zero; - let expr2_0 = constructor_extend_to_gpr(ctx, pattern5_1, expr0_0, &expr1_0); - let expr3_0 = constructor_output_gpr(ctx, expr2_0); - return Some(expr3_0); - } - } - } - } - if pattern2_0 == I128 { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Unary { - opcode: ref pattern5_0, - arg: pattern5_1, - } = &pattern4_0 - { - if let &Opcode::Uextend = pattern5_0 { - let pattern7_0 = C::value_type(ctx, pattern5_1); - if pattern7_0 == I64 { - // Rule at src/isa/x64/lower.isle line 2118. - let expr0_0 = C::put_in_reg(ctx, pattern5_1); - let expr1_0: Type = I64; - let expr2_0: u64 = 0i128 as u64; - let expr3_0 = constructor_imm(ctx, expr1_0, expr2_0); - let expr4_0 = C::value_regs(ctx, expr0_0, expr3_0); - let expr5_0 = C::output(ctx, expr4_0); - return Some(expr5_0); - } - } - } - } - if let Some((pattern3_0, pattern3_1)) = C::multi_lane(ctx, pattern2_0) { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Unary { - opcode: ref pattern5_0, - arg: pattern5_1, - } = &pattern4_0 - { - if let &Opcode::Bnot = pattern5_0 { - // Rule at src/isa/x64/lower.isle line 1243. - let expr0_0 = constructor_put_in_xmm(ctx, pattern5_1); - let expr1_0 = constructor_vector_all_ones(ctx); - let expr2_0 = C::xmm_to_xmm_mem(ctx, expr1_0); - let expr3_0 = constructor_sse_xor(ctx, pattern2_0, expr0_0, &expr2_0); - let expr4_0 = constructor_output_xmm(ctx, expr3_0); - return Some(expr4_0); - } - } - } - if let Some(pattern3_0) = C::fits_in_64(ctx, pattern2_0) { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - match &pattern4_0 { - &InstructionData::Unary { - opcode: ref pattern5_0, - arg: pattern5_1, - } => { - if let &Opcode::Ineg = pattern5_0 { - // Rule at src/isa/x64/lower.isle line 772. - let expr0_0 = constructor_put_in_gpr(ctx, pattern5_1); - let expr1_0 = constructor_x64_neg(ctx, pattern3_0, expr0_0); - let expr2_0 = constructor_output_gpr(ctx, expr1_0); - return Some(expr2_0); - } - } - &InstructionData::Binary { - opcode: ref pattern5_0, - args: ref pattern5_1, - } => { - match pattern5_0 { - &Opcode::Smin => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 1375. - let expr0_0 = CC::L; - let expr1_0 = constructor_cmp_and_choose( - ctx, pattern3_0, &expr0_0, pattern7_0, pattern7_1, - ); - let expr2_0 = C::output(ctx, expr1_0); - return Some(expr2_0); - } - &Opcode::Umin => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 1369. - let expr0_0 = CC::B; - let expr1_0 = constructor_cmp_and_choose( - ctx, pattern3_0, &expr0_0, pattern7_0, pattern7_1, - ); - let expr2_0 = C::output(ctx, expr1_0); - return Some(expr2_0); - } - &Opcode::Smax => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 1378. - let expr0_0 = CC::NL; - let expr1_0 = constructor_cmp_and_choose( - ctx, pattern3_0, &expr0_0, pattern7_0, pattern7_1, - ); - let expr2_0 = C::output(ctx, expr1_0); - return Some(expr2_0); - } - &Opcode::Umax => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 1372. - let expr0_0 = CC::NB; - let expr1_0 = constructor_cmp_and_choose( - ctx, pattern3_0, &expr0_0, pattern7_0, pattern7_1, - ); - let expr2_0 = C::output(ctx, expr1_0); - return Some(expr2_0); - } - &Opcode::Iadd => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - if let Some(pattern8_0) = C::sinkable_load(ctx, pattern7_0) { - // Rule at src/isa/x64/lower.isle line 67. - let expr0_0 = constructor_put_in_gpr(ctx, pattern7_1); - let expr1_0 = - constructor_sink_load_to_gpr_mem_imm(ctx, &pattern8_0); - let expr2_0 = - constructor_x64_add(ctx, pattern3_0, expr0_0, &expr1_0); - let expr3_0 = constructor_output_gpr(ctx, expr2_0); - return Some(expr3_0); - } - } - &Opcode::Isub => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - if let Some(pattern8_0) = C::sinkable_load(ctx, pattern7_1) { - // Rule at src/isa/x64/lower.isle line 153. - let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0); - let expr1_0 = - constructor_sink_load_to_gpr_mem_imm(ctx, &pattern8_0); - let expr2_0 = - constructor_x64_sub(ctx, pattern3_0, expr0_0, &expr1_0); - let expr3_0 = constructor_output_gpr(ctx, expr2_0); - return Some(expr3_0); - } - } - &Opcode::Imul => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - if let Some(pattern8_0) = C::sinkable_load(ctx, pattern7_0) { - // Rule at src/isa/x64/lower.isle line 834. - let expr0_0 = constructor_put_in_gpr(ctx, pattern7_1); - let expr1_0 = - constructor_sink_load_to_gpr_mem_imm(ctx, &pattern8_0); - let expr2_0 = - constructor_x64_mul(ctx, pattern3_0, expr0_0, &expr1_0); - let expr3_0 = constructor_output_gpr(ctx, expr2_0); - return Some(expr3_0); - } - } - &Opcode::Rotl => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 731. - let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0); - let expr1_0 = - constructor_put_masked_in_imm8_gpr(ctx, pattern7_1, pattern3_0); - let expr2_0 = constructor_x64_rotl(ctx, pattern3_0, expr0_0, &expr1_0); - let expr3_0 = constructor_output_gpr(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::Rotr => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 752. - let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0); - let expr1_0 = - constructor_put_masked_in_imm8_gpr(ctx, pattern7_1, pattern3_0); - let expr2_0 = constructor_x64_rotr(ctx, pattern3_0, expr0_0, &expr1_0); - let expr3_0 = constructor_output_gpr(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::Ishl => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 392. - let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0); - let expr1_0 = - constructor_put_masked_in_imm8_gpr(ctx, pattern7_1, pattern3_0); - let expr2_0 = constructor_x64_shl(ctx, pattern3_0, expr0_0, &expr1_0); - let expr3_0 = constructor_output_gpr(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::Ushr => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 503. - let expr0_0 = ExtendKind::Zero; - let expr1_0 = - constructor_extend_to_gpr(ctx, pattern7_0, pattern3_0, &expr0_0); - let expr2_0 = - constructor_put_masked_in_imm8_gpr(ctx, pattern7_1, pattern3_0); - let expr3_0 = constructor_x64_shr(ctx, pattern3_0, expr1_0, &expr2_0); - let expr4_0 = constructor_output_gpr(ctx, expr3_0); - return Some(expr4_0); - } - &Opcode::Sshr => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 613. - let expr0_0 = ExtendKind::Sign; - let expr1_0 = - constructor_extend_to_gpr(ctx, pattern7_0, pattern3_0, &expr0_0); - let expr2_0 = - constructor_put_masked_in_imm8_gpr(ctx, pattern7_1, pattern3_0); - let expr3_0 = constructor_x64_sar(ctx, pattern3_0, expr1_0, &expr2_0); - let expr4_0 = constructor_output_gpr(ctx, expr3_0); - return Some(expr4_0); - } - _ => {} - } - } - _ => {} - } - } - if let Some(pattern3_0) = C::ty_32_or_64(ctx, pattern2_0) { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Unary { - opcode: ref pattern5_0, - arg: pattern5_1, - } = &pattern4_0 - { - if let &Opcode::Popcnt = pattern5_0 { - // Rule at src/isa/x64/lower.isle line 1867. - let expr0_0 = constructor_put_in_gpr(ctx, pattern5_1); - let expr1_0 = constructor_do_popcnt(ctx, pattern3_0, expr0_0); - let expr2_0 = constructor_output_gpr(ctx, expr1_0); - return Some(expr2_0); - } - } - } - if let Some(pattern3_0) = C::ty_int_ref_64(ctx, pattern2_0) { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Load { - opcode: ref pattern5_0, - arg: pattern5_1, - flags: pattern5_2, - offset: pattern5_3, - } = &pattern4_0 - { - if let &Opcode::Load = pattern5_0 { - // Rule at src/isa/x64/lower.isle line 2524. - let expr0_0 = constructor_to_amode(ctx, pattern5_2, pattern5_1, pattern5_3); - let expr1_0 = constructor_x64_mov(ctx, &expr0_0); - let expr2_0 = constructor_output_reg(ctx, expr1_0); - return Some(expr2_0); - } - } - } - let pattern3_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Ternary { - opcode: ref pattern4_0, - args: ref pattern4_1, - } = &pattern3_0 - { - match pattern4_0 { - &Opcode::Select => { - let (pattern6_0, pattern6_1, pattern6_2) = - C::unpack_value_array_3(ctx, pattern4_1); - let pattern7_0 = C::value_type(ctx, pattern6_0); - if let Some(pattern8_0) = C::fits_in_64(ctx, pattern7_0) { - // Rule at src/isa/x64/lower.isle line 1745. - let expr0_0 = C::raw_operand_size_of_type(ctx, pattern8_0); - let expr1_0 = constructor_put_in_gpr(ctx, pattern6_0); - let expr2_0 = C::gpr_to_gpr_mem_imm(ctx, expr1_0); - let expr3_0 = constructor_x64_test(ctx, &expr0_0, &expr2_0, expr1_0); - let expr4_0 = CC::NZ; - let expr5_0 = constructor_cmove_from_values( - ctx, pattern2_0, &expr4_0, pattern6_1, pattern6_2, - ); - let expr6_0 = constructor_with_flags(ctx, &expr3_0, &expr5_0); - let expr7_0 = C::output(ctx, expr6_0); - return Some(expr7_0); - } - } - &Opcode::SelectSpectreGuard => { - let (pattern6_0, pattern6_1, pattern6_2) = - C::unpack_value_array_3(ctx, pattern4_1); - let pattern7_0 = C::value_type(ctx, pattern6_0); - if let Some(pattern8_0) = C::fits_in_64(ctx, pattern7_0) { - // Rule at src/isa/x64/lower.isle line 2949. - let expr0_0 = C::raw_operand_size_of_type(ctx, pattern8_0); - let expr1_0 = constructor_put_in_gpr(ctx, pattern6_0); - let expr2_0 = C::gpr_to_gpr_mem_imm(ctx, expr1_0); - let expr3_0 = constructor_x64_test(ctx, &expr0_0, &expr2_0, expr1_0); - let expr4_0 = CC::NZ; - let expr5_0 = constructor_cmove_from_values( - ctx, pattern2_0, &expr4_0, pattern6_1, pattern6_2, - ); - let expr6_0 = constructor_with_flags(ctx, &expr3_0, &expr5_0); - let expr7_0 = C::output(ctx, expr6_0); - return Some(expr7_0); - } - } - _ => {} - } - } - } - let pattern1_0 = C::inst_data(ctx, pattern0_0); - match &pattern1_0 { - &InstructionData::Store { - opcode: ref pattern2_0, - args: ref pattern2_1, - flags: pattern2_2, - offset: pattern2_3, - } => { - if let &Opcode::Store = pattern2_0 { - let (pattern4_0, pattern4_1) = C::unpack_value_array_2(ctx, pattern2_1); - let pattern5_0 = C::value_type(ctx, pattern4_0); - if let Some(pattern6_0) = C::ty_vec128_int(ctx, pattern5_0) { - // Rule at src/isa/x64/lower.isle line 2635. - let expr0_0 = SseOpcode::Movdqu; - let expr1_0 = constructor_to_amode(ctx, pattern2_2, pattern4_1, pattern2_3); - let expr2_0 = C::amode_to_synthetic_amode(ctx, &expr1_0); - let expr3_0 = constructor_put_in_xmm(ctx, pattern4_0); - let expr4_0 = constructor_x64_xmm_movrm(ctx, &expr0_0, &expr2_0, expr3_0); - let expr5_0 = constructor_side_effect(ctx, &expr4_0); - return Some(expr5_0); - } - } - } - &InstructionData::FloatCompare { - opcode: ref pattern2_0, - args: ref pattern2_1, - cond: ref pattern2_2, - } => { - if let &Opcode::Fcmp = pattern2_0 { - let (pattern4_0, pattern4_1) = C::unpack_value_array_2(ctx, pattern2_1); - let pattern5_0 = C::value_type(ctx, pattern4_0); - if let Some(pattern6_0) = C::ty_scalar_float(ctx, pattern5_0) { - // Rule at src/isa/x64/lower.isle line 1606. - let expr0_0 = constructor_emit_fcmp(ctx, pattern2_2, pattern4_0, pattern4_1); - let expr1_0 = constructor_lower_fcmp_bool(ctx, &expr0_0); - let expr2_0 = C::output(ctx, expr1_0); - return Some(expr2_0); - } - } - } - &InstructionData::IntCompare { - opcode: ref pattern2_0, - args: ref pattern2_1, - cond: ref pattern2_2, - } => { - if let &Opcode::Icmp = pattern2_0 { - let (pattern4_0, pattern4_1) = C::unpack_value_array_2(ctx, pattern2_1); - let pattern5_0 = C::value_type(ctx, pattern4_0); - if pattern5_0 == I128 { - // Rule at src/isa/x64/lower.isle line 1481. - let expr0_0 = constructor_emit_cmp(ctx, pattern2_2, pattern4_0, pattern4_1); - let expr1_0 = constructor_lower_icmp_bool(ctx, &expr0_0); - let expr2_0 = C::output(ctx, expr1_0); - return Some(expr2_0); - } - } - } - _ => {} - } - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::first_result(ctx, pattern0_0) { - let pattern2_0 = C::value_type(ctx, pattern1_0); - if pattern2_0 == I128 { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Unary { - opcode: ref pattern5_0, - arg: pattern5_1, - } = &pattern4_0 - { - if let &Opcode::Ineg = pattern5_0 { - // Rule at src/isa/x64/lower.isle line 775. - let expr0_0 = C::put_in_regs(ctx, pattern5_1); - let expr1_0: usize = 0i128 as usize; - let expr2_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr1_0); - let expr3_0: usize = 1i128 as usize; - let expr4_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr3_0); - let expr5_0: Type = I64; - let expr6_0 = constructor_x64_neg_paired(ctx, expr5_0, expr2_0); - let expr7_0: Type = I64; - let expr8_0: Type = I64; - let expr9_0: u64 = 0i128 as u64; - let expr10_0 = constructor_imm(ctx, expr8_0, expr9_0); - let expr11_0 = C::gpr_new(ctx, expr10_0); - let expr12_0 = C::gpr_to_gpr_mem_imm(ctx, expr4_0); - let expr13_0 = constructor_x64_sbb_paired(ctx, expr7_0, expr11_0, &expr12_0); - let expr14_0 = constructor_with_flags(ctx, &expr6_0, &expr13_0); - let expr15_0 = C::output(ctx, expr14_0); - return Some(expr15_0); - } - } - } - if let Some(pattern3_0) = C::fits_in_32(ctx, pattern2_0) { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Unary { - opcode: ref pattern5_0, - arg: pattern5_1, - } = &pattern4_0 - { - if let &Opcode::Uextend = pattern5_0 { - let pattern7_0 = C::value_type(ctx, pattern5_1); - if let Some(pattern8_0) = C::fits_in_32(ctx, pattern7_0) { - // Rule at src/isa/x64/lower.isle line 2130. - let expr0_0: Type = I32; - let expr1_0 = ExtendKind::Zero; - let expr2_0 = constructor_extend_to_gpr(ctx, pattern5_1, expr0_0, &expr1_0); - let expr3_0 = constructor_output_gpr(ctx, expr2_0); - return Some(expr3_0); - } - } - } - } - if let Some(pattern3_0) = C::fits_in_64(ctx, pattern2_0) { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Binary { - opcode: ref pattern5_0, - args: ref pattern5_1, - } = &pattern4_0 - { - match pattern5_0 { - &Opcode::Iadd => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - if let Some(pattern8_0) = C::sinkable_load(ctx, pattern7_1) { - // Rule at src/isa/x64/lower.isle line 61. - let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0); - let expr1_0 = constructor_sink_load_to_gpr_mem_imm(ctx, &pattern8_0); - let expr2_0 = constructor_x64_add(ctx, pattern3_0, expr0_0, &expr1_0); - let expr3_0 = constructor_output_gpr(ctx, expr2_0); - return Some(expr3_0); - } - } - &Opcode::Isub => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - if let Some(pattern8_0) = C::simm32_from_value(ctx, pattern7_1) { - // Rule at src/isa/x64/lower.isle line 148. - let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0); - let expr1_0 = - constructor_x64_sub(ctx, pattern3_0, expr0_0, &pattern8_0); - let expr2_0 = constructor_output_gpr(ctx, expr1_0); - return Some(expr2_0); - } - } - &Opcode::Imul => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - if let Some(pattern8_0) = C::sinkable_load(ctx, pattern7_1) { - // Rule at src/isa/x64/lower.isle line 828. - let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0); - let expr1_0 = constructor_sink_load_to_gpr_mem_imm(ctx, &pattern8_0); - let expr2_0 = constructor_x64_mul(ctx, pattern3_0, expr0_0, &expr1_0); - let expr3_0 = constructor_output_gpr(ctx, expr2_0); - return Some(expr3_0); - } - } - _ => {} - } - } - } - if let Some(pattern3_0) = C::ty_8_or_16(ctx, pattern2_0) { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Unary { - opcode: ref pattern5_0, - arg: pattern5_1, - } = &pattern4_0 - { - if let &Opcode::Popcnt = pattern5_0 { - // Rule at src/isa/x64/lower.isle line 1872. - let expr0_0: Type = I32; - let expr1_0: Type = I32; - let expr2_0 = ExtendKind::Zero; - let expr3_0 = constructor_extend_to_gpr(ctx, pattern5_1, expr1_0, &expr2_0); - let expr4_0 = constructor_do_popcnt(ctx, expr0_0, expr3_0); - let expr5_0 = constructor_output_gpr(ctx, expr4_0); - return Some(expr5_0); - } - } - } - if let Some(pattern3_0) = C::ty_vec128(ctx, pattern2_0) { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Load { - opcode: ref pattern5_0, - arg: pattern5_1, - flags: pattern5_2, - offset: pattern5_3, - } = &pattern4_0 - { - if let &Opcode::Load = pattern5_0 { - // Rule at src/isa/x64/lower.isle line 2554. - let expr0_0 = constructor_to_amode(ctx, pattern5_2, pattern5_1, pattern5_3); - let expr1_0 = constructor_amode_to_xmm_mem(ctx, &expr0_0); - let expr2_0 = constructor_x64_movdqu(ctx, &expr1_0); - let expr3_0 = constructor_output_xmm(ctx, expr2_0); - return Some(expr3_0); - } - } - } - let pattern3_0 = C::inst_data(ctx, pattern0_0); - match &pattern3_0 { - &InstructionData::Unary { - opcode: ref pattern4_0, - arg: pattern4_1, - } => { - if let &Opcode::Bnot = pattern4_0 { - let mut closure6 = || { - let expr0_0 = C::ty_int_ref_scalar_64(ctx, pattern2_0)?; - return Some(expr0_0); - }; - if let Some(pattern6_0) = closure6() { - // Rule at src/isa/x64/lower.isle line 1218. - let expr0_0 = constructor_put_in_gpr(ctx, pattern4_1); - let expr1_0 = constructor_x64_not(ctx, pattern2_0, expr0_0); - let expr2_0 = constructor_output_gpr(ctx, expr1_0); - return Some(expr2_0); - } - } - } - &InstructionData::Ternary { - opcode: ref pattern4_0, - args: ref pattern4_1, - } => { - match pattern4_0 { - &Opcode::Select => { - let (pattern6_0, pattern6_1, pattern6_2) = - C::unpack_value_array_3(ctx, pattern4_1); - let pattern7_0 = C::value_type(ctx, pattern6_0); - if pattern7_0 == I128 { - // Rule at src/isa/x64/lower.isle line 1752. - let expr0_0 = CC::Z; - let expr1_0 = C::put_in_regs(ctx, pattern6_0); - let expr2_0 = constructor_cmp_zero_i128(ctx, &expr0_0, expr1_0); - let expr3_0 = - constructor_select_icmp(ctx, &expr2_0, pattern6_1, pattern6_2); - let expr4_0 = C::output(ctx, expr3_0); - return Some(expr4_0); - } - } - &Opcode::SelectSpectreGuard => { - let (pattern6_0, pattern6_1, pattern6_2) = - C::unpack_value_array_3(ctx, pattern4_1); - let pattern7_0 = C::value_type(ctx, pattern6_0); - if pattern7_0 == I128 { - // Rule at src/isa/x64/lower.isle line 2954. - let expr0_0 = CC::Z; - let expr1_0 = C::put_in_regs(ctx, pattern6_0); - let expr2_0 = constructor_cmp_zero_i128(ctx, &expr0_0, expr1_0); - let expr3_0 = - constructor_select_icmp(ctx, &expr2_0, pattern6_1, pattern6_2); - let expr4_0 = C::output(ctx, expr3_0); - return Some(expr4_0); - } - } - _ => {} - } - } - _ => {} - } - } - let pattern1_0 = C::inst_data(ctx, pattern0_0); - match &pattern1_0 { - &InstructionData::Store { - opcode: ref pattern2_0, - args: ref pattern2_1, - flags: pattern2_2, - offset: pattern2_3, - } => { - if let &Opcode::Store = pattern2_0 { - let (pattern4_0, pattern4_1) = C::unpack_value_array_2(ctx, pattern2_1); - let pattern5_0 = C::value_type(ctx, pattern4_0); - if let Some(pattern6_0) = C::type_register_class(ctx, pattern5_0) { - if let &RegisterClass::Gpr { - single_register: pattern7_0, - } = &pattern6_0 - { - // Rule at src/isa/x64/lower.isle line 2584. - let expr0_0 = constructor_to_amode(ctx, pattern2_2, pattern4_1, pattern2_3); - let expr1_0 = C::amode_to_synthetic_amode(ctx, &expr0_0); - let expr2_0 = constructor_put_in_gpr(ctx, pattern4_0); - let expr3_0 = constructor_x64_movrm(ctx, pattern5_0, &expr1_0, expr2_0); - let expr4_0 = constructor_side_effect(ctx, &expr3_0); - return Some(expr4_0); - } - } - } - } - &InstructionData::IntCompare { - opcode: ref pattern2_0, - args: ref pattern2_1, - cond: ref pattern2_2, - } => { - if let &Opcode::Icmp = pattern2_0 { - let (pattern4_0, pattern4_1) = C::unpack_value_array_2(ctx, pattern2_1); - let pattern5_0 = C::value_type(ctx, pattern4_0); - if let Some(pattern6_0) = C::fits_in_64(ctx, pattern5_0) { - // Rule at src/isa/x64/lower.isle line 1478. - let expr0_0 = constructor_emit_cmp(ctx, pattern2_2, pattern4_0, pattern4_1); - let expr1_0 = constructor_lower_icmp_bool(ctx, &expr0_0); - let expr2_0 = C::output(ctx, expr1_0); - return Some(expr2_0); - } - } - } - _ => {} - } - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::first_result(ctx, pattern0_0) { - let pattern2_0 = C::value_type(ctx, pattern1_0); - if pattern2_0 == I128 { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Load { - opcode: ref pattern5_0, - arg: pattern5_1, - flags: pattern5_2, - offset: pattern5_3, - } = &pattern4_0 - { - if let &Opcode::Load = pattern5_0 { - // Rule at src/isa/x64/lower.isle line 2558. - let expr0_0 = constructor_to_amode(ctx, pattern5_2, pattern5_1, pattern5_3); - let expr1_0: u32 = 8i128 as u32; - let expr2_0 = C::amode_offset(ctx, &expr0_0, expr1_0); - let expr3_0 = constructor_x64_mov(ctx, &expr0_0); - let expr4_0 = constructor_x64_mov(ctx, &expr2_0); - let expr5_0 = C::value_regs(ctx, expr3_0, expr4_0); - let expr6_0 = C::output(ctx, expr5_0); - return Some(expr6_0); - } - } - } - if let Some(pattern3_0) = C::fits_in_64(ctx, pattern2_0) { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Binary { - opcode: ref pattern5_0, - args: ref pattern5_1, - } = &pattern4_0 - { - match pattern5_0 { - &Opcode::Iadd => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - if let Some(pattern8_0) = C::simm32_from_value(ctx, pattern7_0) { - // Rule at src/isa/x64/lower.isle line 55. - let expr0_0 = constructor_put_in_gpr(ctx, pattern7_1); - let expr1_0 = - constructor_x64_add(ctx, pattern3_0, expr0_0, &pattern8_0); - let expr2_0 = constructor_output_gpr(ctx, expr1_0); - return Some(expr2_0); - } - } - &Opcode::Isub => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 143. - let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0); - let expr1_0 = constructor_put_in_gpr_mem_imm(ctx, pattern7_1); - let expr2_0 = constructor_x64_sub(ctx, pattern3_0, expr0_0, &expr1_0); - let expr3_0 = constructor_output_gpr(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::Imul => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - if let Some(pattern8_0) = C::simm32_from_value(ctx, pattern7_1) { - // Rule at src/isa/x64/lower.isle line 818. - let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0); - let expr1_0 = - constructor_x64_mul(ctx, pattern3_0, expr0_0, &pattern8_0); - let expr2_0 = constructor_output_gpr(ctx, expr1_0); - return Some(expr2_0); - } - } - _ => {} - } - } - } - if let Some(pattern3_0) = C::ty_scalar_float(ctx, pattern2_0) { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Unary { - opcode: ref pattern5_0, - arg: pattern5_1, - } = &pattern4_0 - { - if let &Opcode::Bnot = pattern5_0 { - // Rule at src/isa/x64/lower.isle line 1238. - let expr0_0 = constructor_put_in_xmm(ctx, pattern5_1); - let expr1_0 = constructor_vector_all_ones(ctx); - let expr2_0 = C::xmm_to_xmm_mem(ctx, expr1_0); - let expr3_0 = constructor_sse_xor(ctx, pattern3_0, expr0_0, &expr2_0); - let expr4_0 = constructor_output_xmm(ctx, expr3_0); - return Some(expr4_0); - } - } - } - } - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::first_result(ctx, pattern0_0) { - let pattern2_0 = C::value_type(ctx, pattern1_0); - if let Some(pattern3_0) = C::fits_in_32(ctx, pattern2_0) { - if let Some(pattern4_0) = C::type_register_class(ctx, pattern2_0) { - if let &RegisterClass::Gpr { - single_register: pattern5_0, - } = &pattern4_0 - { - let pattern6_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Load { - opcode: ref pattern7_0, - arg: pattern7_1, - flags: pattern7_2, - offset: pattern7_3, - } = &pattern6_0 - { - if let &Opcode::Load = pattern7_0 { - // Rule at src/isa/x64/lower.isle line 2520. - let expr0_0 = C::ty_bits_u16(ctx, pattern3_0); - let expr1_0: u16 = 64i128 as u16; - let expr2_0 = C::ext_mode(ctx, expr0_0, expr1_0); - let expr3_0 = - constructor_to_amode(ctx, pattern7_2, pattern7_1, pattern7_3); - let expr4_0 = constructor_amode_to_gpr_mem(ctx, &expr3_0); - let expr5_0 = constructor_x64_movzx(ctx, &expr2_0, &expr4_0); - let expr6_0 = constructor_output_gpr(ctx, expr5_0); - return Some(expr6_0); - } - } - } - } - } - if let Some(pattern3_0) = C::fits_in_64(ctx, pattern2_0) { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Binary { - opcode: ref pattern5_0, - args: ref pattern5_1, - } = &pattern4_0 - { - match pattern5_0 { - &Opcode::Iadd => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - if let Some(pattern8_0) = C::simm32_from_value(ctx, pattern7_1) { - // Rule at src/isa/x64/lower.isle line 51. - let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0); - let expr1_0 = - constructor_x64_add(ctx, pattern3_0, expr0_0, &pattern8_0); - let expr2_0 = constructor_output_gpr(ctx, expr1_0); - return Some(expr2_0); - } - } - &Opcode::Imul => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - if let Some(pattern8_0) = C::simm32_from_value(ctx, pattern7_0) { - // Rule at src/isa/x64/lower.isle line 822. - let expr0_0 = constructor_put_in_gpr(ctx, pattern7_1); - let expr1_0 = - constructor_x64_mul(ctx, pattern3_0, expr0_0, &pattern8_0); - let expr2_0 = constructor_output_gpr(ctx, expr1_0); - return Some(expr2_0); - } - } - _ => {} - } - } - } - } - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::first_result(ctx, pattern0_0) { - let pattern2_0 = C::value_type(ctx, pattern1_0); - if let Some(pattern3_0) = C::fits_in_64(ctx, pattern2_0) { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Binary { - opcode: ref pattern5_0, - args: ref pattern5_1, - } = &pattern4_0 - { - match pattern5_0 { - &Opcode::Iadd => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 45. - let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0); - let expr1_0 = constructor_put_in_gpr_mem_imm(ctx, pattern7_1); - let expr2_0 = constructor_x64_add(ctx, pattern3_0, expr0_0, &expr1_0); - let expr3_0 = constructor_output_gpr(ctx, expr2_0); - return Some(expr3_0); - } - &Opcode::Imul => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 813. - let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0); - let expr1_0 = constructor_put_in_gpr_mem_imm(ctx, pattern7_1); - let expr2_0 = constructor_x64_mul(ctx, pattern3_0, expr0_0, &expr1_0); - let expr3_0 = constructor_output_gpr(ctx, expr2_0); - return Some(expr3_0); - } - _ => {} - } - } - } - } - return None; -} - -// Generated as internal constructor for term lower_branch. -pub fn constructor_lower_branch( - ctx: &mut C, - arg0: Inst, - arg1: &MachLabelSlice, -) -> Option { - let pattern0_0 = arg0; - let pattern1_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Branch { - opcode: ref pattern2_0, - args: pattern2_1, - destination: pattern2_2, - } = &pattern1_0 - { - match pattern2_0 { - &Opcode::Brz => { - let pattern4_0 = C::value_list_slice(ctx, pattern2_1); - if let Some((pattern5_0, pattern5_1)) = C::value_slice_unwrap(ctx, pattern4_0) { - if let Some(pattern6_0) = C::maybe_uextend(ctx, pattern5_0) { - if let Some(pattern7_0) = C::def_inst(ctx, pattern6_0) { - let pattern8_0 = C::inst_data(ctx, pattern7_0); - match &pattern8_0 { - &InstructionData::FloatCompare { - opcode: ref pattern9_0, - args: ref pattern9_1, - cond: ref pattern9_2, - } => { - if let &Opcode::Fcmp = pattern9_0 { - let (pattern11_0, pattern11_1) = - C::unpack_value_array_2(ctx, pattern9_1); - let pattern12_0 = arg1; - if let Some((pattern13_0, pattern13_1)) = - C::two_targets(ctx, pattern12_0) - { - // Rule at src/isa/x64/lower.isle line 2880. - let expr0_0 = C::floatcc_inverse(ctx, pattern9_2); - let expr1_0 = constructor_emit_fcmp( - ctx, - &expr0_0, - pattern11_0, - pattern11_1, - ); - let expr2_0 = constructor_jmp_cond_fcmp( - ctx, - &expr1_0, - pattern13_0, - pattern13_1, - ); - let expr3_0 = - constructor_emit_side_effect(ctx, &expr2_0); - return Some(expr3_0); - } - } - } - &InstructionData::IntCompare { - opcode: ref pattern9_0, - args: ref pattern9_1, - cond: ref pattern9_2, - } => { - if let &Opcode::Icmp = pattern9_0 { - let (pattern11_0, pattern11_1) = - C::unpack_value_array_2(ctx, pattern9_1); - let pattern12_0 = arg1; - if let Some((pattern13_0, pattern13_1)) = - C::two_targets(ctx, pattern12_0) - { - // Rule at src/isa/x64/lower.isle line 2876. - let expr0_0 = constructor_emit_cmp( - ctx, - pattern9_2, - pattern11_0, - pattern11_1, - ); - let expr1_0 = - constructor_invert_icmp_cond_result(ctx, &expr0_0); - let expr2_0 = constructor_jmp_cond_icmp( - ctx, - &expr1_0, - pattern13_0, - pattern13_1, - ); - let expr3_0 = - constructor_emit_side_effect(ctx, &expr2_0); - return Some(expr3_0); - } - } - } - _ => {} - } - } - } - } - } - &Opcode::Brnz => { - let pattern4_0 = C::value_list_slice(ctx, pattern2_1); - if let Some((pattern5_0, pattern5_1)) = C::value_slice_unwrap(ctx, pattern4_0) { - if let Some(pattern6_0) = C::def_inst(ctx, pattern5_0) { - let pattern7_0 = C::inst_data(ctx, pattern6_0); - match &pattern7_0 { - &InstructionData::Unary { - opcode: ref pattern8_0, - arg: pattern8_1, - } => { - if let &Opcode::Uextend = pattern8_0 { - if let Some(pattern10_0) = C::def_inst(ctx, pattern8_1) { - let pattern11_0 = C::inst_data(ctx, pattern10_0); - match &pattern11_0 { - &InstructionData::FloatCompare { - opcode: ref pattern12_0, - args: ref pattern12_1, - cond: ref pattern12_2, - } => { - if let &Opcode::Fcmp = pattern12_0 { - let (pattern14_0, pattern14_1) = - C::unpack_value_array_2(ctx, pattern12_1); - let pattern15_0 = arg1; - if let Some((pattern16_0, pattern16_1)) = - C::two_targets(ctx, pattern15_0) - { - // Rule at src/isa/x64/lower.isle line 2903. - let expr0_0 = constructor_emit_fcmp( - ctx, - pattern12_2, - pattern14_0, - pattern14_1, - ); - let expr1_0 = constructor_jmp_cond_fcmp( - ctx, - &expr0_0, - pattern16_0, - pattern16_1, - ); - let expr2_0 = constructor_emit_side_effect( - ctx, &expr1_0, - ); - return Some(expr2_0); - } - } - } - &InstructionData::IntCompare { - opcode: ref pattern12_0, - args: ref pattern12_1, - cond: ref pattern12_2, - } => { - if let &Opcode::Icmp = pattern12_0 { - let (pattern14_0, pattern14_1) = - C::unpack_value_array_2(ctx, pattern12_1); - let pattern15_0 = arg1; - if let Some((pattern16_0, pattern16_1)) = - C::two_targets(ctx, pattern15_0) - { - // Rule at src/isa/x64/lower.isle line 2900. - let expr0_0 = constructor_emit_cmp( - ctx, - pattern12_2, - pattern14_0, - pattern14_1, - ); - let expr1_0 = constructor_jmp_cond_icmp( - ctx, - &expr0_0, - pattern16_0, - pattern16_1, - ); - let expr2_0 = constructor_emit_side_effect( - ctx, &expr1_0, - ); - return Some(expr2_0); - } - } - } - _ => {} - } - } - } - } - &InstructionData::FloatCompare { - opcode: ref pattern8_0, - args: ref pattern8_1, - cond: ref pattern8_2, - } => { - if let &Opcode::Fcmp = pattern8_0 { - let (pattern10_0, pattern10_1) = - C::unpack_value_array_2(ctx, pattern8_1); - let pattern11_0 = arg1; - if let Some((pattern12_0, pattern12_1)) = - C::two_targets(ctx, pattern11_0) - { - // Rule at src/isa/x64/lower.isle line 2896. - let expr0_0 = constructor_emit_fcmp( - ctx, - pattern8_2, - pattern10_0, - pattern10_1, - ); - let expr1_0 = constructor_jmp_cond_fcmp( - ctx, - &expr0_0, - pattern12_0, - pattern12_1, - ); - let expr2_0 = constructor_emit_side_effect(ctx, &expr1_0); - return Some(expr2_0); - } - } - } - &InstructionData::IntCompare { - opcode: ref pattern8_0, - args: ref pattern8_1, - cond: ref pattern8_2, - } => { - if let &Opcode::Icmp = pattern8_0 { - let (pattern10_0, pattern10_1) = - C::unpack_value_array_2(ctx, pattern8_1); - let pattern11_0 = arg1; - if let Some((pattern12_0, pattern12_1)) = - C::two_targets(ctx, pattern11_0) - { - // Rule at src/isa/x64/lower.isle line 2893. - let expr0_0 = constructor_emit_cmp( - ctx, - pattern8_2, - pattern10_0, - pattern10_1, - ); - let expr1_0 = constructor_jmp_cond_icmp( - ctx, - &expr0_0, - pattern12_0, - pattern12_1, - ); - let expr2_0 = constructor_emit_side_effect(ctx, &expr1_0); - return Some(expr2_0); - } - } - } - _ => {} - } - } - } - } - _ => {} - } - } - let pattern0_0 = arg0; - let pattern1_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Branch { - opcode: ref pattern2_0, - args: pattern2_1, - destination: pattern2_2, - } = &pattern1_0 - { - match pattern2_0 { - &Opcode::Brz => { - let pattern4_0 = C::value_list_slice(ctx, pattern2_1); - if let Some((pattern5_0, pattern5_1)) = C::value_slice_unwrap(ctx, pattern4_0) { - let pattern6_0 = C::value_type(ctx, pattern5_0); - if pattern6_0 == I128 { - let pattern8_0 = arg1; - if let Some((pattern9_0, pattern9_1)) = C::two_targets(ctx, pattern8_0) { - // Rule at src/isa/x64/lower.isle line 2884. - let expr0_0 = CC::NZ; - let expr1_0 = C::put_in_regs(ctx, pattern5_0); - let expr2_0 = constructor_cmp_zero_i128(ctx, &expr0_0, expr1_0); - let expr3_0 = - constructor_jmp_cond_icmp(ctx, &expr2_0, pattern9_0, pattern9_1); - let expr4_0 = constructor_emit_side_effect(ctx, &expr3_0); - return Some(expr4_0); - } - } - } - } - &Opcode::Brnz => { - let pattern4_0 = C::value_list_slice(ctx, pattern2_1); - if let Some((pattern5_0, pattern5_1)) = C::value_slice_unwrap(ctx, pattern4_0) { - let pattern6_0 = C::value_type(ctx, pattern5_0); - if pattern6_0 == I128 { - let pattern8_0 = arg1; - if let Some((pattern9_0, pattern9_1)) = C::two_targets(ctx, pattern8_0) { - // Rule at src/isa/x64/lower.isle line 2907. - let expr0_0 = CC::Z; - let expr1_0 = C::put_in_regs(ctx, pattern5_0); - let expr2_0 = constructor_cmp_zero_i128(ctx, &expr0_0, expr1_0); - let expr3_0 = - constructor_jmp_cond_icmp(ctx, &expr2_0, pattern9_0, pattern9_1); - let expr4_0 = constructor_emit_side_effect(ctx, &expr3_0); - return Some(expr4_0); - } - } - } - } - _ => {} - } - } - let pattern0_0 = arg0; - let pattern1_0 = C::inst_data(ctx, pattern0_0); - match &pattern1_0 { - &InstructionData::BranchTable { - opcode: ref pattern2_0, - arg: pattern2_1, - destination: pattern2_2, - table: pattern2_3, - } => { - if let &Opcode::BrTable = pattern2_0 { - let pattern4_0 = C::value_type(ctx, pattern2_1); - let pattern5_0 = arg1; - if let Some((pattern6_0, pattern6_1)) = C::jump_table_targets(ctx, pattern5_0) { - // Rule at src/isa/x64/lower.isle line 2941. - let expr0_0 = constructor_put_in_gpr(ctx, pattern2_1); - let expr1_0 = constructor_jmp_table_seq( - ctx, - pattern4_0, - expr0_0, - pattern6_0, - &pattern6_1, - ); - let expr2_0 = constructor_emit_side_effect(ctx, &expr1_0); - return Some(expr2_0); - } - } - } - &InstructionData::Branch { - opcode: ref pattern2_0, - args: pattern2_1, - destination: pattern2_2, - } => { - match pattern2_0 { - &Opcode::Brz => { - let pattern4_0 = C::value_list_slice(ctx, pattern2_1); - if let Some((pattern5_0, pattern5_1)) = C::value_slice_unwrap(ctx, pattern4_0) { - let pattern6_0 = C::value_type(ctx, pattern5_0); - if let Some(()) = C::ty_int_bool_or_ref(ctx, pattern6_0) { - let pattern8_0 = arg1; - if let Some((pattern9_0, pattern9_1)) = C::two_targets(ctx, pattern8_0) - { - // Rule at src/isa/x64/lower.isle line 2887. - let expr0_0 = constructor_cmp_zero_int_bool_ref(ctx, pattern5_0); - let expr1_0 = CC::Z; - let expr2_0 = - constructor_jmp_cond(ctx, &expr1_0, pattern9_0, pattern9_1); - let expr3_0 = - constructor_with_flags_side_effect(ctx, &expr0_0, &expr2_0); - let expr4_0 = constructor_emit_side_effect(ctx, &expr3_0); - return Some(expr4_0); - } - } - } - } - &Opcode::Brnz => { - let pattern4_0 = C::value_list_slice(ctx, pattern2_1); - if let Some((pattern5_0, pattern5_1)) = C::value_slice_unwrap(ctx, pattern4_0) { - let pattern6_0 = C::value_type(ctx, pattern5_0); - if let Some(()) = C::ty_int_bool_or_ref(ctx, pattern6_0) { - let pattern8_0 = arg1; - if let Some((pattern9_0, pattern9_1)) = C::two_targets(ctx, pattern8_0) - { - // Rule at src/isa/x64/lower.isle line 2910. - let expr0_0 = constructor_cmp_zero_int_bool_ref(ctx, pattern5_0); - let expr1_0 = CC::NZ; - let expr2_0 = - constructor_jmp_cond(ctx, &expr1_0, pattern9_0, pattern9_1); - let expr3_0 = - constructor_with_flags_side_effect(ctx, &expr0_0, &expr2_0); - let expr4_0 = constructor_emit_side_effect(ctx, &expr3_0); - return Some(expr4_0); - } - } - } - } - _ => {} - } - } - &InstructionData::Jump { - opcode: ref pattern2_0, - args: pattern2_1, - destination: pattern2_2, - } => { - if let &Opcode::Jump = pattern2_0 { - let pattern4_0 = C::value_list_slice(ctx, pattern2_1); - let pattern5_0 = arg1; - if let Some(pattern6_0) = C::single_target(ctx, pattern5_0) { - // Rule at src/isa/x64/lower.isle line 2871. - let expr0_0 = constructor_jmp_known(ctx, pattern6_0); - let expr1_0 = constructor_emit_side_effect(ctx, &expr0_0); - return Some(expr1_0); - } - } - } - _ => {} - } - return None; -} - -// Generated as internal constructor for term sse_and. -pub fn constructor_sse_and(ctx: &mut C, arg0: Type, arg1: Xmm, arg2: &XmmMem) -> Xmm { - let pattern0_0 = arg0; - if pattern0_0 == F32 { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - // Rule at src/isa/x64/lower.isle line 252. - let expr0_0 = constructor_x64_andps(ctx, pattern2_0, pattern3_0); - return expr0_0; - } - if pattern0_0 == F64 { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - // Rule at src/isa/x64/lower.isle line 253. - let expr0_0 = constructor_x64_andpd(ctx, pattern2_0, pattern3_0); - return expr0_0; - } - if pattern0_0 == F32X4 { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - // Rule at src/isa/x64/lower.isle line 250. - let expr0_0 = constructor_x64_andps(ctx, pattern2_0, pattern3_0); - return expr0_0; - } - if pattern0_0 == F64X2 { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - // Rule at src/isa/x64/lower.isle line 251. - let expr0_0 = constructor_x64_andpd(ctx, pattern2_0, pattern3_0); - return expr0_0; - } - let pattern0_0 = arg0; - if let Some((pattern1_0, pattern1_1)) = C::multi_lane(ctx, pattern0_0) { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - // Rule at src/isa/x64/lower.isle line 254. - let expr0_0 = constructor_x64_pand(ctx, pattern2_0, pattern3_0); - return expr0_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "sse_and", "src/isa/x64/lower.isle line 249" - ); -} - -// Generated as internal constructor for term sse_or. -pub fn constructor_sse_or(ctx: &mut C, arg0: Type, arg1: Xmm, arg2: &XmmMem) -> Xmm { - let pattern0_0 = arg0; - if pattern0_0 == F32 { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - // Rule at src/isa/x64/lower.isle line 313. - let expr0_0 = constructor_x64_orps(ctx, pattern2_0, pattern3_0); - return expr0_0; - } - if pattern0_0 == F64 { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - // Rule at src/isa/x64/lower.isle line 314. - let expr0_0 = constructor_x64_orpd(ctx, pattern2_0, pattern3_0); - return expr0_0; - } - if pattern0_0 == F32X4 { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - // Rule at src/isa/x64/lower.isle line 311. - let expr0_0 = constructor_x64_orps(ctx, pattern2_0, pattern3_0); - return expr0_0; - } - if pattern0_0 == F64X2 { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - // Rule at src/isa/x64/lower.isle line 312. - let expr0_0 = constructor_x64_orpd(ctx, pattern2_0, pattern3_0); - return expr0_0; - } - let pattern0_0 = arg0; - if let Some((pattern1_0, pattern1_1)) = C::multi_lane(ctx, pattern0_0) { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - // Rule at src/isa/x64/lower.isle line 315. - let expr0_0 = constructor_x64_por(ctx, pattern2_0, pattern3_0); - return expr0_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "sse_or", "src/isa/x64/lower.isle line 310" - ); -} - -// Generated as internal constructor for term or_i128. -pub fn constructor_or_i128(ctx: &mut C, arg0: ValueRegs, arg1: ValueRegs) -> ValueRegs { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/lower.isle line 324. - let expr0_0: usize = 0i128 as usize; - let expr1_0 = constructor_value_regs_get_gpr(ctx, pattern0_0, expr0_0); - let expr2_0: usize = 1i128 as usize; - let expr3_0 = constructor_value_regs_get_gpr(ctx, pattern0_0, expr2_0); - let expr4_0: usize = 0i128 as usize; - let expr5_0 = constructor_value_regs_get_gpr(ctx, pattern1_0, expr4_0); - let expr6_0: usize = 1i128 as usize; - let expr7_0 = constructor_value_regs_get_gpr(ctx, pattern1_0, expr6_0); - let expr8_0: Type = I64; - let expr9_0 = C::gpr_to_gpr_mem_imm(ctx, expr5_0); - let expr10_0 = constructor_x64_or(ctx, expr8_0, expr1_0, &expr9_0); - let expr11_0: Type = I64; - let expr12_0 = C::gpr_to_gpr_mem_imm(ctx, expr7_0); - let expr13_0 = constructor_x64_or(ctx, expr11_0, expr3_0, &expr12_0); - let expr14_0 = constructor_value_gprs(ctx, expr10_0, expr13_0); - return expr14_0; -} - -// Generated as internal constructor for term shl_i128. -pub fn constructor_shl_i128(ctx: &mut C, arg0: ValueRegs, arg1: Gpr) -> ValueRegs { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/lower.isle line 398. - let expr0_0: usize = 0i128 as usize; - let expr1_0 = constructor_value_regs_get_gpr(ctx, pattern0_0, expr0_0); - let expr2_0: usize = 1i128 as usize; - let expr3_0 = constructor_value_regs_get_gpr(ctx, pattern0_0, expr2_0); - let expr4_0: Type = I64; - let expr5_0 = C::gpr_to_imm8_gpr(ctx, pattern1_0); - let expr6_0 = constructor_x64_shl(ctx, expr4_0, expr1_0, &expr5_0); - let expr7_0: Type = I64; - let expr8_0 = C::gpr_to_imm8_gpr(ctx, pattern1_0); - let expr9_0 = constructor_x64_shl(ctx, expr7_0, expr3_0, &expr8_0); - let expr10_0: Type = I64; - let expr11_0: Type = I64; - let expr12_0: Type = I64; - let expr13_0: u64 = 64i128 as u64; - let expr14_0 = constructor_imm(ctx, expr12_0, expr13_0); - let expr15_0 = C::gpr_new(ctx, expr14_0); - let expr16_0 = C::gpr_to_gpr_mem_imm(ctx, pattern1_0); - let expr17_0 = constructor_x64_sub(ctx, expr11_0, expr15_0, &expr16_0); - let expr18_0 = C::gpr_to_imm8_gpr(ctx, expr17_0); - let expr19_0 = constructor_x64_shr(ctx, expr10_0, expr1_0, &expr18_0); - let expr20_0: Type = I64; - let expr21_0: u64 = 0i128 as u64; - let expr22_0 = constructor_imm(ctx, expr20_0, expr21_0); - let expr23_0 = C::gpr_new(ctx, expr22_0); - let expr24_0 = OperandSize::Size64; - let expr25_0: u32 = 127i128 as u32; - let expr26_0 = RegMemImm::Imm { simm32: expr25_0 }; - let expr27_0 = C::gpr_mem_imm_new(ctx, &expr26_0); - let expr28_0 = constructor_x64_test(ctx, &expr24_0, &expr27_0, pattern1_0); - let expr29_0: Type = I64; - let expr30_0 = CC::Z; - let expr31_0 = C::gpr_to_gpr_mem(ctx, expr23_0); - let expr32_0 = constructor_cmove(ctx, expr29_0, &expr30_0, &expr31_0, expr19_0); - let expr33_0 = constructor_with_flags_reg(ctx, &expr28_0, &expr32_0); - let expr34_0 = C::gpr_new(ctx, expr33_0); - let expr35_0: Type = I64; - let expr36_0 = C::gpr_to_gpr_mem_imm(ctx, expr9_0); - let expr37_0 = constructor_x64_or(ctx, expr35_0, expr34_0, &expr36_0); - let expr38_0 = OperandSize::Size64; - let expr39_0: u32 = 64i128 as u32; - let expr40_0 = RegMemImm::Imm { simm32: expr39_0 }; - let expr41_0 = C::gpr_mem_imm_new(ctx, &expr40_0); - let expr42_0 = constructor_x64_test(ctx, &expr38_0, &expr41_0, pattern1_0); - let expr43_0: Type = I64; - let expr44_0 = CC::Z; - let expr45_0 = C::gpr_to_gpr_mem(ctx, expr6_0); - let expr46_0 = constructor_cmove(ctx, expr43_0, &expr44_0, &expr45_0, expr23_0); - let expr47_0: Type = I64; - let expr48_0 = CC::Z; - let expr49_0 = C::gpr_to_gpr_mem(ctx, expr37_0); - let expr50_0 = constructor_cmove(ctx, expr47_0, &expr48_0, &expr49_0, expr6_0); - let expr51_0 = constructor_consumes_flags_concat(ctx, &expr46_0, &expr50_0); - let expr52_0 = constructor_with_flags(ctx, &expr42_0, &expr51_0); - return expr52_0; -} - -// Generated as internal constructor for term ishl_i8x16_mask. -pub fn constructor_ishl_i8x16_mask(ctx: &mut C, arg0: &RegMemImm) -> SyntheticAmode { - let pattern0_0 = arg0; - match pattern0_0 { - &RegMemImm::Imm { simm32: pattern1_0 } => { - // Rule at src/isa/x64/lower.isle line 463. - let expr0_0 = C::ishl_i8x16_mask_for_const(ctx, pattern1_0); - return expr0_0; - } - &RegMemImm::Reg { reg: pattern1_0 } => { - // Rule at src/isa/x64/lower.isle line 472. - let expr0_0 = C::ishl_i8x16_mask_table(ctx); - let expr1_0 = constructor_x64_lea(ctx, &expr0_0); - let expr2_0: Type = I64; - let expr3_0 = C::gpr_new(ctx, pattern1_0); - let expr4_0: u8 = 4i128 as u8; - let expr5_0 = C::imm8_to_imm8_gpr(ctx, expr4_0); - let expr6_0 = constructor_x64_shl(ctx, expr2_0, expr3_0, &expr5_0); - let expr7_0: u32 = 0i128 as u32; - let expr8_0: u8 = 0i128 as u8; - let expr9_0 = C::amode_imm_reg_reg_shift(ctx, expr7_0, expr1_0, expr6_0, expr8_0); - let expr10_0 = C::amode_to_synthetic_amode(ctx, &expr9_0); - return expr10_0; - } - &RegMemImm::Mem { - addr: ref pattern1_0, - } => { - // Rule at src/isa/x64/lower.isle line 482. - let expr0_0: Type = I64; - let expr1_0 = ExtKind::None; - let expr2_0 = constructor_x64_load(ctx, expr0_0, pattern1_0, &expr1_0); - let expr3_0 = RegMemImm::Reg { reg: expr2_0 }; - let expr4_0 = constructor_ishl_i8x16_mask(ctx, &expr3_0); - return expr4_0; - } - _ => {} - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "ishl_i8x16_mask", "src/isa/x64/lower.isle line 457" - ); -} - -// Generated as internal constructor for term shr_i128. -pub fn constructor_shr_i128(ctx: &mut C, arg0: ValueRegs, arg1: Gpr) -> ValueRegs { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/lower.isle line 510. - let expr0_0: usize = 0i128 as usize; - let expr1_0 = constructor_value_regs_get_gpr(ctx, pattern0_0, expr0_0); - let expr2_0: usize = 1i128 as usize; - let expr3_0 = constructor_value_regs_get_gpr(ctx, pattern0_0, expr2_0); - let expr4_0: Type = I64; - let expr5_0 = C::gpr_to_imm8_gpr(ctx, pattern1_0); - let expr6_0 = constructor_x64_shr(ctx, expr4_0, expr1_0, &expr5_0); - let expr7_0: Type = I64; - let expr8_0 = C::gpr_to_imm8_gpr(ctx, pattern1_0); - let expr9_0 = constructor_x64_shr(ctx, expr7_0, expr3_0, &expr8_0); - let expr10_0: Type = I64; - let expr11_0: Type = I64; - let expr12_0: Type = I64; - let expr13_0: u64 = 64i128 as u64; - let expr14_0 = constructor_imm(ctx, expr12_0, expr13_0); - let expr15_0 = C::gpr_new(ctx, expr14_0); - let expr16_0 = C::gpr_to_gpr_mem_imm(ctx, pattern1_0); - let expr17_0 = constructor_x64_sub(ctx, expr11_0, expr15_0, &expr16_0); - let expr18_0 = C::gpr_to_imm8_gpr(ctx, expr17_0); - let expr19_0 = constructor_x64_shl(ctx, expr10_0, expr3_0, &expr18_0); - let expr20_0: Type = I64; - let expr21_0: u64 = 0i128 as u64; - let expr22_0 = constructor_imm(ctx, expr20_0, expr21_0); - let expr23_0 = C::gpr_new(ctx, expr22_0); - let expr24_0 = OperandSize::Size64; - let expr25_0: u32 = 127i128 as u32; - let expr26_0 = RegMemImm::Imm { simm32: expr25_0 }; - let expr27_0 = C::gpr_mem_imm_new(ctx, &expr26_0); - let expr28_0 = constructor_x64_test(ctx, &expr24_0, &expr27_0, pattern1_0); - let expr29_0: Type = I64; - let expr30_0 = CC::Z; - let expr31_0 = C::gpr_to_gpr_mem(ctx, expr23_0); - let expr32_0 = constructor_cmove(ctx, expr29_0, &expr30_0, &expr31_0, expr19_0); - let expr33_0 = constructor_with_flags_reg(ctx, &expr28_0, &expr32_0); - let expr34_0 = C::gpr_new(ctx, expr33_0); - let expr35_0: Type = I64; - let expr36_0 = C::gpr_to_gpr_mem_imm(ctx, expr6_0); - let expr37_0 = constructor_x64_or(ctx, expr35_0, expr34_0, &expr36_0); - let expr38_0 = OperandSize::Size64; - let expr39_0: u32 = 64i128 as u32; - let expr40_0 = RegMemImm::Imm { simm32: expr39_0 }; - let expr41_0 = C::gpr_mem_imm_new(ctx, &expr40_0); - let expr42_0 = constructor_x64_test(ctx, &expr38_0, &expr41_0, pattern1_0); - let expr43_0: Type = I64; - let expr44_0 = CC::Z; - let expr45_0 = C::gpr_to_gpr_mem(ctx, expr37_0); - let expr46_0 = constructor_cmove(ctx, expr43_0, &expr44_0, &expr45_0, expr9_0); - let expr47_0: Type = I64; - let expr48_0 = CC::Z; - let expr49_0 = C::gpr_to_gpr_mem(ctx, expr9_0); - let expr50_0 = constructor_cmove(ctx, expr47_0, &expr48_0, &expr49_0, expr23_0); - let expr51_0 = constructor_consumes_flags_concat(ctx, &expr46_0, &expr50_0); - let expr52_0 = constructor_with_flags(ctx, &expr42_0, &expr51_0); - return expr52_0; -} - -// Generated as internal constructor for term ushr_i8x16_mask. -pub fn constructor_ushr_i8x16_mask(ctx: &mut C, arg0: &RegMemImm) -> SyntheticAmode { - let pattern0_0 = arg0; - match pattern0_0 { - &RegMemImm::Imm { simm32: pattern1_0 } => { - // Rule at src/isa/x64/lower.isle line 572. - let expr0_0 = C::ushr_i8x16_mask_for_const(ctx, pattern1_0); - return expr0_0; - } - &RegMemImm::Reg { reg: pattern1_0 } => { - // Rule at src/isa/x64/lower.isle line 581. - let expr0_0 = C::ushr_i8x16_mask_table(ctx); - let expr1_0 = constructor_x64_lea(ctx, &expr0_0); - let expr2_0: Type = I64; - let expr3_0 = C::gpr_new(ctx, pattern1_0); - let expr4_0: u8 = 4i128 as u8; - let expr5_0 = C::imm8_to_imm8_gpr(ctx, expr4_0); - let expr6_0 = constructor_x64_shl(ctx, expr2_0, expr3_0, &expr5_0); - let expr7_0: u32 = 0i128 as u32; - let expr8_0: u8 = 0i128 as u8; - let expr9_0 = C::amode_imm_reg_reg_shift(ctx, expr7_0, expr1_0, expr6_0, expr8_0); - let expr10_0 = C::amode_to_synthetic_amode(ctx, &expr9_0); - return expr10_0; - } - &RegMemImm::Mem { - addr: ref pattern1_0, - } => { - // Rule at src/isa/x64/lower.isle line 592. - let expr0_0: Type = I64; - let expr1_0 = ExtKind::None; - let expr2_0 = constructor_x64_load(ctx, expr0_0, pattern1_0, &expr1_0); - let expr3_0 = RegMemImm::Reg { reg: expr2_0 }; - let expr4_0 = constructor_ushr_i8x16_mask(ctx, &expr3_0); - return expr4_0; - } - _ => {} - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "ushr_i8x16_mask", "src/isa/x64/lower.isle line 566" - ); -} - -// Generated as internal constructor for term sar_i128. -pub fn constructor_sar_i128(ctx: &mut C, arg0: ValueRegs, arg1: Gpr) -> ValueRegs { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/lower.isle line 620. - let expr0_0: usize = 0i128 as usize; - let expr1_0 = constructor_value_regs_get_gpr(ctx, pattern0_0, expr0_0); - let expr2_0: usize = 1i128 as usize; - let expr3_0 = constructor_value_regs_get_gpr(ctx, pattern0_0, expr2_0); - let expr4_0: Type = I64; - let expr5_0 = C::gpr_to_imm8_gpr(ctx, pattern1_0); - let expr6_0 = constructor_x64_shr(ctx, expr4_0, expr1_0, &expr5_0); - let expr7_0: Type = I64; - let expr8_0 = C::gpr_to_imm8_gpr(ctx, pattern1_0); - let expr9_0 = constructor_x64_sar(ctx, expr7_0, expr3_0, &expr8_0); - let expr10_0: Type = I64; - let expr11_0: Type = I64; - let expr12_0: Type = I64; - let expr13_0: u64 = 64i128 as u64; - let expr14_0 = constructor_imm(ctx, expr12_0, expr13_0); - let expr15_0 = C::gpr_new(ctx, expr14_0); - let expr16_0 = C::gpr_to_gpr_mem_imm(ctx, pattern1_0); - let expr17_0 = constructor_x64_sub(ctx, expr11_0, expr15_0, &expr16_0); - let expr18_0 = C::gpr_to_imm8_gpr(ctx, expr17_0); - let expr19_0 = constructor_x64_shl(ctx, expr10_0, expr3_0, &expr18_0); - let expr20_0 = OperandSize::Size64; - let expr21_0: u32 = 127i128 as u32; - let expr22_0 = RegMemImm::Imm { simm32: expr21_0 }; - let expr23_0 = C::gpr_mem_imm_new(ctx, &expr22_0); - let expr24_0 = constructor_x64_test(ctx, &expr20_0, &expr23_0, pattern1_0); - let expr25_0: Type = I64; - let expr26_0 = CC::Z; - let expr27_0: Type = I64; - let expr28_0: u64 = 0i128 as u64; - let expr29_0 = constructor_imm(ctx, expr27_0, expr28_0); - let expr30_0 = C::reg_to_gpr_mem(ctx, expr29_0); - let expr31_0 = constructor_cmove(ctx, expr25_0, &expr26_0, &expr30_0, expr19_0); - let expr32_0 = constructor_with_flags_reg(ctx, &expr24_0, &expr31_0); - let expr33_0 = C::gpr_new(ctx, expr32_0); - let expr34_0: Type = I64; - let expr35_0 = C::gpr_to_gpr_mem_imm(ctx, expr33_0); - let expr36_0 = constructor_x64_or(ctx, expr34_0, expr6_0, &expr35_0); - let expr37_0: Type = I64; - let expr38_0: u8 = 63i128 as u8; - let expr39_0 = C::imm8_to_imm8_gpr(ctx, expr38_0); - let expr40_0 = constructor_x64_sar(ctx, expr37_0, expr3_0, &expr39_0); - let expr41_0 = OperandSize::Size64; - let expr42_0: u32 = 64i128 as u32; - let expr43_0 = RegMemImm::Imm { simm32: expr42_0 }; - let expr44_0 = C::gpr_mem_imm_new(ctx, &expr43_0); - let expr45_0 = constructor_x64_test(ctx, &expr41_0, &expr44_0, pattern1_0); - let expr46_0: Type = I64; - let expr47_0 = CC::Z; - let expr48_0 = C::gpr_to_gpr_mem(ctx, expr36_0); - let expr49_0 = constructor_cmove(ctx, expr46_0, &expr47_0, &expr48_0, expr9_0); - let expr50_0: Type = I64; - let expr51_0 = CC::Z; - let expr52_0 = C::gpr_to_gpr_mem(ctx, expr9_0); - let expr53_0 = constructor_cmove(ctx, expr50_0, &expr51_0, &expr52_0, expr40_0); - let expr54_0 = constructor_consumes_flags_concat(ctx, &expr49_0, &expr53_0); - let expr55_0 = constructor_with_flags(ctx, &expr45_0, &expr54_0); - return expr55_0; -} - -// Generated as internal constructor for term sshr_i8x16_bigger_shift. -pub fn constructor_sshr_i8x16_bigger_shift( - ctx: &mut C, - arg0: Type, - arg1: &RegMemImm, -) -> XmmMemImm { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - match pattern1_0 { - &RegMemImm::Imm { simm32: pattern2_0 } => { - // Rule at src/isa/x64/lower.isle line 686. - let expr0_0: u32 = 8i128 as u32; - let expr1_0 = C::u32_add(ctx, pattern2_0, expr0_0); - let expr2_0 = RegMemImm::Imm { simm32: expr1_0 }; - let expr3_0 = C::xmm_mem_imm_new(ctx, &expr2_0); - return expr3_0; - } - &RegMemImm::Reg { reg: pattern2_0 } => { - // Rule at src/isa/x64/lower.isle line 688. - let expr0_0 = C::gpr_new(ctx, pattern2_0); - let expr1_0: u32 = 8i128 as u32; - let expr2_0 = RegMemImm::Imm { simm32: expr1_0 }; - let expr3_0 = C::gpr_mem_imm_new(ctx, &expr2_0); - let expr4_0 = constructor_x64_add(ctx, pattern0_0, expr0_0, &expr3_0); - let expr5_0 = C::gpr_to_reg(ctx, expr4_0); - let expr6_0 = RegMemImm::Reg { reg: expr5_0 }; - let expr7_0 = constructor_mov_rmi_to_xmm(ctx, &expr6_0); - return expr7_0; - } - &RegMemImm::Mem { - addr: ref pattern2_0, - } => { - // Rule at src/isa/x64/lower.isle line 692. - let expr0_0: u64 = 8i128 as u64; - let expr1_0 = constructor_imm(ctx, pattern0_0, expr0_0); - let expr2_0 = C::gpr_new(ctx, expr1_0); - let expr3_0 = C::gpr_mem_imm_new(ctx, pattern1_0); - let expr4_0 = constructor_x64_add(ctx, pattern0_0, expr2_0, &expr3_0); - let expr5_0 = C::gpr_to_reg(ctx, expr4_0); - let expr6_0 = RegMemImm::Reg { reg: expr5_0 }; - let expr7_0 = constructor_mov_rmi_to_xmm(ctx, &expr6_0); - return expr7_0; - } - _ => {} - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "sshr_i8x16_bigger_shift", "src/isa/x64/lower.isle line 685" - ); -} - -// Generated as internal constructor for term sse_and_not. -pub fn constructor_sse_and_not( - ctx: &mut C, - arg0: Type, - arg1: Xmm, - arg2: &XmmMem, -) -> Xmm { - let pattern0_0 = arg0; - if pattern0_0 == F32X4 { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - // Rule at src/isa/x64/lower.isle line 1091. - let expr0_0 = constructor_x64_andnps(ctx, pattern2_0, pattern3_0); - return expr0_0; - } - if pattern0_0 == F64X2 { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - // Rule at src/isa/x64/lower.isle line 1092. - let expr0_0 = constructor_x64_andnpd(ctx, pattern2_0, pattern3_0); - return expr0_0; - } - let pattern0_0 = arg0; - if let Some((pattern1_0, pattern1_1)) = C::multi_lane(ctx, pattern0_0) { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - // Rule at src/isa/x64/lower.isle line 1093. - let expr0_0 = constructor_x64_pandn(ctx, pattern2_0, pattern3_0); - return expr0_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "sse_and_not", "src/isa/x64/lower.isle line 1090" - ); -} - -// Generated as internal constructor for term lower_bmask. -pub fn constructor_lower_bmask( - ctx: &mut C, - arg0: Type, - arg1: Type, - arg2: ValueRegs, -) -> ValueRegs { - let pattern0_0 = arg0; - if pattern0_0 == I128 { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - // Rule at src/isa/x64/lower.isle line 1203. - let expr0_0: Type = I64; - let expr1_0 = constructor_lower_bmask(ctx, expr0_0, pattern2_0, pattern3_0); - let expr2_0: usize = 0i128 as usize; - let expr3_0 = constructor_value_regs_get_gpr(ctx, expr1_0, expr2_0); - let expr4_0 = C::gpr_to_reg(ctx, expr3_0); - let expr5_0 = C::gpr_to_reg(ctx, expr3_0); - let expr6_0 = C::value_regs(ctx, expr4_0, expr5_0); - return expr6_0; - } - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::fits_in_64(ctx, pattern0_0) { - let pattern2_0 = arg1; - if pattern2_0 == I128 { - let pattern4_0 = arg2; - // Rule at src/isa/x64/lower.isle line 1195. - let expr0_0: usize = 0i128 as usize; - let expr1_0 = constructor_value_regs_get_gpr(ctx, pattern4_0, expr0_0); - let expr2_0: usize = 1i128 as usize; - let expr3_0 = constructor_value_regs_get_gpr(ctx, pattern4_0, expr2_0); - let expr4_0: Type = I64; - let expr5_0 = C::gpr_to_gpr_mem_imm(ctx, expr3_0); - let expr6_0 = constructor_x64_or(ctx, expr4_0, expr1_0, &expr5_0); - let expr7_0: Type = I64; - let expr8_0 = C::gpr_to_reg(ctx, expr6_0); - let expr9_0 = C::value_reg(ctx, expr8_0); - let expr10_0 = constructor_lower_bmask(ctx, pattern1_0, expr7_0, expr9_0); - return expr10_0; - } - } - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::fits_in_64(ctx, pattern0_0) { - let pattern2_0 = arg1; - if let Some(pattern3_0) = C::fits_in_64(ctx, pattern2_0) { - let pattern4_0 = arg2; - // Rule at src/isa/x64/lower.isle line 1184. - let expr0_0: usize = 0i128 as usize; - let expr1_0 = constructor_value_regs_get_gpr(ctx, pattern4_0, expr0_0); - let expr2_0 = constructor_x64_neg_paired(ctx, pattern3_0, expr1_0); - let expr3_0 = C::gpr_to_gpr_mem_imm(ctx, expr1_0); - let expr4_0 = constructor_x64_sbb_paired(ctx, pattern1_0, expr1_0, &expr3_0); - let expr5_0 = constructor_with_flags(ctx, &expr2_0, &expr4_0); - let expr6_0: usize = 1i128 as usize; - let expr7_0 = C::value_regs_get(ctx, expr5_0, expr6_0); - let expr8_0 = C::value_reg(ctx, expr7_0); - return expr8_0; - } - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "lower_bmask", "src/isa/x64/lower.isle line 1172" - ); -} - -// Generated as internal constructor for term i128_not. -pub fn constructor_i128_not(ctx: &mut C, arg0: Value) -> ValueRegs { - let pattern0_0 = arg0; - // Rule at src/isa/x64/lower.isle line 1226. - let expr0_0 = C::put_in_regs(ctx, pattern0_0); - let expr1_0: usize = 0i128 as usize; - let expr2_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr1_0); - let expr3_0: usize = 1i128 as usize; - let expr4_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr3_0); - let expr5_0: Type = I64; - let expr6_0 = constructor_x64_not(ctx, expr5_0, expr2_0); - let expr7_0: Type = I64; - let expr8_0 = constructor_x64_not(ctx, expr7_0, expr4_0); - let expr9_0 = constructor_value_gprs(ctx, expr6_0, expr8_0); - return expr9_0; -} - -// Generated as internal constructor for term all_ones_or_all_zeros. -pub fn constructor_all_ones_or_all_zeros(ctx: &mut C, arg0: Value) -> Option { - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::def_inst(ctx, pattern0_0) { - let pattern2_0 = C::inst_data(ctx, pattern1_0); - match &pattern2_0 { - &InstructionData::UnaryConst { - opcode: ref pattern3_0, - constant_handle: pattern3_1, - } => { - if let &Opcode::Vconst = pattern3_0 { - if let Some(()) = C::vconst_all_ones_or_all_zeros(ctx, pattern3_1) { - // Rule at src/isa/x64/lower.isle line 1275. - let expr0_0: bool = true; - return Some(expr0_0); - } - } - } - &InstructionData::FloatCompare { - opcode: ref pattern3_0, - args: ref pattern3_1, - cond: ref pattern3_2, - } => { - if let &Opcode::Fcmp = pattern3_0 { - let (pattern5_0, pattern5_1) = C::unpack_value_array_2(ctx, pattern3_1); - let pattern6_0 = C::value_type(ctx, pattern0_0); - if let Some((pattern7_0, pattern7_1)) = C::multi_lane(ctx, pattern6_0) { - // Rule at src/isa/x64/lower.isle line 1274. - let expr0_0: bool = true; - return Some(expr0_0); - } - } - } - &InstructionData::IntCompare { - opcode: ref pattern3_0, - args: ref pattern3_1, - cond: ref pattern3_2, - } => { - if let &Opcode::Icmp = pattern3_0 { - let (pattern5_0, pattern5_1) = C::unpack_value_array_2(ctx, pattern3_1); - let pattern6_0 = C::value_type(ctx, pattern0_0); - if let Some((pattern7_0, pattern7_1)) = C::multi_lane(ctx, pattern6_0) { - // Rule at src/isa/x64/lower.isle line 1273. - let expr0_0: bool = true; - return Some(expr0_0); - } - } - } - _ => {} - } - } - return None; -} - -// Generated as internal constructor for term vec_insert_lane. -pub fn constructor_vec_insert_lane( - ctx: &mut C, - arg0: Type, - arg1: Xmm, - arg2: &RegMem, - arg3: u8, -) -> Xmm { - let pattern0_0 = arg0; - if pattern0_0 == F64X2 { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - if let &RegMem::Reg { reg: pattern4_0 } = pattern3_0 { - let pattern5_0 = arg3; - if pattern5_0 == 0i128 as u8 { - // Rule at src/isa/x64/lower.isle line 1340. - let expr0_0 = constructor_reg_to_xmm_mem(ctx, pattern4_0); - let expr1_0 = constructor_x64_movsd_regmove(ctx, pattern2_0, &expr0_0); - return expr1_0; - } - } - } - let pattern0_0 = arg0; - if pattern0_0 == I8X16 { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - let pattern4_0 = arg3; - // Rule at src/isa/x64/lower.isle line 1302. - let expr0_0 = C::reg_mem_to_gpr_mem(ctx, pattern3_0); - let expr1_0 = constructor_x64_pinsrb(ctx, pattern2_0, &expr0_0, pattern4_0); - return expr1_0; - } - if pattern0_0 == I16X8 { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - let pattern4_0 = arg3; - // Rule at src/isa/x64/lower.isle line 1306. - let expr0_0 = C::reg_mem_to_gpr_mem(ctx, pattern3_0); - let expr1_0 = constructor_x64_pinsrw(ctx, pattern2_0, &expr0_0, pattern4_0); - return expr1_0; - } - if pattern0_0 == I32X4 { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - let pattern4_0 = arg3; - // Rule at src/isa/x64/lower.isle line 1310. - let expr0_0 = C::reg_mem_to_gpr_mem(ctx, pattern3_0); - let expr1_0 = OperandSize::Size32; - let expr2_0 = constructor_x64_pinsrd(ctx, pattern2_0, &expr0_0, pattern4_0, &expr1_0); - return expr2_0; - } - if pattern0_0 == I64X2 { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - let pattern4_0 = arg3; - // Rule at src/isa/x64/lower.isle line 1314. - let expr0_0 = C::reg_mem_to_gpr_mem(ctx, pattern3_0); - let expr1_0 = OperandSize::Size64; - let expr2_0 = constructor_x64_pinsrd(ctx, pattern2_0, &expr0_0, pattern4_0, &expr1_0); - return expr2_0; - } - if pattern0_0 == F32X4 { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - let pattern4_0 = arg3; - // Rule at src/isa/x64/lower.isle line 1318. - let expr0_0 = C::reg_mem_to_xmm_mem(ctx, pattern3_0); - let expr1_0 = C::sse_insertps_lane_imm(ctx, pattern4_0); - let expr2_0 = constructor_x64_insertps(ctx, pattern2_0, &expr0_0, expr1_0); - return expr2_0; - } - if pattern0_0 == F64X2 { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - let pattern4_0 = arg3; - if pattern4_0 == 0i128 as u8 { - // Rule at src/isa/x64/lower.isle line 1342. - let expr0_0 = C::reg_mem_to_xmm_mem(ctx, pattern3_0); - let expr1_0 = constructor_x64_movsd_load(ctx, &expr0_0); - let expr2_0 = C::xmm_to_xmm_mem(ctx, expr1_0); - let expr3_0 = constructor_x64_movsd_regmove(ctx, pattern2_0, &expr2_0); - return expr3_0; - } - if pattern4_0 == 1i128 as u8 { - // Rule at src/isa/x64/lower.isle line 1350. - let expr0_0 = C::reg_mem_to_xmm_mem(ctx, pattern3_0); - let expr1_0 = constructor_x64_movlhps(ctx, pattern2_0, &expr0_0); - return expr1_0; - } - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "vec_insert_lane", "src/isa/x64/lower.isle line 1299" - ); -} - -// Generated as internal constructor for term cmp_and_choose. -pub fn constructor_cmp_and_choose( - ctx: &mut C, - arg0: Type, - arg1: &CC, - arg2: Value, - arg3: Value, -) -> ValueRegs { - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::fits_in_64(ctx, pattern0_0) { - let pattern2_0 = arg1; - let pattern3_0 = arg2; - let pattern4_0 = arg3; - // Rule at src/isa/x64/lower.isle line 1358. - let expr0_0 = C::raw_operand_size_of_type(ctx, pattern1_0); - let expr1_0 = C::put_in_reg(ctx, pattern3_0); - let expr2_0 = C::put_in_reg(ctx, pattern4_0); - let expr3_0 = constructor_reg_to_gpr_mem_imm(ctx, expr1_0); - let expr4_0 = C::gpr_new(ctx, expr2_0); - let expr5_0 = constructor_x64_cmp(ctx, &expr0_0, &expr3_0, expr4_0); - let expr6_0 = C::reg_to_gpr_mem(ctx, expr2_0); - let expr7_0 = C::gpr_new(ctx, expr1_0); - let expr8_0 = constructor_cmove(ctx, pattern1_0, pattern2_0, &expr6_0, expr7_0); - let expr9_0 = constructor_with_flags_reg(ctx, &expr5_0, &expr8_0); - let expr10_0 = C::value_reg(ctx, expr9_0); - return expr10_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "cmp_and_choose", "src/isa/x64/lower.isle line 1357" - ); -} - -// Generated as internal constructor for term do_clz. -pub fn constructor_do_clz(ctx: &mut C, arg0: Type, arg1: Type, arg2: Gpr) -> Gpr { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/x64/lower.isle line 1796. - let expr0_0: Type = I64; - let expr1_0: i64 = -1i128 as i64; - let expr2_0 = constructor_imm_i64(ctx, expr0_0, expr1_0); - let expr3_0 = C::gpr_new(ctx, expr2_0); - let expr4_0 = constructor_bsr_or_else(ctx, pattern0_0, pattern2_0, expr3_0); - let expr5_0 = C::gpr_to_reg(ctx, expr4_0); - let expr6_0 = C::ty_bits_u64(ctx, pattern1_0); - let expr7_0: u64 = 1i128 as u64; - let expr8_0 = C::u64_sub(ctx, expr6_0, expr7_0); - let expr9_0 = constructor_imm(ctx, pattern0_0, expr8_0); - let expr10_0 = C::gpr_new(ctx, expr9_0); - let expr11_0 = constructor_reg_to_gpr_mem_imm(ctx, expr5_0); - let expr12_0 = constructor_x64_sub(ctx, pattern0_0, expr10_0, &expr11_0); - return expr12_0; -} - -// Generated as internal constructor for term do_ctz. -pub fn constructor_do_ctz(ctx: &mut C, arg0: Type, arg1: Type, arg2: Gpr) -> Gpr { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/x64/lower.isle line 1839. - let expr0_0: Type = I64; - let expr1_0 = C::ty_bits_u64(ctx, pattern1_0); - let expr2_0 = constructor_imm(ctx, expr0_0, expr1_0); - let expr3_0 = C::gpr_new(ctx, expr2_0); - let expr4_0 = constructor_bsf_or_else(ctx, pattern0_0, pattern2_0, expr3_0); - return expr4_0; -} - -// Generated as internal constructor for term do_popcnt. -pub fn constructor_do_popcnt(ctx: &mut C, arg0: Type, arg1: Gpr) -> Gpr { - let pattern0_0 = arg0; - if pattern0_0 == I32 { - let pattern2_0 = arg1; - // Rule at src/isa/x64/lower.isle line 1930. - let expr0_0: Type = I32; - let expr1_0: u8 = 1i128 as u8; - let expr2_0 = Imm8Reg::Imm8 { imm: expr1_0 }; - let expr3_0 = C::imm8_reg_to_imm8_gpr(ctx, &expr2_0); - let expr4_0 = constructor_x64_shr(ctx, expr0_0, pattern2_0, &expr3_0); - let expr5_0: Type = I32; - let expr6_0: u64 = 2004318071i128 as u64; - let expr7_0 = constructor_imm(ctx, expr5_0, expr6_0); - let expr8_0 = C::gpr_new(ctx, expr7_0); - let expr9_0: Type = I32; - let expr10_0 = C::gpr_to_gpr_mem_imm(ctx, expr8_0); - let expr11_0 = constructor_x64_and(ctx, expr9_0, expr4_0, &expr10_0); - let expr12_0: Type = I32; - let expr13_0 = C::gpr_to_gpr_mem_imm(ctx, expr11_0); - let expr14_0 = constructor_x64_sub(ctx, expr12_0, pattern2_0, &expr13_0); - let expr15_0: Type = I32; - let expr16_0: u8 = 1i128 as u8; - let expr17_0 = Imm8Reg::Imm8 { imm: expr16_0 }; - let expr18_0 = C::imm8_reg_to_imm8_gpr(ctx, &expr17_0); - let expr19_0 = constructor_x64_shr(ctx, expr15_0, expr11_0, &expr18_0); - let expr20_0: Type = I32; - let expr21_0 = C::gpr_to_gpr_mem_imm(ctx, expr8_0); - let expr22_0 = constructor_x64_and(ctx, expr20_0, expr19_0, &expr21_0); - let expr23_0: Type = I32; - let expr24_0 = C::gpr_to_gpr_mem_imm(ctx, expr22_0); - let expr25_0 = constructor_x64_sub(ctx, expr23_0, expr14_0, &expr24_0); - let expr26_0: Type = I32; - let expr27_0: u8 = 1i128 as u8; - let expr28_0 = Imm8Reg::Imm8 { imm: expr27_0 }; - let expr29_0 = C::imm8_reg_to_imm8_gpr(ctx, &expr28_0); - let expr30_0 = constructor_x64_shr(ctx, expr26_0, expr22_0, &expr29_0); - let expr31_0: Type = I32; - let expr32_0 = C::gpr_to_gpr_mem_imm(ctx, expr8_0); - let expr33_0 = constructor_x64_and(ctx, expr31_0, expr30_0, &expr32_0); - let expr34_0: Type = I32; - let expr35_0 = C::gpr_to_gpr_mem_imm(ctx, expr33_0); - let expr36_0 = constructor_x64_sub(ctx, expr34_0, expr25_0, &expr35_0); - let expr37_0: Type = I32; - let expr38_0: Type = I32; - let expr39_0: u8 = 4i128 as u8; - let expr40_0 = Imm8Reg::Imm8 { imm: expr39_0 }; - let expr41_0 = C::imm8_reg_to_imm8_gpr(ctx, &expr40_0); - let expr42_0 = constructor_x64_shr(ctx, expr38_0, expr36_0, &expr41_0); - let expr43_0 = C::gpr_to_gpr_mem_imm(ctx, expr36_0); - let expr44_0 = constructor_x64_add(ctx, expr37_0, expr42_0, &expr43_0); - let expr45_0: Type = I32; - let expr46_0: u32 = 252645135i128 as u32; - let expr47_0 = RegMemImm::Imm { simm32: expr46_0 }; - let expr48_0 = C::gpr_mem_imm_new(ctx, &expr47_0); - let expr49_0 = constructor_x64_and(ctx, expr45_0, expr44_0, &expr48_0); - let expr50_0: Type = I32; - let expr51_0: u32 = 16843009i128 as u32; - let expr52_0 = RegMemImm::Imm { simm32: expr51_0 }; - let expr53_0 = C::gpr_mem_imm_new(ctx, &expr52_0); - let expr54_0 = constructor_x64_mul(ctx, expr50_0, expr49_0, &expr53_0); - let expr55_0: Type = I32; - let expr56_0: u8 = 24i128 as u8; - let expr57_0 = Imm8Reg::Imm8 { imm: expr56_0 }; - let expr58_0 = C::imm8_reg_to_imm8_gpr(ctx, &expr57_0); - let expr59_0 = constructor_x64_shr(ctx, expr55_0, expr54_0, &expr58_0); - return expr59_0; - } - if pattern0_0 == I64 { - let pattern2_0 = arg1; - // Rule at src/isa/x64/lower.isle line 1887. - let expr0_0: Type = I64; - let expr1_0: u8 = 1i128 as u8; - let expr2_0 = Imm8Reg::Imm8 { imm: expr1_0 }; - let expr3_0 = C::imm8_reg_to_imm8_gpr(ctx, &expr2_0); - let expr4_0 = constructor_x64_shr(ctx, expr0_0, pattern2_0, &expr3_0); - let expr5_0: Type = I64; - let expr6_0: u64 = 8608480567731124087i128 as u64; - let expr7_0 = constructor_imm(ctx, expr5_0, expr6_0); - let expr8_0 = C::gpr_new(ctx, expr7_0); - let expr9_0: Type = I64; - let expr10_0 = C::gpr_to_gpr_mem_imm(ctx, expr8_0); - let expr11_0 = constructor_x64_and(ctx, expr9_0, expr4_0, &expr10_0); - let expr12_0: Type = I64; - let expr13_0 = C::gpr_to_gpr_mem_imm(ctx, expr11_0); - let expr14_0 = constructor_x64_sub(ctx, expr12_0, pattern2_0, &expr13_0); - let expr15_0: Type = I64; - let expr16_0: u8 = 1i128 as u8; - let expr17_0 = Imm8Reg::Imm8 { imm: expr16_0 }; - let expr18_0 = C::imm8_reg_to_imm8_gpr(ctx, &expr17_0); - let expr19_0 = constructor_x64_shr(ctx, expr15_0, expr11_0, &expr18_0); - let expr20_0: Type = I64; - let expr21_0 = C::gpr_to_gpr_mem_imm(ctx, expr8_0); - let expr22_0 = constructor_x64_and(ctx, expr20_0, expr19_0, &expr21_0); - let expr23_0: Type = I64; - let expr24_0 = C::gpr_to_gpr_mem_imm(ctx, expr22_0); - let expr25_0 = constructor_x64_sub(ctx, expr23_0, expr14_0, &expr24_0); - let expr26_0: Type = I64; - let expr27_0: u8 = 1i128 as u8; - let expr28_0 = Imm8Reg::Imm8 { imm: expr27_0 }; - let expr29_0 = C::imm8_reg_to_imm8_gpr(ctx, &expr28_0); - let expr30_0 = constructor_x64_shr(ctx, expr26_0, expr22_0, &expr29_0); - let expr31_0: Type = I64; - let expr32_0 = C::gpr_to_gpr_mem_imm(ctx, expr8_0); - let expr33_0 = constructor_x64_and(ctx, expr31_0, expr30_0, &expr32_0); - let expr34_0: Type = I64; - let expr35_0 = C::gpr_to_gpr_mem_imm(ctx, expr33_0); - let expr36_0 = constructor_x64_sub(ctx, expr34_0, expr25_0, &expr35_0); - let expr37_0: Type = I64; - let expr38_0: Type = I64; - let expr39_0: u8 = 4i128 as u8; - let expr40_0 = Imm8Reg::Imm8 { imm: expr39_0 }; - let expr41_0 = C::imm8_reg_to_imm8_gpr(ctx, &expr40_0); - let expr42_0 = constructor_x64_shr(ctx, expr38_0, expr36_0, &expr41_0); - let expr43_0 = C::gpr_to_gpr_mem_imm(ctx, expr36_0); - let expr44_0 = constructor_x64_add(ctx, expr37_0, expr42_0, &expr43_0); - let expr45_0: Type = I64; - let expr46_0: u64 = 1085102592571150095i128 as u64; - let expr47_0 = constructor_imm(ctx, expr45_0, expr46_0); - let expr48_0 = C::gpr_new(ctx, expr47_0); - let expr49_0: Type = I64; - let expr50_0 = C::gpr_to_gpr_mem_imm(ctx, expr48_0); - let expr51_0 = constructor_x64_and(ctx, expr49_0, expr44_0, &expr50_0); - let expr52_0: Type = I64; - let expr53_0: u64 = 72340172838076673i128 as u64; - let expr54_0 = constructor_imm(ctx, expr52_0, expr53_0); - let expr55_0 = C::gpr_new(ctx, expr54_0); - let expr56_0: Type = I64; - let expr57_0 = C::gpr_to_gpr_mem_imm(ctx, expr55_0); - let expr58_0 = constructor_x64_mul(ctx, expr56_0, expr51_0, &expr57_0); - let expr59_0: Type = I64; - let expr60_0: u8 = 56i128 as u8; - let expr61_0 = Imm8Reg::Imm8 { imm: expr60_0 }; - let expr62_0 = C::imm8_reg_to_imm8_gpr(ctx, &expr61_0); - let expr63_0 = constructor_x64_shr(ctx, expr59_0, expr58_0, &expr62_0); - return expr63_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "do_popcnt", "src/isa/x64/lower.isle line 1886" - ); -} - -// Generated as internal constructor for term do_bitrev8. -pub fn constructor_do_bitrev8(ctx: &mut C, arg0: Type, arg1: Gpr) -> Gpr { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/lower.isle line 2019. - let expr0_0 = C::ty_mask(ctx, pattern0_0); - let expr1_0: u64 = 6148914691236517205i128 as u64; - let expr2_0 = C::u64_and(ctx, expr0_0, expr1_0); - let expr3_0 = constructor_imm(ctx, pattern0_0, expr2_0); - let expr4_0 = C::gpr_new(ctx, expr3_0); - let expr5_0 = C::gpr_to_gpr_mem_imm(ctx, expr4_0); - let expr6_0 = constructor_x64_and(ctx, pattern0_0, pattern1_0, &expr5_0); - let expr7_0: u8 = 1i128 as u8; - let expr8_0 = Imm8Reg::Imm8 { imm: expr7_0 }; - let expr9_0 = C::imm8_reg_to_imm8_gpr(ctx, &expr8_0); - let expr10_0 = constructor_x64_shr(ctx, pattern0_0, pattern1_0, &expr9_0); - let expr11_0 = C::gpr_to_gpr_mem_imm(ctx, expr4_0); - let expr12_0 = constructor_x64_and(ctx, pattern0_0, expr10_0, &expr11_0); - let expr13_0: u8 = 1i128 as u8; - let expr14_0 = Imm8Reg::Imm8 { imm: expr13_0 }; - let expr15_0 = C::imm8_reg_to_imm8_gpr(ctx, &expr14_0); - let expr16_0 = constructor_x64_shl(ctx, pattern0_0, expr6_0, &expr15_0); - let expr17_0 = C::gpr_to_gpr_mem_imm(ctx, expr12_0); - let expr18_0 = constructor_x64_or(ctx, pattern0_0, expr16_0, &expr17_0); - let expr19_0: u64 = 3689348814741910323i128 as u64; - let expr20_0 = C::u64_and(ctx, expr0_0, expr19_0); - let expr21_0 = constructor_imm(ctx, pattern0_0, expr20_0); - let expr22_0 = C::gpr_new(ctx, expr21_0); - let expr23_0 = C::gpr_to_gpr_mem_imm(ctx, expr22_0); - let expr24_0 = constructor_x64_and(ctx, pattern0_0, expr18_0, &expr23_0); - let expr25_0: u8 = 2i128 as u8; - let expr26_0 = Imm8Reg::Imm8 { imm: expr25_0 }; - let expr27_0 = C::imm8_reg_to_imm8_gpr(ctx, &expr26_0); - let expr28_0 = constructor_x64_shr(ctx, pattern0_0, expr18_0, &expr27_0); - let expr29_0 = C::gpr_to_gpr_mem_imm(ctx, expr22_0); - let expr30_0 = constructor_x64_and(ctx, pattern0_0, expr28_0, &expr29_0); - let expr31_0: u8 = 2i128 as u8; - let expr32_0 = Imm8Reg::Imm8 { imm: expr31_0 }; - let expr33_0 = C::imm8_reg_to_imm8_gpr(ctx, &expr32_0); - let expr34_0 = constructor_x64_shl(ctx, pattern0_0, expr24_0, &expr33_0); - let expr35_0 = C::gpr_to_gpr_mem_imm(ctx, expr30_0); - let expr36_0 = constructor_x64_or(ctx, pattern0_0, expr34_0, &expr35_0); - let expr37_0: u64 = 1085102592571150095i128 as u64; - let expr38_0 = C::u64_and(ctx, expr0_0, expr37_0); - let expr39_0 = constructor_imm(ctx, pattern0_0, expr38_0); - let expr40_0 = C::gpr_new(ctx, expr39_0); - let expr41_0 = C::gpr_to_gpr_mem_imm(ctx, expr40_0); - let expr42_0 = constructor_x64_and(ctx, pattern0_0, expr36_0, &expr41_0); - let expr43_0: u8 = 4i128 as u8; - let expr44_0 = Imm8Reg::Imm8 { imm: expr43_0 }; - let expr45_0 = C::imm8_reg_to_imm8_gpr(ctx, &expr44_0); - let expr46_0 = constructor_x64_shr(ctx, pattern0_0, expr36_0, &expr45_0); - let expr47_0 = C::gpr_to_gpr_mem_imm(ctx, expr40_0); - let expr48_0 = constructor_x64_and(ctx, pattern0_0, expr46_0, &expr47_0); - let expr49_0: u8 = 4i128 as u8; - let expr50_0 = Imm8Reg::Imm8 { imm: expr49_0 }; - let expr51_0 = C::imm8_reg_to_imm8_gpr(ctx, &expr50_0); - let expr52_0 = constructor_x64_shl(ctx, pattern0_0, expr42_0, &expr51_0); - let expr53_0 = C::gpr_to_gpr_mem_imm(ctx, expr48_0); - let expr54_0 = constructor_x64_or(ctx, pattern0_0, expr52_0, &expr53_0); - return expr54_0; -} - -// Generated as internal constructor for term do_bitrev16. -pub fn constructor_do_bitrev16(ctx: &mut C, arg0: Type, arg1: Gpr) -> Gpr { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/lower.isle line 2042. - let expr0_0 = constructor_do_bitrev8(ctx, pattern0_0, pattern1_0); - let expr1_0 = C::ty_mask(ctx, pattern0_0); - let expr2_0: u64 = 71777214294589695i128 as u64; - let expr3_0 = C::u64_and(ctx, expr1_0, expr2_0); - let expr4_0 = constructor_imm(ctx, pattern0_0, expr3_0); - let expr5_0 = C::gpr_new(ctx, expr4_0); - let expr6_0 = C::gpr_to_gpr_mem_imm(ctx, expr5_0); - let expr7_0 = constructor_x64_and(ctx, pattern0_0, expr0_0, &expr6_0); - let expr8_0: u8 = 8i128 as u8; - let expr9_0 = Imm8Reg::Imm8 { imm: expr8_0 }; - let expr10_0 = C::imm8_reg_to_imm8_gpr(ctx, &expr9_0); - let expr11_0 = constructor_x64_shr(ctx, pattern0_0, expr0_0, &expr10_0); - let expr12_0 = C::gpr_to_gpr_mem_imm(ctx, expr5_0); - let expr13_0 = constructor_x64_and(ctx, pattern0_0, expr11_0, &expr12_0); - let expr14_0: u8 = 8i128 as u8; - let expr15_0 = Imm8Reg::Imm8 { imm: expr14_0 }; - let expr16_0 = C::imm8_reg_to_imm8_gpr(ctx, &expr15_0); - let expr17_0 = constructor_x64_shl(ctx, pattern0_0, expr7_0, &expr16_0); - let expr18_0 = C::gpr_to_gpr_mem_imm(ctx, expr13_0); - let expr19_0 = constructor_x64_or(ctx, pattern0_0, expr17_0, &expr18_0); - return expr19_0; -} - -// Generated as internal constructor for term do_bitrev32. -pub fn constructor_do_bitrev32(ctx: &mut C, arg0: Type, arg1: Gpr) -> Gpr { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/lower.isle line 2054. - let expr0_0 = constructor_do_bitrev16(ctx, pattern0_0, pattern1_0); - let expr1_0 = C::ty_mask(ctx, pattern0_0); - let expr2_0: u64 = 281470681808895i128 as u64; - let expr3_0 = C::u64_and(ctx, expr1_0, expr2_0); - let expr4_0 = constructor_imm(ctx, pattern0_0, expr3_0); - let expr5_0 = C::gpr_new(ctx, expr4_0); - let expr6_0 = C::gpr_to_gpr_mem_imm(ctx, expr5_0); - let expr7_0 = constructor_x64_and(ctx, pattern0_0, expr0_0, &expr6_0); - let expr8_0: u8 = 16i128 as u8; - let expr9_0 = Imm8Reg::Imm8 { imm: expr8_0 }; - let expr10_0 = C::imm8_reg_to_imm8_gpr(ctx, &expr9_0); - let expr11_0 = constructor_x64_shr(ctx, pattern0_0, expr0_0, &expr10_0); - let expr12_0 = C::gpr_to_gpr_mem_imm(ctx, expr5_0); - let expr13_0 = constructor_x64_and(ctx, pattern0_0, expr11_0, &expr12_0); - let expr14_0: u8 = 16i128 as u8; - let expr15_0 = Imm8Reg::Imm8 { imm: expr14_0 }; - let expr16_0 = C::imm8_reg_to_imm8_gpr(ctx, &expr15_0); - let expr17_0 = constructor_x64_shl(ctx, pattern0_0, expr7_0, &expr16_0); - let expr18_0 = C::gpr_to_gpr_mem_imm(ctx, expr13_0); - let expr19_0 = constructor_x64_or(ctx, pattern0_0, expr17_0, &expr18_0); - return expr19_0; -} - -// Generated as internal constructor for term do_bitrev64. -pub fn constructor_do_bitrev64(ctx: &mut C, arg0: Type, arg1: Gpr) -> Gpr { - let pattern0_0 = arg0; - if pattern0_0 == I64 { - let pattern2_0 = arg1; - // Rule at src/isa/x64/lower.isle line 2066. - let expr0_0 = constructor_do_bitrev32(ctx, pattern0_0, pattern2_0); - let expr1_0: u64 = 4294967295i128 as u64; - let expr2_0 = constructor_imm(ctx, pattern0_0, expr1_0); - let expr3_0 = C::gpr_new(ctx, expr2_0); - let expr4_0 = C::gpr_to_gpr_mem_imm(ctx, expr3_0); - let expr5_0 = constructor_x64_and(ctx, pattern0_0, expr0_0, &expr4_0); - let expr6_0: u8 = 32i128 as u8; - let expr7_0 = Imm8Reg::Imm8 { imm: expr6_0 }; - let expr8_0 = C::imm8_reg_to_imm8_gpr(ctx, &expr7_0); - let expr9_0 = constructor_x64_shr(ctx, pattern0_0, expr0_0, &expr8_0); - let expr10_0: u8 = 32i128 as u8; - let expr11_0 = Imm8Reg::Imm8 { imm: expr10_0 }; - let expr12_0 = C::imm8_reg_to_imm8_gpr(ctx, &expr11_0); - let expr13_0 = constructor_x64_shl(ctx, pattern0_0, expr5_0, &expr12_0); - let expr14_0 = C::gpr_to_gpr_mem_imm(ctx, expr9_0); - let expr15_0 = constructor_x64_or(ctx, pattern0_0, expr13_0, &expr14_0); - return expr15_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "do_bitrev64", "src/isa/x64/lower.isle line 2065" - ); -} - -// Generated as internal constructor for term generic_sextend. -pub fn constructor_generic_sextend( - ctx: &mut C, - arg0: Value, - arg1: Type, - arg2: Type, -) -> InstOutput { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - if pattern2_0 == pattern1_0 { - // Rule at src/isa/x64/lower.isle line 2177. - let expr0_0 = constructor_output_value(ctx, pattern0_0); - return expr0_0; - } - let pattern0_0 = arg0; - let pattern1_0 = arg1; - if pattern1_0 == I64 { - let pattern3_0 = arg2; - if pattern3_0 == I128 { - // Rule at src/isa/x64/lower.isle line 2187. - let expr0_0 = C::put_in_reg(ctx, pattern0_0); - let expr1_0 = constructor_put_in_gpr(ctx, pattern0_0); - let expr2_0 = constructor_spread_sign_bit(ctx, expr1_0); - let expr3_0 = C::gpr_to_reg(ctx, expr2_0); - let expr4_0 = C::value_regs(ctx, expr0_0, expr3_0); - let expr5_0 = C::output(ctx, expr4_0); - return expr5_0; - } - } - let pattern0_0 = arg0; - let pattern1_0 = arg1; - if let Some(pattern2_0) = C::fits_in_32(ctx, pattern1_0) { - let pattern3_0 = arg2; - if pattern3_0 == I128 { - // Rule at src/isa/x64/lower.isle line 2191. - let expr0_0: Type = I64; - let expr1_0 = ExtendKind::Sign; - let expr2_0 = constructor_extend_to_gpr(ctx, pattern0_0, expr0_0, &expr1_0); - let expr3_0 = constructor_spread_sign_bit(ctx, expr2_0); - let expr4_0 = C::gpr_to_reg(ctx, expr2_0); - let expr5_0 = C::gpr_to_reg(ctx, expr3_0); - let expr6_0 = C::value_regs(ctx, expr4_0, expr5_0); - let expr7_0 = C::output(ctx, expr6_0); - return expr7_0; - } - } - let pattern0_0 = arg0; - let pattern1_0 = arg1; - if let Some(pattern2_0) = C::fits_in_32(ctx, pattern1_0) { - let pattern3_0 = arg2; - if pattern3_0 == I64 { - // Rule at src/isa/x64/lower.isle line 2197. - let expr0_0: Type = I64; - let expr1_0 = ExtendKind::Sign; - let expr2_0 = constructor_extend_to_gpr(ctx, pattern0_0, expr0_0, &expr1_0); - let expr3_0 = constructor_output_gpr(ctx, expr2_0); - return expr3_0; - } - } - let pattern0_0 = arg0; - let pattern1_0 = arg1; - if let Some(pattern2_0) = C::fits_in_32(ctx, pattern1_0) { - let pattern3_0 = arg2; - if let Some(pattern4_0) = C::fits_in_32(ctx, pattern3_0) { - // Rule at src/isa/x64/lower.isle line 2201. - let expr0_0: Type = I32; - let expr1_0 = ExtendKind::Sign; - let expr2_0 = constructor_extend_to_gpr(ctx, pattern0_0, expr0_0, &expr1_0); - let expr3_0 = constructor_output_gpr(ctx, expr2_0); - return expr3_0; - } - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "generic_sextend", "src/isa/x64/lower.isle line 2174" - ); -} - -// Generated as internal constructor for term spread_sign_bit. -pub fn constructor_spread_sign_bit(ctx: &mut C, arg0: Gpr) -> Gpr { - let pattern0_0 = arg0; - // Rule at src/isa/x64/lower.isle line 2183. - let expr0_0: Type = I64; - let expr1_0: u8 = 63i128 as u8; - let expr2_0 = Imm8Reg::Imm8 { imm: expr1_0 }; - let expr3_0 = C::imm8_reg_to_imm8_gpr(ctx, &expr2_0); - let expr4_0 = constructor_x64_sar(ctx, expr0_0, pattern0_0, &expr3_0); - return expr4_0; -} - -// Generated as internal constructor for term cmp_zero_i128. -pub fn constructor_cmp_zero_i128( - ctx: &mut C, - arg0: &CC, - arg1: ValueRegs, -) -> IcmpCondResult { - let pattern0_0 = arg0; - if let Some(pattern1_0) = C::cc_nz_or_z(ctx, pattern0_0) { - let pattern2_0 = arg1; - // Rule at src/isa/x64/lower.isle line 2923. - let expr0_0: usize = 0i128 as usize; - let expr1_0 = constructor_value_regs_get_gpr(ctx, pattern2_0, expr0_0); - let expr2_0: usize = 1i128 as usize; - let expr3_0 = constructor_value_regs_get_gpr(ctx, pattern2_0, expr2_0); - let expr4_0 = OperandSize::Size64; - let expr5_0: u32 = 0i128 as u32; - let expr6_0 = RegMemImm::Imm { simm32: expr5_0 }; - let expr7_0 = C::gpr_mem_imm_new(ctx, &expr6_0); - let expr8_0 = constructor_x64_cmp(ctx, &expr4_0, &expr7_0, expr1_0); - let expr9_0 = CC::Z; - let expr10_0 = constructor_x64_setcc(ctx, &expr9_0); - let expr11_0 = constructor_with_flags_reg(ctx, &expr8_0, &expr10_0); - let expr12_0 = C::gpr_new(ctx, expr11_0); - let expr13_0 = OperandSize::Size64; - let expr14_0: u32 = 0i128 as u32; - let expr15_0 = RegMemImm::Imm { simm32: expr14_0 }; - let expr16_0 = C::gpr_mem_imm_new(ctx, &expr15_0); - let expr17_0 = constructor_x64_cmp(ctx, &expr13_0, &expr16_0, expr3_0); - let expr18_0 = CC::Z; - let expr19_0 = constructor_x64_setcc(ctx, &expr18_0); - let expr20_0 = constructor_with_flags_reg(ctx, &expr17_0, &expr19_0); - let expr21_0 = C::gpr_new(ctx, expr20_0); - let expr22_0 = OperandSize::Size8; - let expr23_0 = C::gpr_to_gpr_mem_imm(ctx, expr12_0); - let expr24_0 = constructor_x64_test(ctx, &expr22_0, &expr23_0, expr21_0); - let expr25_0 = constructor_icmp_cond_result(ctx, &expr24_0, &pattern1_0); - return expr25_0; - } - return unreachable!( - "no rule matched for term {} at {}; should it be partial?", - "cmp_zero_i128", "src/isa/x64/lower.isle line 2922" - ); -} - -// Generated as internal constructor for term cmp_zero_int_bool_ref. -pub fn constructor_cmp_zero_int_bool_ref(ctx: &mut C, arg0: Value) -> ProducesFlags { - let pattern0_0 = arg0; - let pattern1_0 = C::value_type(ctx, pattern0_0); - // Rule at src/isa/x64/lower.isle line 2934. - let expr0_0 = C::raw_operand_size_of_type(ctx, pattern1_0); - let expr1_0 = constructor_put_in_gpr(ctx, pattern0_0); - let expr2_0 = C::gpr_to_gpr_mem_imm(ctx, expr1_0); - let expr3_0 = constructor_x64_test(ctx, &expr0_0, &expr2_0, expr1_0); - return expr3_0; -} - -// Generated as internal constructor for term lower_splat_32x4. -pub fn constructor_lower_splat_32x4(ctx: &mut C, arg0: Type, arg1: Value) -> Xmm { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/lower.isle line 3632. - let expr0_0 = C::put_in_reg_mem(ctx, pattern1_0); - let expr1_0 = constructor_xmm_uninit_value(ctx); - let expr2_0: u8 = 0i128 as u8; - let expr3_0 = constructor_vec_insert_lane(ctx, pattern0_0, expr1_0, &expr0_0, expr2_0); - let expr4_0 = C::xmm_to_xmm_mem(ctx, expr3_0); - let expr5_0: u8 = 0i128 as u8; - let expr6_0 = OperandSize::Size32; - let expr7_0 = constructor_x64_pshufd(ctx, &expr4_0, expr5_0, &expr6_0); - return expr7_0; -} - -// Generated as internal constructor for term lower_splat_64x2. -pub fn constructor_lower_splat_64x2(ctx: &mut C, arg0: Type, arg1: Value) -> Xmm { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - // Rule at src/isa/x64/lower.isle line 3645. - let expr0_0 = C::put_in_reg(ctx, pattern1_0); - let expr1_0 = RegMem::Reg { reg: expr0_0 }; - let expr2_0 = constructor_xmm_uninit_value(ctx); - let expr3_0: u8 = 0i128 as u8; - let expr4_0 = constructor_vec_insert_lane(ctx, pattern0_0, expr2_0, &expr1_0, expr3_0); - let expr5_0: u8 = 1i128 as u8; - let expr6_0 = constructor_vec_insert_lane(ctx, pattern0_0, expr4_0, &expr1_0, expr5_0); - return expr6_0; -} diff --git a/cranelift/codegen/src/clif_lower.isle b/cranelift/codegen/src/clif_lower.isle index 419446a9d48e..0ab19ef4a474 100644 --- a/cranelift/codegen/src/clif_lower.isle +++ b/cranelift/codegen/src/clif_lower.isle @@ -695,7 +695,7 @@ ) ;;@ (spec (sig (args arg) (ret)) - ;;@ (assertions (= (zero_ext (widthof (arg)) (ret)) (arg)))) +;;@ (assertions (= (zero_ext (widthof (arg)) (ret)) (arg)))) (decl iconst (Imm64) Inst) (extractor (iconst N) @@ -1073,12 +1073,18 @@ (inst_data (InstructionData.Binary (Opcode.Ishl) (value_array_2 x y))) ) +;;@ (spec (sig (args a, b) (ret)) +;;@ (assertions (<= (bv2int (b)) (widthof (a))), +;;@ (= (ret) (shr (a) (b))))) (decl ushr (Value Value) Inst) (extractor (ushr x y) (inst_data (InstructionData.Binary (Opcode.Ushr) (value_array_2 x y))) ) +;;@ (spec (sig (args a, b) (ret)) +;;@ (assertions (<= (bv2int (b)) (widthof (a))), +;;@ (= (ret) (ashr (a) (b))))) (decl sshr (Value Value) Inst) (extractor (sshr x y) diff --git a/cranelift/isle/veri/veri_annotation/tests/parser_test.rs b/cranelift/isle/veri/veri_annotation/tests/parser_test.rs index aeff813b0fbe..8c34269db67e 100644 --- a/cranelift/isle/veri/veri_annotation/tests/parser_test.rs +++ b/cranelift/isle/veri/veri_annotation/tests/parser_test.rs @@ -99,6 +99,14 @@ fn test_expr() { assert!(parser::ExprParser::new() .parse("(if (a) {(+ (b) (c))} else {(d)})") .is_ok()); + + // nested conditionals + assert!(parser::ExprParser::new() + .parse("(if (a) {(+ (if (x) {(+ (b) (c))} else {(d)}) (c))} else {(d)})") + .is_ok()); + assert!(parser::ExprParser::new() + .parse("(if (<= (t) (32i8: isleType)) {(32i8: isleType)} else {(64i8: isleType)})") + .is_ok()); } #[test] diff --git a/cranelift/isle/veri/veri_engine/examples/broken/shifts/broken_do_shift_32.isle b/cranelift/isle/veri/veri_engine/examples/broken/shifts/broken_do_shift_32.isle new file mode 100644 index 000000000000..b9ab09d31120 --- /dev/null +++ b/cranelift/isle/veri/veri_engine/examples/broken/shifts/broken_do_shift_32.isle @@ -0,0 +1,104 @@ +;; Instruction formats. +(type MInst + (enum +)) + +;;@ (spec (sig (args) (ret)) +;;@ (assertions (= (0i64:bv) (ret)))) +;;decl ALUOp.Lsl + +;;@ (spec (sig (args) (ret)) +;;@ (assertions (= (1i64:bv) (ret)))) +;;decl ALUOp.Lsr + +;;@ (spec (sig (args) (ret)) +;;@ (assertions (= (2i64:bv) (ret)))) +;;decl ALUOp.Asr + +;; An ALU operation. This can be paired with several instruction formats +;; below (see `Inst`) in any combination. +(type ALUOp + (enum + (Add) + (Sub) + (Orr) + (OrrNot) + (And) + (AndS) + (AndNot) + ;; XOR (AArch64 calls this "EOR") + (Eor) + ;; XNOR (AArch64 calls this "EOR-NOT") + (EorNot) + ;; Add, setting flags + (AddS) + ;; Sub, setting flags + (SubS) + ;; Signed multiply, high-word result + (SMulH) + ;; Unsigned multiply, high-word result + (UMulH) + (SDiv) + (UDiv) + (RotR) + (Lsr) + (Asr) + (Lsl) + ;; Add with carry + (Adc) + ;; Add with carry, settings flags + (AdcS) + ;; Subtract with carry + (Sbc) + ;; Subtract with carry, settings flags + (SbcS) +)) + +;; BROKEN: no restriction on op in annotation +;;@ (spec (sig (args op, t, a, b) (ret)) +;;@ (assertions (if (= (op) (0i64:bv)) { +;;@ (= (ret) (shl (conv_to (t) (a)) (b))) +;;@ } else { +;;@ (if (= (op) (1i64:bv)) { +;;@ (= (ret) (shr (conv_to (t) (a)) (b))) +;;@ } else { +;;@ (if (= (op) (2i64:bv)) { +;;@ (= (ret) (ashr (conv_to (t) (a)) (b))) +;;@ } else { +;;@ (= (ret) (64i64:bv)) +;;@ }) +;;@ }) +;;@ }), +;;@ (|| (= (t) (1i8: isleType)) +;;@ (|| (= (t) (8i8: isleType)) +;;@ (|| (= (t) (16i8: isleType)) +;;@ (|| (= (t) (32i8: isleType)) +;;@ (= (t) (64i8: isleType)))))) +;;@ )) +(decl do_shift (ALUOp Type Reg Value) Reg) + +;; BROKEN: no restriction on op in annotation +;;@ (spec (sig (args op, t, a, b) (ret)) +;;@ (assertions (if (= (op) (0i64:bv)) { +;;@ (= (ret) (shl (conv_to (if (<= (t) (32i8: isleType)) {(32i8: isleType)} else {(64i8: isleType)}) (a)) (b))) +;;@ } else { +;;@ (if (= (op) (1i64:bv)) { +;;@ (= (ret) (shr (conv_to (if (<= (t) (32i8: isleType)) {(32i8: isleType)} else {(64i8: isleType)}) (a)) (b))) +;;@ } else { +;;@ (if (= (op) (2i64:bv)) { +;;@ (= (ret) (ashr (conv_to (if (<= (t) (32i8: isleType)) {(32i8: isleType)} else {(64i8: isleType)}) (a)) (b))) +;;@ } else { +;;@ (= (ret) (0i64:bv)) +;;@ }) +;;@ }) +;;@ }), +;;@ (|| (= (t) (1i8: isleType)) +;;@ (|| (= (t) (8i8: isleType)) +;;@ (|| (= (t) (16i8: isleType)) +;;@ (|| (= (t) (32i8: isleType)) +;;@ (= (t) (64i8: isleType)))))) +;;@ )) +(decl alu_rrr (ALUOp Type Reg Reg) Reg) +(extern constructor alu_rrr alu_rrr) + +(rule (do_shift op $I32 x y) (alu_rrr op $I32 x (value_regs_get y 0))) diff --git a/cranelift/isle/veri/veri_engine/examples/broken/shifts/broken_ishl_to_do_shift_64.isle b/cranelift/isle/veri/veri_engine/examples/broken/shifts/broken_ishl_to_do_shift_64.isle new file mode 100644 index 000000000000..6d77a620a6fa --- /dev/null +++ b/cranelift/isle/veri/veri_engine/examples/broken/shifts/broken_ishl_to_do_shift_64.isle @@ -0,0 +1,88 @@ +;;@ (spec (sig (args arg) (ret)) +;;@ (assertions (= (arg) (ret)))) +(decl lower (Inst) InstOutput) + +;; Instruction formats. +(type MInst + (enum +)) + +;;@ (spec (sig (args) (ret)) +;;@ (assertions (= (0i64:bv) (ret)))) +;;decl ALUOp.Lsl + +;;@ (spec (sig (args) (ret)) +;;@ (assertions (= (1i64:bv) (ret)))) +;;decl ALUOp.Lsr + +;;@ (spec (sig (args) (ret)) +;;@ (assertions (= (2i64:bv) (ret)))) +;;decl ALUOp.Asr + +;; An ALU operation. This can be paired with several instruction formats +;; below (see `Inst`) in any combination. +(type ALUOp + (enum + (Add) + (Sub) + (Orr) + (OrrNot) + (And) + (AndS) + (AndNot) + ;; XOR (AArch64 calls this "EOR") + (Eor) + ;; XNOR (AArch64 calls this "EOR-NOT") + (EorNot) + ;; Add, setting flags + (AddS) + ;; Sub, setting flags + (SubS) + ;; Signed multiply, high-word result + (SMulH) + ;; Unsigned multiply, high-word result + (UMulH) + (SDiv) + (UDiv) + (RotR) + (Lsr) + (Asr) + (Lsl) + ;; Add with carry + (Adc) + ;; Add with carry, settings flags + (AdcS) + ;; Subtract with carry + (Sbc) + ;; Subtract with carry, settings flags + (SbcS) +)) + +;;@ (spec (sig (args op, t, a, b) (ret)) +;;@ (assertions (if (= (op) (0i64:bv)) { +;;@ (= (ret) (shl (conv_to (t) (a)) (b))) +;;@ } else { +;;@ (if (= (op) (1i64:bv)) { +;;@ (= (ret) (shr (conv_to (t) (a)) (b))) +;;@ } else { +;;@ (if (= (op) (2i64:bv)) { +;;@ (= (ret) (ashr (conv_to (t) (a)) (b))) +;;@ } else { +;;@ (= (ret) (64i64:bv)) +;;@ }) +;;@ }) +;;@ }), +;;@ (|| (= (op) (0i64:bv)) (|| (= (op) (1i64:bv)) (= (op) (2i64:bv)))), +;;@ (|| (= (t) (1i8: isleType)) +;;@ (|| (= (t) (8i8: isleType)) +;;@ (|| (= (t) (16i8: isleType)) +;;@ (|| (= (t) (32i8: isleType)) +;;@ (= (t) (64i8: isleType)))))) +;;@ )) +(decl do_shift (ALUOp Type Reg Value) Reg) +(extern constructor do_shift do_shift) + +;; BROKEN: Asr instead of Lsl +;; Shift for i64. +(rule (lower (has_type $I64 (ishl x y))) + (do_shift (ALUOp.Asr) $I64 x y)) \ No newline at end of file diff --git a/cranelift/isle/veri/veri_engine/examples/broken/shifts/broken_sshr_to_do_shift_fits_in_32.isle b/cranelift/isle/veri/veri_engine/examples/broken/shifts/broken_sshr_to_do_shift_fits_in_32.isle new file mode 100644 index 000000000000..ef5f5ee77fda --- /dev/null +++ b/cranelift/isle/veri/veri_engine/examples/broken/shifts/broken_sshr_to_do_shift_fits_in_32.isle @@ -0,0 +1,98 @@ +;;@ (spec (sig (args arg) (ret)) +;;@ (assertions (= (arg) (ret)))) +(decl lower (Inst) InstOutput) + +;; Instruction formats. +(type MInst + (enum +)) + +;;@ (spec (sig (args) (ret)) +;;@ (assertions (= (0i64:bv) (ret)))) +;;decl ALUOp.Lsl + +;;@ (spec (sig (args) (ret)) +;;@ (assertions (= (1i64:bv) (ret)))) +;;decl ALUOp.Lsr + +;;@ (spec (sig (args) (ret)) +;;@ (assertions (= (2i64:bv) (ret)))) +;;decl ALUOp.Asr + +;; An ALU operation. This can be paired with several instruction formats +;; below (see `Inst`) in any combination. +(type ALUOp + (enum + (Add) + (Sub) + (Orr) + (OrrNot) + (And) + (AndS) + (AndNot) + ;; XOR (AArch64 calls this "EOR") + (Eor) + ;; XNOR (AArch64 calls this "EOR-NOT") + (EorNot) + ;; Add, setting flags + (AddS) + ;; Sub, setting flags + (SubS) + ;; Signed multiply, high-word result + (SMulH) + ;; Unsigned multiply, high-word result + (UMulH) + (SDiv) + (UDiv) + (RotR) + (Lsr) + (Asr) + (Lsl) + ;; Add with carry + (Adc) + ;; Add with carry, settings flags + (AdcS) + ;; Subtract with carry + (Sbc) + ;; Subtract with carry, settings flags + (SbcS) +)) + +;;@ (spec (sig (args op, t, a, b) (ret)) +;;@ (assertions (if (= (op) (0i64:bv)) { +;;@ (= (ret) (shl (conv_to (t) (a)) (b))) +;;@ } else { +;;@ (if (= (op) (1i64:bv)) { +;;@ (= (ret) (shr (conv_to (t) (a)) (b))) +;;@ } else { +;;@ (if (= (op) (2i64:bv)) { +;;@ (= (ret) (ashr (conv_to (t) (a)) (b))) +;;@ } else { +;;@ (= (ret) (64i64:bv)) +;;@ }) +;;@ }) +;;@ }), +;;@ (|| (= (op) (0i64:bv)) (|| (= (op) (1i64:bv)) (= (op) (2i64:bv)))), +;;@ (|| (= (t) (1i8: isleType)) +;;@ (|| (= (t) (8i8: isleType)) +;;@ (|| (= (t) (16i8: isleType)) +;;@ (|| (= (t) (32i8: isleType)) +;;@ (= (t) (64i8: isleType)))))) +;;@ )) +(decl do_shift (ALUOp Type Reg Value) Reg) +(extern constructor do_shift do_shift) + +;;@ (spec (sig (args x) (ret)) +;;@ (assertions (= (sign_ext (32) (x)) (ret)))) +(decl put_in_reg_sext32 (Value) Reg) +(extern constructor put_in_reg_sext32 put_in_reg_sext32) + +;;@ (spec (sig (args x) (ret)) +;;@ (assertions (= (zero_ext (32) (x)) (ret)))) +(decl put_in_reg_zext32 (Value) Reg) +(extern constructor put_in_reg_zext32 put_in_reg_zext32) + +;; BROKEN: zext32 instead of sext32 +;; Shift for i64. +(rule -2 (lower (has_type (fits_in_32 ty) (sshr x y))) + (do_shift (ALUOp.Asr) ty (put_in_reg_zext32 x) y)) \ No newline at end of file diff --git a/cranelift/isle/veri/veri_engine/examples/broken/shifts/broken_ushr_to_do_shift_fits_in_32.isle b/cranelift/isle/veri/veri_engine/examples/broken/shifts/broken_ushr_to_do_shift_fits_in_32.isle new file mode 100644 index 000000000000..e3be1c55331b --- /dev/null +++ b/cranelift/isle/veri/veri_engine/examples/broken/shifts/broken_ushr_to_do_shift_fits_in_32.isle @@ -0,0 +1,98 @@ +;;@ (spec (sig (args arg) (ret)) +;;@ (assertions (= (arg) (ret)))) +(decl lower (Inst) InstOutput) + +;; Instruction formats. +(type MInst + (enum +)) + +;;@ (spec (sig (args) (ret)) +;;@ (assertions (= (0i64:bv) (ret)))) +;;decl ALUOp.Lsl + +;;@ (spec (sig (args) (ret)) +;;@ (assertions (= (1i64:bv) (ret)))) +;;decl ALUOp.Lsr + +;;@ (spec (sig (args) (ret)) +;;@ (assertions (= (2i64:bv) (ret)))) +;;decl ALUOp.Asr + +;; An ALU operation. This can be paired with several instruction formats +;; below (see `Inst`) in any combination. +(type ALUOp + (enum + (Add) + (Sub) + (Orr) + (OrrNot) + (And) + (AndS) + (AndNot) + ;; XOR (AArch64 calls this "EOR") + (Eor) + ;; XNOR (AArch64 calls this "EOR-NOT") + (EorNot) + ;; Add, setting flags + (AddS) + ;; Sub, setting flags + (SubS) + ;; Signed multiply, high-word result + (SMulH) + ;; Unsigned multiply, high-word result + (UMulH) + (SDiv) + (UDiv) + (RotR) + (Lsr) + (Asr) + (Lsl) + ;; Add with carry + (Adc) + ;; Add with carry, settings flags + (AdcS) + ;; Subtract with carry + (Sbc) + ;; Subtract with carry, settings flags + (SbcS) +)) + +;;@ (spec (sig (args op, t, a, b) (ret)) +;;@ (assertions (if (= (op) (0i64:bv)) { +;;@ (= (ret) (shl (conv_to (t) (a)) (b))) +;;@ } else { +;;@ (if (= (op) (1i64:bv)) { +;;@ (= (ret) (shr (conv_to (t) (a)) (b))) +;;@ } else { +;;@ (if (= (op) (2i64:bv)) { +;;@ (= (ret) (ashr (conv_to (t) (a)) (b))) +;;@ } else { +;;@ (= (ret) (64i64:bv)) +;;@ }) +;;@ }) +;;@ }), +;;@ (|| (= (op) (0i64:bv)) (|| (= (op) (1i64:bv)) (= (op) (2i64:bv)))), +;;@ (|| (= (t) (1i8: isleType)) +;;@ (|| (= (t) (8i8: isleType)) +;;@ (|| (= (t) (16i8: isleType)) +;;@ (|| (= (t) (32i8: isleType)) +;;@ (= (t) (64i8: isleType)))))) +;;@ )) +(decl do_shift (ALUOp Type Reg Value) Reg) +(extern constructor do_shift do_shift) + +;;@ (spec (sig (args x) (ret)) +;;@ (assertions (= (zero_ext (32) (x)) (ret)))) +(decl put_in_reg_zext32 (Value) Reg) +(extern constructor put_in_reg_zext32 put_in_reg_zext32) + +;;@ (spec (sig (args x) (ret)) +;;@ (assertions (= (sign_ext (32) (x)) (ret)))) +(decl put_in_reg_sext32 (Value) Reg) +(extern constructor put_in_reg_sext32 put_in_reg_sext32) + +;; BROKEN: sext32 instead of zext32 +;; Shift for i8/i16/i32. +(rule -1 (lower (has_type (fits_in_32 ty) (ushr x y))) + (do_shift (ALUOp.Lsr) ty (put_in_reg_sext32 x) y)) \ No newline at end of file diff --git a/cranelift/isle/veri/veri_engine/examples/shifts/do_shift_32.isle b/cranelift/isle/veri/veri_engine/examples/shifts/do_shift_32.isle new file mode 100644 index 000000000000..3f4c79230db2 --- /dev/null +++ b/cranelift/isle/veri/veri_engine/examples/shifts/do_shift_32.isle @@ -0,0 +1,104 @@ +;; Instruction formats. +(type MInst + (enum +)) + +;;@ (spec (sig (args) (ret)) +;;@ (assertions (= (0i64:bv) (ret)))) +;;decl ALUOp.Lsl + +;;@ (spec (sig (args) (ret)) +;;@ (assertions (= (1i64:bv) (ret)))) +;;decl ALUOp.Lsr + +;;@ (spec (sig (args) (ret)) +;;@ (assertions (= (2i64:bv) (ret)))) +;;decl ALUOp.Asr + +;; An ALU operation. This can be paired with several instruction formats +;; below (see `Inst`) in any combination. +(type ALUOp + (enum + (Add) + (Sub) + (Orr) + (OrrNot) + (And) + (AndS) + (AndNot) + ;; XOR (AArch64 calls this "EOR") + (Eor) + ;; XNOR (AArch64 calls this "EOR-NOT") + (EorNot) + ;; Add, setting flags + (AddS) + ;; Sub, setting flags + (SubS) + ;; Signed multiply, high-word result + (SMulH) + ;; Unsigned multiply, high-word result + (UMulH) + (SDiv) + (UDiv) + (RotR) + (Lsr) + (Asr) + (Lsl) + ;; Add with carry + (Adc) + ;; Add with carry, settings flags + (AdcS) + ;; Subtract with carry + (Sbc) + ;; Subtract with carry, settings flags + (SbcS) +)) + +;;@ (spec (sig (args op, t, a, b) (ret)) +;;@ (assertions (= (ret) (conv_to (t) (if (= (op) (0i64:bv)) { +;;@ (shl (a) (b)) +;;@ } else { +;;@ (if (= (op) (1i64:bv)) { +;;@ (shr (a) (b)) +;;@ } else { +;;@ (if (= (op) (2i64:bv)) { +;;@ (ashr (a) (b)) +;;@ } else { +;;@ (64i64:bv) +;;@ }) +;;@ }) +;;@ }))), +;;@ (|| (= (op) (0i64:bv)) (|| (= (op) (1i64:bv)) (= (op) (2i64:bv)))), +;;@ (|| (= (t) (1i8: isleType)) +;;@ (|| (= (t) (8i8: isleType)) +;;@ (|| (= (t) (16i8: isleType)) +;;@ (|| (= (t) (32i8: isleType)) +;;@ (= (t) (64i8: isleType)))))) +;;@ )) +(decl do_shift (ALUOp Type Reg Value) Reg) + +;;@ (spec (sig (args op, t, a, b) (ret)) +;;@ (assertions (if (= (op) (0i64:bv)) { +;;@ (= (ret) (shl (conv_to (if (<= (t) (32i8: isleType)) {(32i8: isleType)} else {(64i8: isleType)}) (a)) (b))) +;;@ } else { +;;@ (if (= (op) (1i64:bv)) { +;;@ (= (ret) (shr (conv_to (if (<= (t) (32i8: isleType)) {(32i8: isleType)} else {(64i8: isleType)}) (a)) (b))) +;;@ } else { +;;@ (if (= (op) (2i64:bv)) { +;;@ (= (ret) (ashr (conv_to (if (<= (t) (32i8: isleType)) {(32i8: isleType)} else {(64i8: isleType)}) (a)) (b))) +;;@ } else { +;;@ (= (ret) (0i64:bv)) +;;@ }) +;;@ }) +;;@ }), +;;@ (|| (= (op) (0i64:bv)) (|| (= (op) (1i64:bv)) (= (op) (2i64:bv)))), +;;@ (|| (= (t) (1i8: isleType)) +;;@ (|| (= (t) (8i8: isleType)) +;;@ (|| (= (t) (16i8: isleType)) +;;@ (|| (= (t) (32i8: isleType)) +;;@ (= (t) (64i8: isleType)))))) +;;@ )) +(decl alu_rrr (ALUOp Type Reg Reg) Reg) +(extern constructor alu_rrr alu_rrr) + +(rule (do_shift op $I32 x y) (alu_rrr op $I32 x (value_regs_get y 0))) diff --git a/cranelift/isle/veri/veri_engine/examples/shifts/do_shift_64.isle b/cranelift/isle/veri/veri_engine/examples/shifts/do_shift_64.isle new file mode 100644 index 000000000000..81853ff8e0a7 --- /dev/null +++ b/cranelift/isle/veri/veri_engine/examples/shifts/do_shift_64.isle @@ -0,0 +1,105 @@ +;; Instruction formats. +(type MInst + (enum +)) + +;;@ (spec (sig (args) (ret)) +;;@ (assertions (= (0i64:bv) (ret)))) +;;decl ALUOp.Lsl + +;;@ (spec (sig (args) (ret)) +;;@ (assertions (= (1i64:bv) (ret)))) +;;decl ALUOp.Lsr + +;;@ (spec (sig (args) (ret)) +;;@ (assertions (= (2i64:bv) (ret)))) +;;decl ALUOp.Asr + +;; An ALU operation. This can be paired with several instruction formats +;; below (see `Inst`) in any combination. +(type ALUOp + (enum + (Add) + (Sub) + (Orr) + (OrrNot) + (And) + (AndS) + (AndNot) + ;; XOR (AArch64 calls this "EOR") + (Eor) + ;; XNOR (AArch64 calls this "EOR-NOT") + (EorNot) + ;; Add, setting flags + (AddS) + ;; Sub, setting flags + (SubS) + ;; Signed multiply, high-word result + (SMulH) + ;; Unsigned multiply, high-word result + (UMulH) + (SDiv) + (UDiv) + (RotR) + (Lsr) + (Asr) + (Lsl) + ;; Add with carry + (Adc) + ;; Add with carry, settings flags + (AdcS) + ;; Subtract with carry + (Sbc) + ;; Subtract with carry, settings flags + (SbcS) +)) + +;;@ (spec (sig (args op, t, a, b) (ret)) +;;@ (assertions (= (ret) (conv_to (t) (if (= (op) (0i64:bv)) { +;;@ (shl (a) (b)) +;;@ } else { +;;@ (if (= (op) (1i64:bv)) { +;;@ (shr (a) (b)) +;;@ } else { +;;@ (if (= (op) (2i64:bv)) { +;;@ (ashr (a) (b)) +;;@ } else { +;;@ (64i64:bv) +;;@ }) +;;@ }) +;;@ }))), +;;@ (|| (= (op) (0i64:bv)) (|| (= (op) (1i64:bv)) (= (op) (2i64:bv)))), +;;@ (|| (= (t) (1i8: isleType)) +;;@ (|| (= (t) (8i8: isleType)) +;;@ (|| (= (t) (16i8: isleType)) +;;@ (|| (= (t) (32i8: isleType)) +;;@ (= (t) (64i8: isleType)))))) +;;@ )) +(decl do_shift (ALUOp Type Reg Value) Reg) + +;;@ (spec (sig (args op, t, a, b) (ret)) +;;@ (assertions (if (= (op) (0i64:bv)) { +;;@ (= (ret) (shl (conv_to (if (<= (t) (32i8: isleType)) {(32i8: isleType)} else {(64i8: isleType)}) (a)) (b))) +;;@ } else { +;;@ (if (= (op) (1i64:bv)) { +;;@ (= (ret) (shr (conv_to (if (<= (t) (32i8: isleType)) {(32i8: isleType)} else {(64i8: isleType)}) (a)) (b))) +;;@ } else { +;;@ (if (= (op) (2i64:bv)) { +;;@ (= (ret) (ashr (conv_to (if (<= (t) (32i8: isleType)) {(32i8: isleType)} else {(64i8: isleType)}) (a)) (b))) +;;@ } else { +;;@ (= (ret) (0i64:bv)) +;;@ }) +;;@ }) +;;@ }), +;;@ (= (t) (widthof (a))), +;;@ (|| (= (op) (0i64:bv)) (|| (= (op) (1i64:bv)) (= (op) (2i64:bv)))), +;;@ (|| (= (t) (1i8: isleType)) +;;@ (|| (= (t) (8i8: isleType)) +;;@ (|| (= (t) (16i8: isleType)) +;;@ (|| (= (t) (32i8: isleType)) +;;@ (= (t) (64i8: isleType)))))) +;;@ )) +(decl alu_rrr (ALUOp Type Reg Reg) Reg) +(extern constructor alu_rrr alu_rrr) + +(rule (do_shift op $I64 x y) (alu_rrr op $I64 x (value_regs_get y 0))) diff --git a/cranelift/isle/veri/veri_engine/examples/shifts/do_shift_fits_in_16.isle b/cranelift/isle/veri/veri_engine/examples/shifts/do_shift_fits_in_16.isle new file mode 100644 index 000000000000..5bae1eb7219f --- /dev/null +++ b/cranelift/isle/veri/veri_engine/examples/shifts/do_shift_fits_in_16.isle @@ -0,0 +1,119 @@ +(type ImmLogic (primitive ImmLogic)) + +;; Instruction formats. +(type MInst + (enum +)) + +;;@ (spec (sig (args) (ret)) +;;@ (assertions (= (0i64:bv) (ret)))) +;;decl ALUOp.Lsl + +;;@ (spec (sig (args) (ret)) +;;@ (assertions (= (1i64:bv) (ret)))) +;;decl ALUOp.Lsr + +;;@ (spec (sig (args) (ret)) +;;@ (assertions (= (2i64:bv) (ret)))) +;;decl ALUOp.Asr + +;; An ALU operation. This can be paired with several instruction formats +;; below (see `Inst`) in any combination. +(type ALUOp + (enum + (Add) + (Sub) + (Orr) + (OrrNot) + (And) + (AndS) + (AndNot) + ;; XOR (AArch64 calls this "EOR") + (Eor) + ;; XNOR (AArch64 calls this "EOR-NOT") + (EorNot) + ;; Add, setting flags + (AddS) + ;; Sub, setting flags + (SubS) + ;; Signed multiply, high-word result + (SMulH) + ;; Unsigned multiply, high-word result + (UMulH) + (SDiv) + (UDiv) + (RotR) + (Lsr) + (Asr) + (Lsl) + ;; Add with carry + (Adc) + ;; Add with carry, settings flags + (AdcS) + ;; Subtract with carry + (Sbc) + ;; Subtract with carry, settings flags + (SbcS) +)) + +;;@ (spec (sig (args ty, a, b) (r)) +;;@ (assertions (= (& (conv_to (ty) (a)) (conv_to (ty) (b))) (conv_to (ty) (r))))) +(decl and_imm (Type Reg ImmLogic) Reg) +(extern constructor and_imm and_imm) + +;;@ (spec (sig (args op, t, a, b) (ret)) +;;@ (assertions (= (ret) (conv_to (t) (if (= (op) (0i64:bv)) { +;;@ (shl (a) (b)) +;;@ } else { +;;@ (if (= (op) (1i64:bv)) { +;;@ (shr (a) (b)) +;;@ } else { +;;@ (if (= (op) (2i64:bv)) { +;;@ (ashr (a) (b)) +;;@ } else { +;;@ (64i64:bv) +;;@ }) +;;@ }) +;;@ }))), +;;@ (|| (= (op) (0i64:bv)) (|| (= (op) (1i64:bv)) (= (op) (2i64:bv)))), +;;@ (|| (= (t) (1i8: isleType)) +;;@ (|| (= (t) (8i8: isleType)) +;;@ (|| (= (t) (16i8: isleType)) +;;@ (|| (= (t) (32i8: isleType)) +;;@ (= (t) (64i8: isleType)))))) +;;@ )) +(decl do_shift (ALUOp Type Reg Value) Reg) + +;;@ (spec (sig (args op, t, a, b) (ret)) +;;@ (assertions (if (= (op) (0i64:bv)) { +;;@ (= (ret) (shl (conv_to (if (<= (t) (32i8: isleType)) {(32i8: isleType)} else {(64i8: isleType)}) (a)) (b))) +;;@ } else { +;;@ (if (= (op) (1i64:bv)) { +;;@ (= (ret) (shr (conv_to (if (<= (t) (32i8: isleType)) {(32i8: isleType)} else {(64i8: isleType)}) (a)) (b))) +;;@ } else { +;;@ (if (= (op) (2i64:bv)) { +;;@ (= (ret) (ashr (conv_to (if (<= (t) (32i8: isleType)) {(32i8: isleType)} else {(64i8: isleType)}) (a)) (b))) +;;@ } else { +;;@ (= (ret) (0i64:bv)) +;;@ }) +;;@ }) +;;@ }), +;;@ (|| (= (op) (0i64:bv)) (|| (= (op) (1i64:bv)) (= (op) (2i64:bv)))), +;;@ (|| (= (t) (1i8: isleType)) +;;@ (|| (= (t) (8i8: isleType)) +;;@ (|| (= (t) (16i8: isleType)) +;;@ (|| (= (t) (32i8: isleType)) +;;@ (= (t) (64i8: isleType)))))) +;;@ )) +(decl alu_rrr (ALUOp Type Reg Reg) Reg) +(extern constructor alu_rrr alu_rrr) + +(rule -1 (do_shift op (fits_in_16 ty) x y) + (let ((shift_amt Reg (value_regs_get y 0)) + (masked_shift_amt Reg (and_imm $I32 shift_amt (shift_mask ty)))) + (alu_rrr op $I32 x masked_shift_amt))) + +;;@ (spec (sig (args x) (ret)) +;;@ (assertions (= (- (int2bv 64 (x)) (1i64:bv)) (ret)))) +(decl shift_mask (Type) ImmLogic) +(extern constructor shift_mask shift_mask) \ No newline at end of file diff --git a/cranelift/isle/veri/veri_engine/examples/shifts/do_shift_with_imm.isle b/cranelift/isle/veri/veri_engine/examples/shifts/do_shift_with_imm.isle new file mode 100644 index 000000000000..59df335e9bc1 --- /dev/null +++ b/cranelift/isle/veri/veri_engine/examples/shifts/do_shift_with_imm.isle @@ -0,0 +1,125 @@ +(type ImmShift (primitive ImmShift)) + +;; Instruction formats. +(type MInst + (enum +)) + +;;@ (spec (sig (args) (ret)) +;;@ (assertions (= (0i64:bv) (ret)))) +;;decl ALUOp.Lsl + +;;@ (spec (sig (args) (ret)) +;;@ (assertions (= (1i64:bv) (ret)))) +;;decl ALUOp.Lsr + +;;@ (spec (sig (args) (ret)) +;;@ (assertions (= (2i64:bv) (ret)))) +;;decl ALUOp.Asr + +;; An ALU operation. This can be paired with several instruction formats +;; below (see `Inst`) in any combination. +(type ALUOp + (enum + (Add) + (Sub) + (Orr) + (OrrNot) + (And) + (AndS) + (AndNot) + ;; XOR (AArch64 calls this "EOR") + (Eor) + ;; XNOR (AArch64 calls this "EOR-NOT") + (EorNot) + ;; Add, setting flags + (AddS) + ;; Sub, setting flags + (SubS) + ;; Signed multiply, high-word result + (SMulH) + ;; Unsigned multiply, high-word result + (UMulH) + (SDiv) + (UDiv) + (RotR) + (Lsr) + (Asr) + (Lsl) + ;; Add with carry + (Adc) + ;; Add with carry, settings flags + (AdcS) + ;; Subtract with carry + (Sbc) + ;; Subtract with carry, settings flags + (SbcS) +)) + +;; Add an assertion that the value fits, using the constand with 56 1's then 6 0's (~63) +;;@ (spec (sig (args ty, x) (r)) +;;@ (assertions +;;@ (= (r) (conv_to (widthof (r)) (x))), +;;@ (= (0i65:bv) (& (x) (~ (63i64:bv)))) +;;@ ) +;;@ ) +(decl pure imm_shift_from_imm64 (Type Imm64) ImmShift) +(extern constructor imm_shift_from_imm64 imm_shift_from_imm64) + +;;@ (spec (sig (args op, t, a, b) (ret)) +;;@ (assertions (= (ret) (conv_to (t) (if (= (op) (0i64:bv)) { +;;@ (shl (a) (b)) +;;@ } else { +;;@ (if (= (op) (1i64:bv)) { +;;@ (shr (a) (b)) +;;@ } else { +;;@ (if (= (op) (2i64:bv)) { +;;@ (ashr (a) (b)) +;;@ } else { +;;@ (64i64:bv) +;;@ }) +;;@ }) +;;@ }))), +;;@ (|| (= (op) (0i64:bv)) (|| (= (op) (1i64:bv)) (= (op) (2i64:bv)))), +;;@ (|| (= (t) (1i8: isleType)) +;;@ (|| (= (t) (8i8: isleType)) +;;@ (|| (= (t) (16i8: isleType)) +;;@ (|| (= (t) (32i8: isleType)) +;;@ (= (t) (64i8: isleType)))))) +;;@ )) +(decl do_shift (ALUOp Type Reg Value) Reg) +(extern extractor do_shift do_shift) + +;; types get bucketed for <= 32, <= 64 +;; (if (<= (t) (32i8: isleType)) {(32i8: isleType)} else {(64i8: isleType)}) + +;;@ (spec (sig (args op, t, a, b) (ret)) +;;@ (assertions (if (= (op) (0i64:bv)) { +;;@ (= (ret) (shl (conv_to (if (<= (t) (32i8: isleType)) {(32i8: isleType)} else {(64i8: isleType)}) (a)) +;;@ (zero_ext (regwidth) (b)))) +;;@ } else { +;;@ (if (= (op) (1i64:bv)) { +;;@ (= (ret) (shr (conv_to (if (<= (t) (32i8: isleType)) {(32i8: isleType)} else {(64i8: isleType)}) (a)) +;;@ (zero_ext (regwidth) (b)))) +;;@ } else { +;;@ (if (= (op) (2i64:bv)) { +;;@ (= (ret) (ashr (conv_to (if (<= (t) (32i8: isleType)) {(32i8: isleType)} else {(64i8: isleType)}) (a)) +;;@ (zero_ext (regwidth) (b)))) +;;@ } else { +;;@ (= (ret) (0i64:bv)) +;;@ }) +;;@ }) +;;@ }), +;;@ (|| (= (op) (0i64:bv)) (|| (= (op) (1i64:bv)) (= (op) (2i64:bv)))), +;;@ (|| (= (t) (1i8: isleType)) +;;@ (|| (= (t) (8i8: isleType)) +;;@ (|| (= (t) (16i8: isleType)) +;;@ (|| (= (t) (32i8: isleType)) +;;@ (= (t) (64i8: isleType)))))) +;;@ )) +(decl alu_rr_imm_shift (ALUOp Type Reg ImmShift) Reg) +(extern constructor alu_rr_imm_shift alu_rr_imm_shift) + +(rule 1 (do_shift op ty x (iconst k)) + (if-let shift (imm_shift_from_imm64 ty k)) + (alu_rr_imm_shift op ty x shift)) \ No newline at end of file diff --git a/cranelift/isle/veri/veri_engine/examples/shifts/ishl_to_do_shift_64.isle b/cranelift/isle/veri/veri_engine/examples/shifts/ishl_to_do_shift_64.isle new file mode 100644 index 000000000000..0ceb050ebd6f --- /dev/null +++ b/cranelift/isle/veri/veri_engine/examples/shifts/ishl_to_do_shift_64.isle @@ -0,0 +1,87 @@ +;;@ (spec (sig (args arg) (ret)) +;;@ (assertions (= (arg) (ret)))) +(decl lower (Inst) InstOutput) + +;; Instruction formats. +(type MInst + (enum +)) + +;;@ (spec (sig (args) (ret)) +;;@ (assertions (= (0i64:bv) (ret)))) +;;decl ALUOp.Lsl + +;;@ (spec (sig (args) (ret)) +;;@ (assertions (= (1i64:bv) (ret)))) +;;decl ALUOp.Lsr + +;;@ (spec (sig (args) (ret)) +;;@ (assertions (= (2i64:bv) (ret)))) +;;decl ALUOp.Asr + +;; An ALU operation. This can be paired with several instruction formats +;; below (see `Inst`) in any combination. +(type ALUOp + (enum + (Add) + (Sub) + (Orr) + (OrrNot) + (And) + (AndS) + (AndNot) + ;; XOR (AArch64 calls this "EOR") + (Eor) + ;; XNOR (AArch64 calls this "EOR-NOT") + (EorNot) + ;; Add, setting flags + (AddS) + ;; Sub, setting flags + (SubS) + ;; Signed multiply, high-word result + (SMulH) + ;; Unsigned multiply, high-word result + (UMulH) + (SDiv) + (UDiv) + (RotR) + (Lsr) + (Asr) + (Lsl) + ;; Add with carry + (Adc) + ;; Add with carry, settings flags + (AdcS) + ;; Subtract with carry + (Sbc) + ;; Subtract with carry, settings flags + (SbcS) +)) + +;;@ (spec (sig (args op, t, a, b) (ret)) +;;@ (assertions (= (ret) (conv_to (t) (if (= (op) (0i64:bv)) { +;;@ (shl (a) (b)) +;;@ } else { +;;@ (if (= (op) (1i64:bv)) { +;;@ (shr (a) (b)) +;;@ } else { +;;@ (if (= (op) (2i64:bv)) { +;;@ (ashr (a) (b)) +;;@ } else { +;;@ (64i64:bv) +;;@ }) +;;@ }) +;;@ }))), +;;@ (|| (= (op) (0i64:bv)) (|| (= (op) (1i64:bv)) (= (op) (2i64:bv)))), +;;@ (|| (= (t) (1i8: isleType)) +;;@ (|| (= (t) (8i8: isleType)) +;;@ (|| (= (t) (16i8: isleType)) +;;@ (|| (= (t) (32i8: isleType)) +;;@ (= (t) (64i8: isleType)))))) +;;@ )) +(decl do_shift (ALUOp Type Reg Value) Reg) +(extern constructor do_shift do_shift) + +;; Shift for i64. +(rule (lower (has_type $I64 (ishl x y))) + (do_shift (ALUOp.Lsl) $I64 x y)) \ No newline at end of file diff --git a/cranelift/isle/veri/veri_engine/examples/shifts/ishl_to_do_shift_fits_in_32.isle b/cranelift/isle/veri/veri_engine/examples/shifts/ishl_to_do_shift_fits_in_32.isle new file mode 100644 index 000000000000..04bdca89a797 --- /dev/null +++ b/cranelift/isle/veri/veri_engine/examples/shifts/ishl_to_do_shift_fits_in_32.isle @@ -0,0 +1,86 @@ +;;@ (spec (sig (args arg) (ret)) +;;@ (assertions (= (arg) (ret)))) +(decl lower (Inst) InstOutput) + +;; Instruction formats. +(type MInst + (enum +)) + +;;@ (spec (sig (args) (ret)) +;;@ (assertions (= (0i64:bv) (ret)))) +;;decl ALUOp.Lsl + +;;@ (spec (sig (args) (ret)) +;;@ (assertions (= (1i64:bv) (ret)))) +;;decl ALUOp.Lsr + +;;@ (spec (sig (args) (ret)) +;;@ (assertions (= (2i64:bv) (ret)))) +;;decl ALUOp.Asr + +;; An ALU operation. This can be paired with several instruction formats +;; below (see `Inst`) in any combination. +(type ALUOp + (enum + (Add) + (Sub) + (Orr) + (OrrNot) + (And) + (AndS) + (AndNot) + ;; XOR (AArch64 calls this "EOR") + (Eor) + ;; XNOR (AArch64 calls this "EOR-NOT") + (EorNot) + ;; Add, setting flags + (AddS) + ;; Sub, setting flags + (SubS) + ;; Signed multiply, high-word result + (SMulH) + ;; Unsigned multiply, high-word result + (UMulH) + (SDiv) + (UDiv) + (RotR) + (Lsr) + (Asr) + (Lsl) + ;; Add with carry + (Adc) + ;; Add with carry, settings flags + (AdcS) + ;; Subtract with carry + (Sbc) + ;; Subtract with carry, settings flags + (SbcS) +)) + +;;@ (spec (sig (args op, t, a, b) (ret)) +;;@ (assertions (= (ret) (conv_to (t) (if (= (op) (0i64:bv)) { +;;@ (shl (a) (b)) +;;@ } else { +;;@ (if (= (op) (1i64:bv)) { +;;@ (shr (a) (b)) +;;@ } else { +;;@ (if (= (op) (2i64:bv)) { +;;@ (ashr (a) (b)) +;;@ } else { +;;@ (64i64:bv) +;;@ }) +;;@ }) +;;@ }))), +;;@ (|| (= (op) (0i64:bv)) (|| (= (op) (1i64:bv)) (= (op) (2i64:bv)))), +;;@ (|| (= (t) (1i8: isleType)) +;;@ (|| (= (t) (8i8: isleType)) +;;@ (|| (= (t) (16i8: isleType)) +;;@ (|| (= (t) (32i8: isleType)) +;;@ (= (t) (64i8: isleType)))))) +;;@ )) +(decl do_shift (ALUOp Type Reg Value) Reg) +(extern constructor do_shift do_shift) + +(rule -1 (lower (has_type (fits_in_32 ty) (ishl x y))) + (do_shift (ALUOp.Lsl) ty x y)) \ No newline at end of file diff --git a/cranelift/isle/veri/veri_engine/examples/shifts/sshr_to_do_shift_64.isle b/cranelift/isle/veri/veri_engine/examples/shifts/sshr_to_do_shift_64.isle new file mode 100644 index 000000000000..73c04cb89c3c --- /dev/null +++ b/cranelift/isle/veri/veri_engine/examples/shifts/sshr_to_do_shift_64.isle @@ -0,0 +1,92 @@ +;;@ (spec (sig (args arg) (ret)) +;;@ (assertions (= (arg) (ret)))) +(decl lower (Inst) InstOutput) + +;; Instruction formats. +(type MInst + (enum +)) + +;;@ (spec (sig (args) (ret)) +;;@ (assertions (= (0i64:bv) (ret)))) +;;decl ALUOp.Lsl + +;;@ (spec (sig (args) (ret)) +;;@ (assertions (= (1i64:bv) (ret)))) +;;decl ALUOp.Lsr + +;;@ (spec (sig (args) (ret)) +;;@ (assertions (= (2i64:bv) (ret)))) +;;decl ALUOp.Asr + +;; An ALU operation. This can be paired with several instruction formats +;; below (see `Inst`) in any combination. +(type ALUOp + (enum + (Add) + (Sub) + (Orr) + (OrrNot) + (And) + (AndS) + (AndNot) + ;; XOR (AArch64 calls this "EOR") + (Eor) + ;; XNOR (AArch64 calls this "EOR-NOT") + (EorNot) + ;; Add, setting flags + (AddS) + ;; Sub, setting flags + (SubS) + ;; Signed multiply, high-word result + (SMulH) + ;; Unsigned multiply, high-word result + (UMulH) + (SDiv) + (UDiv) + (RotR) + (Lsr) + (Asr) + (Lsl) + ;; Add with carry + (Adc) + ;; Add with carry, settings flags + (AdcS) + ;; Subtract with carry + (Sbc) + ;; Subtract with carry, settings flags + (SbcS) +)) + +;;@ (spec (sig (args op, t, a, b) (ret)) +;;@ (assertions (= (ret) (conv_to (t) (if (= (op) (0i64:bv)) { +;;@ (shl (a) (b)) +;;@ } else { +;;@ (if (= (op) (1i64:bv)) { +;;@ (shr (a) (b)) +;;@ } else { +;;@ (if (= (op) (2i64:bv)) { +;;@ (ashr (a) (b)) +;;@ } else { +;;@ (64i64:bv) +;;@ }) +;;@ }) +;;@ }))), +;;@ (|| (= (op) (0i64:bv)) (|| (= (op) (1i64:bv)) (= (op) (2i64:bv)))), +;;@ (|| (= (t) (1i8: isleType)) +;;@ (|| (= (t) (8i8: isleType)) +;;@ (|| (= (t) (16i8: isleType)) +;;@ (|| (= (t) (32i8: isleType)) +;;@ (= (t) (64i8: isleType)))))) +;;@ )) +(decl do_shift (ALUOp Type Reg Value) Reg) +(extern constructor do_shift do_shift) + +;;@ (spec (sig (args x) (ret)) +;;@ (assertions (= (sign_ext (64) (x)) (ret)))) +(decl put_in_reg_sext64 (Value) Reg) +(extern constructor put_in_reg_sext64 put_in_reg_sext64) + +;; Shift for i64. +(rule (lower (has_type $I64 (sshr x y))) + (do_shift (ALUOp.Asr) $I64 (put_in_reg_sext64 x) y)) \ No newline at end of file diff --git a/cranelift/isle/veri/veri_engine/examples/shifts/sshr_to_do_shift_fits_in_32.isle b/cranelift/isle/veri/veri_engine/examples/shifts/sshr_to_do_shift_fits_in_32.isle new file mode 100644 index 000000000000..786174d2d820 --- /dev/null +++ b/cranelift/isle/veri/veri_engine/examples/shifts/sshr_to_do_shift_fits_in_32.isle @@ -0,0 +1,92 @@ +;;@ (spec (sig (args arg) (ret)) +;;@ (assertions (= (arg) (ret)))) +(decl lower (Inst) InstOutput) + +;; Instruction formats. +(type MInst + (enum +)) + +;;@ (spec (sig (args) (ret)) +;;@ (assertions (= (0i64:bv) (ret)))) +;;decl ALUOp.Lsl + +;;@ (spec (sig (args) (ret)) +;;@ (assertions (= (1i64:bv) (ret)))) +;;decl ALUOp.Lsr + +;;@ (spec (sig (args) (ret)) +;;@ (assertions (= (2i64:bv) (ret)))) +;;decl ALUOp.Asr + +;; An ALU operation. This can be paired with several instruction formats +;; below (see `Inst`) in any combination. +(type ALUOp + (enum + (Add) + (Sub) + (Orr) + (OrrNot) + (And) + (AndS) + (AndNot) + ;; XOR (AArch64 calls this "EOR") + (Eor) + ;; XNOR (AArch64 calls this "EOR-NOT") + (EorNot) + ;; Add, setting flags + (AddS) + ;; Sub, setting flags + (SubS) + ;; Signed multiply, high-word result + (SMulH) + ;; Unsigned multiply, high-word result + (UMulH) + (SDiv) + (UDiv) + (RotR) + (Lsr) + (Asr) + (Lsl) + ;; Add with carry + (Adc) + ;; Add with carry, settings flags + (AdcS) + ;; Subtract with carry + (Sbc) + ;; Subtract with carry, settings flags + (SbcS) +)) + +;;@ (spec (sig (args op, t, a, b) (ret)) +;;@ (assertions (= (ret) (conv_to (t) (if (= (op) (0i64:bv)) { +;;@ (shl (a) (b)) +;;@ } else { +;;@ (if (= (op) (1i64:bv)) { +;;@ (shr (a) (b)) +;;@ } else { +;;@ (if (= (op) (2i64:bv)) { +;;@ (ashr (a) (b)) +;;@ } else { +;;@ (64i64:bv) +;;@ }) +;;@ }) +;;@ }))), +;;@ (|| (= (op) (0i64:bv)) (|| (= (op) (1i64:bv)) (= (op) (2i64:bv)))), +;;@ (|| (= (t) (1i8: isleType)) +;;@ (|| (= (t) (8i8: isleType)) +;;@ (|| (= (t) (16i8: isleType)) +;;@ (|| (= (t) (32i8: isleType)) +;;@ (= (t) (64i8: isleType)))))) +;;@ )) +(decl do_shift (ALUOp Type Reg Value) Reg) +(extern constructor do_shift do_shift) + +;;@ (spec (sig (args x) (ret)) +;;@ (assertions (= (sign_ext (32) (x)) (ret)))) +(decl put_in_reg_sext32 (Value) Reg) +(extern constructor put_in_reg_sext32 put_in_reg_sext32) + +;; Shift for i8/i16/i32. +(rule -2 (lower (has_type (fits_in_32 ty) (sshr x y))) + (do_shift (ALUOp.Asr) ty (put_in_reg_sext32 x) y)) diff --git a/cranelift/isle/veri/veri_engine/examples/shifts/ushr_to_do_shift_64.isle b/cranelift/isle/veri/veri_engine/examples/shifts/ushr_to_do_shift_64.isle new file mode 100644 index 000000000000..a8a5732b8444 --- /dev/null +++ b/cranelift/isle/veri/veri_engine/examples/shifts/ushr_to_do_shift_64.isle @@ -0,0 +1,92 @@ +;;@ (spec (sig (args arg) (ret)) +;;@ (assertions (= (arg) (ret)))) +(decl lower (Inst) InstOutput) + +;; Instruction formats. +(type MInst + (enum +)) + +;;@ (spec (sig (args) (ret)) +;;@ (assertions (= (0i64:bv) (ret)))) +;;decl ALUOp.Lsl + +;;@ (spec (sig (args) (ret)) +;;@ (assertions (= (1i64:bv) (ret)))) +;;decl ALUOp.Lsr + +;;@ (spec (sig (args) (ret)) +;;@ (assertions (= (2i64:bv) (ret)))) +;;decl ALUOp.Asr + +;; An ALU operation. This can be paired with several instruction formats +;; below (see `Inst`) in any combination. +(type ALUOp + (enum + (Add) + (Sub) + (Orr) + (OrrNot) + (And) + (AndS) + (AndNot) + ;; XOR (AArch64 calls this "EOR") + (Eor) + ;; XNOR (AArch64 calls this "EOR-NOT") + (EorNot) + ;; Add, setting flags + (AddS) + ;; Sub, setting flags + (SubS) + ;; Signed multiply, high-word result + (SMulH) + ;; Unsigned multiply, high-word result + (UMulH) + (SDiv) + (UDiv) + (RotR) + (Lsr) + (Asr) + (Lsl) + ;; Add with carry + (Adc) + ;; Add with carry, settings flags + (AdcS) + ;; Subtract with carry + (Sbc) + ;; Subtract with carry, settings flags + (SbcS) +)) + +;;@ (spec (sig (args op, t, a, b) (ret)) +;;@ (assertions (= (ret) (conv_to (t) (if (= (op) (0i64:bv)) { +;;@ (shl (a) (b)) +;;@ } else { +;;@ (if (= (op) (1i64:bv)) { +;;@ (shr (a) (b)) +;;@ } else { +;;@ (if (= (op) (2i64:bv)) { +;;@ (ashr (a) (b)) +;;@ } else { +;;@ (64i64:bv) +;;@ }) +;;@ }) +;;@ }))), +;;@ (|| (= (op) (0i64:bv)) (|| (= (op) (1i64:bv)) (= (op) (2i64:bv)))), +;;@ (|| (= (t) (1i8: isleType)) +;;@ (|| (= (t) (8i8: isleType)) +;;@ (|| (= (t) (16i8: isleType)) +;;@ (|| (= (t) (32i8: isleType)) +;;@ (= (t) (64i8: isleType)))))) +;;@ )) +(decl do_shift (ALUOp Type Reg Value) Reg) +(extern constructor do_shift do_shift) + +;;@ (spec (sig (args x) (ret)) +;;@ (assertions (= (zero_ext (64) (x)) (ret)))) +(decl put_in_reg_zext64 (Value) Reg) +(extern constructor put_in_reg_zext64 put_in_reg_zext64) + +;; Shift for i64. +(rule (lower (has_type $I64 (ushr x y))) + (do_shift (ALUOp.Lsr) $I64 (put_in_reg_zext64 x) y)) \ No newline at end of file diff --git a/cranelift/isle/veri/veri_engine/examples/shifts/ushr_to_do_shift_fits_in_32.isle b/cranelift/isle/veri/veri_engine/examples/shifts/ushr_to_do_shift_fits_in_32.isle new file mode 100644 index 000000000000..3bd181e4affb --- /dev/null +++ b/cranelift/isle/veri/veri_engine/examples/shifts/ushr_to_do_shift_fits_in_32.isle @@ -0,0 +1,92 @@ +;;@ (spec (sig (args arg) (ret)) +;;@ (assertions (= (arg) (ret)))) +(decl lower (Inst) InstOutput) + +;; Instruction formats. +(type MInst + (enum +)) + +;;@ (spec (sig (args) (ret)) +;;@ (assertions (= (0i64:bv) (ret)))) +;;decl ALUOp.Lsl + +;;@ (spec (sig (args) (ret)) +;;@ (assertions (= (1i64:bv) (ret)))) +;;decl ALUOp.Lsr + +;;@ (spec (sig (args) (ret)) +;;@ (assertions (= (2i64:bv) (ret)))) +;;decl ALUOp.Asr + +;; An ALU operation. This can be paired with several instruction formats +;; below (see `Inst`) in any combination. +(type ALUOp + (enum + (Add) + (Sub) + (Orr) + (OrrNot) + (And) + (AndS) + (AndNot) + ;; XOR (AArch64 calls this "EOR") + (Eor) + ;; XNOR (AArch64 calls this "EOR-NOT") + (EorNot) + ;; Add, setting flags + (AddS) + ;; Sub, setting flags + (SubS) + ;; Signed multiply, high-word result + (SMulH) + ;; Unsigned multiply, high-word result + (UMulH) + (SDiv) + (UDiv) + (RotR) + (Lsr) + (Asr) + (Lsl) + ;; Add with carry + (Adc) + ;; Add with carry, settings flags + (AdcS) + ;; Subtract with carry + (Sbc) + ;; Subtract with carry, settings flags + (SbcS) +)) + +;;@ (spec (sig (args op, t, a, b) (ret)) +;;@ (assertions (= (ret) (conv_to (t) (if (= (op) (0i64:bv)) { +;;@ (shl (a) (b)) +;;@ } else { +;;@ (if (= (op) (1i64:bv)) { +;;@ (shr (a) (b)) +;;@ } else { +;;@ (if (= (op) (2i64:bv)) { +;;@ (ashr (a) (b)) +;;@ } else { +;;@ (64i64:bv) +;;@ }) +;;@ }) +;;@ }))), +;;@ (|| (= (op) (0i64:bv)) (|| (= (op) (1i64:bv)) (= (op) (2i64:bv)))), +;;@ (|| (= (t) (1i8: isleType)) +;;@ (|| (= (t) (8i8: isleType)) +;;@ (|| (= (t) (16i8: isleType)) +;;@ (|| (= (t) (32i8: isleType)) +;;@ (= (t) (64i8: isleType)))))) +;;@ )) +(decl do_shift (ALUOp Type Reg Value) Reg) +(extern constructor do_shift do_shift) + +;;@ (spec (sig (args x) (ret)) +;;@ (assertions (= (zero_ext (32) (x)) (ret)))) +(decl put_in_reg_zext32 (Value) Reg) +(extern constructor put_in_reg_zext32 put_in_reg_zext32) + +;; Shift for i8/i16/i32. +(rule -1 (lower (has_type (fits_in_32 ty) (ushr x y))) + (do_shift (ALUOp.Lsr) ty (put_in_reg_zext32 x) y)) \ No newline at end of file diff --git a/cranelift/isle/veri/veri_engine/src/solver.rs b/cranelift/isle/veri/veri_engine/src/solver.rs index a0f7ffd119b3..7948b7adab9b 100644 --- a/cranelift/isle/veri/veri_engine/src/solver.rs +++ b/cranelift/isle/veri/veri_engine/src/solver.rs @@ -661,7 +661,16 @@ impl SolverCtx { self.smt.numeral(self.static_width(&*x).unwrap()) }; let xs = self.vir_expr_to_sexp(*x); - let ys = self.vir_expr_to_sexp(*y); + // The shift arg needs to be extracted to the right width + let y_static_width = self.static_width(&y); + let y_rec = self.vir_expr_to_sexp(*y); + let extract = self.smt.extract( + y_static_width.unwrap().checked_sub(1).unwrap().try_into().unwrap(), + 0, + y_rec, + ); + let ys = self.zero_extend(self.bitwidth - y_static_width.unwrap(), extract); + // Strategy: shift left by (bitwidth - arg width) to zero bits to the right // of the bits in the argument size. Then shift right by (amt + (bitwidth - arg width)) @@ -686,7 +695,15 @@ impl SolverCtx { self.smt.numeral(self.static_width(&*x).unwrap()) }; let xs = self.vir_expr_to_sexp(*x); - let ys = self.vir_expr_to_sexp(*y); + // The shift arg needs to be extracted to the right width + let y_static_width = self.static_width(&y); + let y_rec = self.vir_expr_to_sexp(*y); + let extract = self.smt.extract( + y_static_width.unwrap().checked_sub(1).unwrap().try_into().unwrap(), + 0, + y_rec, + ); + let ys = self.zero_extend(self.bitwidth - y_static_width.unwrap(), extract); // Strategy: shift left by (bitwidth - arg width) to eliminate bits to the left // of the bits in the argument size. Then shift right by (amt + (bitwidth - arg width)) @@ -897,9 +914,7 @@ impl SolverCtx { if new_width < self.bitwidth && self.dynwidths { let padding = self.new_fresh_bits(self.bitwidth.checked_sub(new_width).unwrap()); - let r = self.smt.concat(padding, extract); - println!("BVExtract {}", self.smt.display(r)); - r + self.smt.concat(padding, extract) } else { extract } @@ -908,10 +923,17 @@ impl SolverCtx { } } Expr::Conditional(c, t, e) => { - let c_sexp = self.vir_expr_to_sexp(*c); - let t_sexp = self.vir_expr_to_sexp(*t); - let e_sexp = self.vir_expr_to_sexp(*e); - self.smt.ite(c_sexp, t_sexp, e_sexp) + match ty { + Some(Type::BitVector(_)) => { + self.assume_same_width_from_string(width.clone().unwrap(), &*t); + self.assume_same_width_from_string(width.unwrap(), &*e); + } + _ => (), + }; + let cs = self.vir_expr_to_sexp(*c); + let ts = self.vir_expr_to_sexp(*t); + let es = self.vir_expr_to_sexp(*e); + self.smt.ite(cs, ts, es) } Expr::CLZ(e) => { let tyvar = *tyvar.unwrap(); @@ -1543,17 +1565,16 @@ pub fn run_solver( ctx.static_width(&rule_sem.lhs), ctx.static_width(&rule_sem.rhs), ) { - (Some(w), None) | (None, Some(w)) => w, + (Some(w), None) | (None, Some(w)) => Some(w), (Some(w1), Some(w2)) => { assert_eq!(w1, w2); - w1 + Some(w1) } (None, None) => { println!( - "Width of relevant bits of LHS and RHS unknown, using full register bitwidth: {}", - REG_WIDTH + "Width of relevant bits of LHS and RHS unknown, using more expensive symbolic extract" ); - REG_WIDTH + None } }; diff --git a/cranelift/isle/veri/veri_engine/tests/veri.rs b/cranelift/isle/veri/veri_engine/tests/veri.rs index ddd9f86a2920..09663ca940dd 100644 --- a/cranelift/isle/veri/veri_engine/tests/veri.rs +++ b/cranelift/isle/veri/veri_engine/tests/veri.rs @@ -554,16 +554,16 @@ fn test_ineg() { }) } -// #[test] -// fn test_mul() { -// run_and_retry(|| { -// test_from_file_with_lhs_termname( -// "./examples/imul/imul.isle", -// "imul".to_string(), -// lte_64_success_result(), -// ) -// }); -// } +#[test] +fn test_mul() { + run_and_retry(|| { + test_from_file_with_lhs_termname( + "./examples/imul/imul.isle", + "imul".to_string(), + lte_64_success_result(), + ) + }); +} /* #[test] @@ -1403,6 +1403,234 @@ fn test_64_bxor() { }) } +#[test] +fn test_ishl_to_do_shift_64() { + test_from_file_with_filter( + "./examples/shifts/ishl_to_do_shift_64.isle", + "ishl".to_string(), + vec![ + (Bitwidth::I1, VerificationResult::InapplicableRule), + (Bitwidth::I8, VerificationResult::InapplicableRule), + (Bitwidth::I16, VerificationResult::InapplicableRule), + (Bitwidth::I32, VerificationResult::InapplicableRule), + (Bitwidth::I64, VerificationResult::Success), + ], + ) +} + +#[test] +fn test_ishl_to_do_shift_fits_in_32() { + test_from_file_with_filter( + "./examples/shifts/ishl_to_do_shift_fits_in_32.isle", + "ishl".to_string(), + vec![ + (Bitwidth::I1, VerificationResult::Success), + (Bitwidth::I8, VerificationResult::Success), + (Bitwidth::I16, VerificationResult::Success), + (Bitwidth::I32, VerificationResult::Success), + (Bitwidth::I64, VerificationResult::InapplicableRule), + ], + ) +} + +#[test] +fn test_sshr_to_do_shift_64() { + test_from_file_with_filter( + "./examples/shifts/sshr_to_do_shift_64.isle", + "sshr".to_string(), + vec![ + (Bitwidth::I1, VerificationResult::InapplicableRule), + (Bitwidth::I8, VerificationResult::InapplicableRule), + (Bitwidth::I16, VerificationResult::InapplicableRule), + (Bitwidth::I32, VerificationResult::InapplicableRule), + (Bitwidth::I64, VerificationResult::Success), + ], + ) +} + +#[test] +fn test_sshr_to_do_shift_fits_in_32() { + test_from_file_with_filter( + "./examples/shifts/sshr_to_do_shift_fits_in_32.isle", + "sshr".to_string(), + vec![ + (Bitwidth::I1, VerificationResult::Success), + (Bitwidth::I8, VerificationResult::Success), + (Bitwidth::I16, VerificationResult::Success), + (Bitwidth::I32, VerificationResult::Success), + (Bitwidth::I64, VerificationResult::InapplicableRule), + ], + ) +} + +#[test] +fn test_ushr_to_do_shift_64() { + test_from_file_with_filter( + "./examples/shifts/ushr_to_do_shift_64.isle", + "ushr".to_string(), + vec![ + (Bitwidth::I1, VerificationResult::InapplicableRule), + (Bitwidth::I8, VerificationResult::InapplicableRule), + (Bitwidth::I16, VerificationResult::InapplicableRule), + (Bitwidth::I32, VerificationResult::InapplicableRule), + (Bitwidth::I64, VerificationResult::Success), + ], + ) +} + +#[test] +fn test_ushr_to_do_shift_fits_in_32() { + test_from_file_with_filter( + "./examples/shifts/ushr_to_do_shift_fits_in_32.isle", + "ushr".to_string(), + vec![ + (Bitwidth::I1, VerificationResult::Success), + (Bitwidth::I8, VerificationResult::Success), + (Bitwidth::I16, VerificationResult::Success), + (Bitwidth::I32, VerificationResult::Success), + (Bitwidth::I64, VerificationResult::InapplicableRule), + ], + ) +} + +#[test] +fn test_do_shift_with_imm() { + test_from_file_with_filter( + "./examples/shifts/do_shift_with_imm.isle", + "do_shift".to_string(), + vec![ + (Bitwidth::I1, VerificationResult::Success), + (Bitwidth::I8, VerificationResult::Success), + (Bitwidth::I16, VerificationResult::Success), + (Bitwidth::I32, VerificationResult::Success), + (Bitwidth::I64, VerificationResult::Success), + ], + ) +} + +// #[test] +// fn test_do_shift_fits_in_16() { +// test_from_file_with_filter( +// "./examples/shifts/do_shift_fits_in_16.isle", +// "do_shift".to_string(), +// vec![ +// (Bitwidth::I1, VerificationResult::Success), +// (Bitwidth::I8, VerificationResult::Success), +// (Bitwidth::I16, VerificationResult::Success), +// (Bitwidth::I32, VerificationResult::InapplicableRule), +// (Bitwidth::I64, VerificationResult::InapplicableRule), +// ], +// ) +// } + +#[test] +fn test_do_shift_32() { + test_from_file_with_filter( + "./examples/shifts/do_shift_32.isle", + "do_shift".to_string(), + vec![ + (Bitwidth::I1, VerificationResult::InapplicableRule), + (Bitwidth::I8, VerificationResult::InapplicableRule), + (Bitwidth::I16, VerificationResult::InapplicableRule), + (Bitwidth::I32, VerificationResult::Success), + (Bitwidth::I64, VerificationResult::InapplicableRule), + ], + ) +} + +#[test] +fn test_broken_do_shift_32() { + test_from_file_with_filter( + "./examples/broken/shifts/broken_do_shift_32.isle", + "do_shift".to_string(), + vec![ + (Bitwidth::I1, VerificationResult::InapplicableRule), + (Bitwidth::I8, VerificationResult::InapplicableRule), + (Bitwidth::I16, VerificationResult::InapplicableRule), + ( + Bitwidth::I32, + VerificationResult::Failure(Counterexample {}), + ), + (Bitwidth::I64, VerificationResult::InapplicableRule), + ], + ) +} + +#[test] +fn test_broken_ishl_to_do_shift_64() { + test_from_file_with_filter( + "./examples/broken/shifts/broken_ishl_to_do_shift_64.isle", + "ishl".to_string(), + vec![ + (Bitwidth::I1, VerificationResult::InapplicableRule), + (Bitwidth::I8, VerificationResult::InapplicableRule), + (Bitwidth::I16, VerificationResult::InapplicableRule), + (Bitwidth::I32, VerificationResult::InapplicableRule), + ( + Bitwidth::I64, + VerificationResult::Failure(Counterexample {}), + ), + ], + ) +} + +#[test] +fn test_broken_sshr_to_do_shift_fits_in_32() { + test_from_file_with_filter( + "./examples/broken/shifts/broken_sshr_to_do_shift_fits_in_32.isle", + "sshr".to_string(), + vec![ + (Bitwidth::I1, VerificationResult::Failure(Counterexample {})), + (Bitwidth::I8, VerificationResult::Failure(Counterexample {})), + ( + Bitwidth::I16, + VerificationResult::Failure(Counterexample {}), + ), + ( + Bitwidth::I32, + VerificationResult::Failure(Counterexample {}), + ), + (Bitwidth::I64, VerificationResult::InapplicableRule), + ], + ) +} + +#[test] +fn test_broken_ushr_to_do_shift_fits_in_32() { + test_from_file_with_filter( + "./examples/broken/shifts/broken_ushr_to_do_shift_fits_in_32.isle", + "ushr".to_string(), + vec![ + (Bitwidth::I1, VerificationResult::Failure(Counterexample {})), + (Bitwidth::I8, VerificationResult::Failure(Counterexample {})), + ( + Bitwidth::I16, + VerificationResult::Failure(Counterexample {}), + ), + ( + Bitwidth::I32, + VerificationResult::Failure(Counterexample {}), + ), + (Bitwidth::I64, VerificationResult::InapplicableRule), + ], + ) +} + +#[test] +fn test_do_shift_64() { + test_from_file_with_filter( + "./examples/shifts/do_shift_64.isle", + "do_shift".to_string(), + vec![ + (Bitwidth::I1, VerificationResult::InapplicableRule), + (Bitwidth::I8, VerificationResult::InapplicableRule), + (Bitwidth::I16, VerificationResult::InapplicableRule), + (Bitwidth::I32, VerificationResult::InapplicableRule), + (Bitwidth::I64, VerificationResult::Success), + ], + ) +} + #[test] fn test_if_let() { test_from_file_with_lhs_termname( diff --git a/cranelift/isle/veri/veri_ir/src/annotation_ir.rs b/cranelift/isle/veri/veri_ir/src/annotation_ir.rs index d74ef4191d1d..72c438c08431 100644 --- a/cranelift/isle/veri/veri_ir/src/annotation_ir.rs +++ b/cranelift/isle/veri/veri_ir/src/annotation_ir.rs @@ -180,7 +180,7 @@ pub enum Expr { CLS(Box, u32), A64CLS(Box, Box, u32), Rev(Box, u32), - A64Rev(Box, Box, u32), + A64Rev(Box, Box, u32), // Binary operators BVMul(Box, Box, u32), @@ -252,7 +252,7 @@ impl Expr { | Expr::CLS(_, t) | Expr::A64CLS(_, _, t) | Expr::Rev(_, t) - | Expr::A64Rev(_, _, t) + | Expr::A64Rev(_, _, t) | Expr::And(_, _, t) | Expr::Or(_, _, t) | Expr::Imp(_, _, t) diff --git a/cranelift/isle/veri/veri_ir/src/lib.rs b/cranelift/isle/veri/veri_ir/src/lib.rs index f07ffddb77ec..fe751b121e57 100644 --- a/cranelift/isle/veri/veri_ir/src/lib.rs +++ b/cranelift/isle/veri/veri_ir/src/lib.rs @@ -195,7 +195,7 @@ pub enum Expr { CLS(Box), A64CLS(Box, Box), Rev(Box), - A64Rev(Box, Box), + A64Rev(Box, Box), // ITE Conditional(Box, Box, Box),