// GENERATED BY ISLE. DO NOT EDIT! // // Generated automatically from the instruction-selection DSL code in: // - src/clif.isle // - src/prelude.isle // - src/isa/aarch64/inst.isle // - src/isa/aarch64/lower.isle #![allow(dead_code, unreachable_code, unreachable_patterns)] #![allow(unused_imports, unused_variables, non_snake_case)] #![allow(irrefutable_let_patterns)] use super::*; // Pulls in all external types. /// 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 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; fn u32_add(&mut self, arg0: u32, arg1: u32) -> u32; fn u8_and(&mut self, arg0: u8, arg1: u8) -> u8; 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 temp_writable_reg(&mut self, arg0: Type) -> WritableReg; fn invalid_reg(&mut self) -> Reg; fn put_in_reg(&mut self, arg0: Value) -> Reg; fn put_in_regs(&mut self, arg0: Value) -> ValueRegs; fn value_regs_get(&mut self, arg0: ValueRegs, arg1: usize) -> Reg; 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 ty_bits(&mut self, arg0: Type) -> u8; fn ty_bits_u16(&mut self, arg0: Type) -> u16; fn ty_bytes(&mut self, arg0: Type) -> u16; fn lane_type(&mut self, arg0: Type) -> Type; fn fits_in_16(&mut self, arg0: Type) -> Option; fn fits_in_32(&mut self, arg0: Type) -> Option; fn fits_in_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 vec128(&mut self, arg0: Type) -> Option; fn not_i64x2(&mut self, arg0: Type) -> Option<()>; fn value_list_slice(&mut self, arg0: ValueList) -> ValueSlice; fn unwrap_head_value_list_1(&mut self, arg0: ValueList) -> (Value, ValueSlice); fn unwrap_head_value_list_2(&mut self, arg0: ValueList) -> (Value, Value, ValueSlice); fn writable_reg_to_reg(&mut self, arg0: WritableReg) -> Reg; fn u8_from_uimm8(&mut self, arg0: Uimm8) -> u8; fn u64_from_imm64(&mut self, arg0: Imm64) -> u64; fn nonzero_u64_from_imm64(&mut self, arg0: Imm64) -> Option; fn u64_from_ieee32(&mut self, arg0: Ieee32) -> u64; fn u64_from_ieee64(&mut self, arg0: Ieee64) -> u64; 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 value_type(&mut self, arg0: Value) -> Type; fn multi_lane(&mut self, arg0: Type) -> Option<(u8, u16)>; fn def_inst(&mut self, arg0: Value) -> Option; fn emit(&mut self, arg0: &MInst) -> Unit; fn emit_safepoint(&mut self, arg0: &MInst) -> Unit; 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 avoid_div_traps(&mut self, arg0: Type) -> Option<()>; 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 move_wide_const_from_u64(&mut self, arg0: u64) -> Option; fn move_wide_const_from_negated_u64(&mut self, arg0: u64) -> Option; fn imm_logic_from_u64(&mut self, arg0: u64, arg1: Type) -> Option; fn imm_logic_from_imm64(&mut self, arg0: Imm64, arg1: Type) -> Option; fn imm_shift_from_imm64(&mut self, arg0: Imm64, arg1: Type) -> 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 imm12_from_negated_u64(&mut self, arg0: u64) -> Option; fn lshl_from_imm64(&mut self, arg0: Imm64, arg1: Type) -> Option; fn integral_ty(&mut self, arg0: Type) -> 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_cond(&mut self, arg0: &Cond) -> CondBrKind; fn zero_reg(&mut self) -> Reg; fn writable_zero_reg(&mut self) -> WritableReg; fn load_constant64_full(&mut self, arg0: u64) -> Reg; fn sinkable_atomic_load(&mut self, arg0: Value) -> Option; fn sink_atomic_load(&mut self, arg0: &SinkableAtomicLoad) -> Reg; 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; } /// Internal type SideEffectNoResult: defined at src/prelude.isle line 308. #[derive(Clone, Debug)] pub enum SideEffectNoResult { Inst { inst: MInst }, } /// Internal type ProducesFlags: defined at src/prelude.isle line 327. #[derive(Clone, Debug)] pub enum ProducesFlags { ProducesFlags { inst: MInst, result: Reg }, } /// Internal type ConsumesFlags: defined at src/prelude.isle line 330. #[derive(Clone, Debug)] pub enum ConsumesFlags { ConsumesFlags { inst: MInst, result: Reg }, } /// Internal type MInst: defined at src/isa/aarch64/inst.isle line 2. #[derive(Clone, Debug)] pub enum MInst { Nop0, Nop4, AluRRR { alu_op: ALUOp, rd: WritableReg, rn: Reg, rm: Reg, }, AluRRRR { alu_op: ALUOp3, rd: WritableReg, rn: Reg, rm: Reg, ra: Reg, }, AluRRImm12 { alu_op: ALUOp, rd: WritableReg, rn: Reg, imm12: Imm12, }, AluRRImmLogic { alu_op: ALUOp, rd: WritableReg, rn: Reg, imml: ImmLogic, }, AluRRImmShift { alu_op: ALUOp, rd: WritableReg, rn: Reg, immshift: ImmShift, }, AluRRRShift { alu_op: ALUOp, rd: WritableReg, rn: Reg, rm: Reg, shiftop: ShiftOpAndAmt, }, AluRRRExtend { alu_op: ALUOp, rd: WritableReg, rn: Reg, rm: Reg, extendop: ExtendOp, }, BitRR { op: BitOp, 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, }, Mov64 { rd: WritableReg, rm: Reg, }, Mov32 { rd: WritableReg, rm: Reg, }, MovZ { rd: WritableReg, imm: MoveWideConst, size: OperandSize, }, MovN { rd: WritableReg, imm: MoveWideConst, size: OperandSize, }, MovK { rd: WritableReg, 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, }, CSet { rd: WritableReg, cond: Cond, }, CSetm { rd: WritableReg, cond: Cond, }, CCmpImm { size: OperandSize, rn: Reg, imm: UImm5, nzcv: NZCV, cond: Cond, }, AtomicRMWLoop { ty: Type, op: AtomicRmwOp, }, AtomicRMW { op: AtomicRMWOp, rs: Reg, rt: WritableReg, rn: Reg, ty: Type, }, AtomicCAS { rs: WritableReg, rt: Reg, rn: Reg, ty: Type, }, AtomicCASLoop { ty: Type, }, LoadAcquire { access_ty: Type, rt: WritableReg, rn: Reg, }, StoreRelease { access_ty: Type, rt: Reg, rn: Reg, }, Fence, 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, rd: WritableReg, rn: Reg, }, FpuRRR { fpu_op: FPUOp2, rd: WritableReg, rn: Reg, rm: Reg, }, FpuRRI { fpu_op: FPUOpRI, rd: WritableReg, rn: Reg, }, FpuRRRR { fpu_op: FPUOp3, rd: WritableReg, rn: Reg, rm: Reg, ra: Reg, }, FpuCmp32 { rn: Reg, rm: Reg, }, FpuCmp64 { 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, rn: Reg, idx: u8, size: VectorSize, }, MovFromVec { rd: WritableReg, rn: Reg, idx: u8, size: VectorSize, }, 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, }, VecMovElement { rd: WritableReg, rn: Reg, dest_idx: u8, src_idx: u8, size: VectorSize, }, VecRRLong { op: VecRRLongOp, rd: WritableReg, rn: Reg, high_half: bool, }, VecRRNarrow { op: VecRRNarrowOp, rd: WritableReg, rn: Reg, high_half: bool, }, VecRRPair { op: VecPairOp, rd: WritableReg, rn: Reg, }, VecRRRLong { alu_op: VecRRRLongOp, rd: WritableReg, 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, }, 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, }, VecExtract { rd: WritableReg, rn: Reg, rm: Reg, imm4: u8, }, VecTbl { rd: WritableReg, rn: Reg, rm: Reg, is_extension: bool, }, VecTbl2 { rd: WritableReg, rn: Reg, rn2: Reg, rm: Reg, is_extension: bool, }, VecLoadReplicate { rd: WritableReg, rn: Reg, size: VectorSize, }, VecCSel { rd: WritableReg, rn: Reg, rm: Reg, cond: Cond, }, MovToNZCV { rn: Reg, }, MovFromNZCV { rd: WritableReg, }, Call { info: BoxCallInfo, }, CallInd { info: BoxCallIndInfo, }, Ret, EpiloguePlaceholder, 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, }, VirtualSPOffsetAdj { offset: i64, }, EmitIsland { needed_space: CodeOffset, }, ElfTlsGetAddr { symbol: ExternalName, }, ValueLabelMarker { reg: Reg, label: ValueLabel, }, Unwind { inst: UnwindInst, }, } /// Internal type ALUOp: defined at src/isa/aarch64/inst.isle line 789. #[derive(Copy, Clone, PartialEq, Eq, Debug)] pub enum ALUOp { Add32, Add64, Sub32, Sub64, Orr32, Orr64, OrrNot32, OrrNot64, And32, And64, AndS32, AndS64, AndNot32, AndNot64, Eor32, Eor64, EorNot32, EorNot64, AddS32, AddS64, SubS32, SubS64, SMulH, UMulH, SDiv64, UDiv64, RotR32, RotR64, Lsr32, Lsr64, Asr32, Asr64, Lsl32, Lsl64, Adc32, Adc64, AdcS32, AdcS64, Sbc32, Sbc64, SbcS32, SbcS64, } /// Internal type ALUOp3: defined at src/isa/aarch64/inst.isle line 850. #[derive(Copy, Clone, PartialEq, Eq, Debug)] pub enum ALUOp3 { MAdd32, MAdd64, MSub32, MSub64, } /// Internal type BitOp: defined at src/isa/aarch64/inst.isle line 893. #[derive(Copy, Clone, PartialEq, Eq, Debug)] pub enum BitOp { RBit32, RBit64, Clz32, Clz64, Cls32, Cls64, } /// Internal type FPUOp1: defined at src/isa/aarch64/inst.isle line 959. #[derive(Copy, Clone, PartialEq, Eq, Debug)] pub enum FPUOp1 { Abs32, Abs64, Neg32, Neg64, Sqrt32, Sqrt64, Cvt32To64, Cvt64To32, } /// Internal type FPUOp2: defined at src/isa/aarch64/inst.isle line 972. #[derive(Copy, Clone, PartialEq, Eq, Debug)] pub enum FPUOp2 { Add32, Add64, Sub32, Sub64, Mul32, Mul64, Div32, Div64, Max32, Max64, Min32, Min64, Sqadd64, Uqadd64, Sqsub64, Uqsub64, } /// Internal type FPUOp3: defined at src/isa/aarch64/inst.isle line 997. #[derive(Copy, Clone, PartialEq, Eq, Debug)] pub enum FPUOp3 { MAdd32, MAdd64, } /// Internal type FpuToIntOp: defined at src/isa/aarch64/inst.isle line 1004. #[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 1017. #[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 1031. #[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 1044. #[derive(Copy, Clone, PartialEq, Eq, Debug)] pub enum VecExtendOp { Sxtl8, Sxtl16, Sxtl32, Uxtl8, Uxtl16, Uxtl32, } /// Internal type VecALUOp: defined at src/isa/aarch64/inst.isle line 1061. #[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, Bsl, Umaxp, Add, Sub, Mul, Sshl, Ushl, Umin, Smin, Umax, Smax, Urhadd, Fadd, Fsub, Fdiv, Fmax, Fmin, Fmul, Addp, Zip1, Sqrdmulh, } /// Internal type VecMisc2: defined at src/isa/aarch64/inst.isle line 1140. #[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, } /// Internal type VecRRLongOp: defined at src/isa/aarch64/inst.isle line 1179. #[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 1194. #[derive(Copy, Clone, PartialEq, Eq, Debug)] pub enum VecRRNarrowOp { Xtn16, Xtn32, Xtn64, Sqxtn16, Sqxtn32, Sqxtn64, Sqxtun16, Sqxtun32, Sqxtun64, Uqxtn16, Uqxtn32, Uqxtn64, Fcvtn32, Fcvtn64, } /// Internal type VecRRRLongOp: defined at src/isa/aarch64/inst.isle line 1226. #[derive(Copy, Clone, PartialEq, Eq, Debug)] pub enum VecRRRLongOp { Smull8, Smull16, Smull32, Umull8, Umull16, Umull32, Umlal8, Umlal16, Umlal32, } /// Internal type VecPairOp: defined at src/isa/aarch64/inst.isle line 1243. #[derive(Copy, Clone, PartialEq, Eq, Debug)] pub enum VecPairOp { Addp, } /// Internal type VecRRPairLongOp: defined at src/isa/aarch64/inst.isle line 1251. #[derive(Copy, Clone, PartialEq, Eq, Debug)] pub enum VecRRPairLongOp { Saddlp8, Saddlp16, Uaddlp8, Uaddlp16, } /// Internal type VecLanesOp: defined at src/isa/aarch64/inst.isle line 1262. #[derive(Copy, Clone, PartialEq, Eq, Debug)] pub enum VecLanesOp { Addv, Uminv, } /// Internal type VecShiftImmOp: defined at src/isa/aarch64/inst.isle line 1271. #[derive(Copy, Clone, PartialEq, Eq, Debug)] pub enum VecShiftImmOp { Shl, Ushr, Sshr, } /// Internal type AtomicRMWOp: defined at src/isa/aarch64/inst.isle line 1282. #[derive(Copy, Clone, PartialEq, Eq, Debug)] pub enum AtomicRMWOp { Add, Clr, Eor, Set, Smax, Smin, Umax, Umin, } // Generated as internal constructor for term temp_reg. pub fn constructor_temp_reg(ctx: &mut C, arg0: Type) -> Option { let pattern0_0 = arg0; // Rule at src/prelude.isle line 73. let expr0_0 = C::temp_writable_reg(ctx, pattern0_0); let expr1_0 = C::writable_reg_to_reg(ctx, expr0_0); return Some(expr1_0); } // Generated as internal constructor for term lo_reg. pub fn constructor_lo_reg(ctx: &mut C, arg0: Value) -> Option { let pattern0_0 = arg0; // Rule at src/prelude.isle line 108. let expr0_0 = C::put_in_regs(ctx, pattern0_0); let expr1_0: usize = 0; let expr2_0 = C::value_regs_get(ctx, expr0_0, expr1_0); return Some(expr2_0); } // Generated as internal constructor for term value_regs_none. pub fn constructor_value_regs_none( ctx: &mut C, arg0: &SideEffectNoResult, ) -> Option { let pattern0_0 = arg0; if let &SideEffectNoResult::Inst { inst: ref pattern1_0, } = pattern0_0 { // Rule at src/prelude.isle line 313. let expr0_0 = C::emit(ctx, &pattern1_0); let expr1_0 = C::value_regs_invalid(ctx); return Some(expr1_0); } return None; } // Generated as internal constructor for term safepoint. pub fn constructor_safepoint( ctx: &mut C, arg0: &SideEffectNoResult, ) -> Option { let pattern0_0 = arg0; if let &SideEffectNoResult::Inst { inst: ref pattern1_0, } = pattern0_0 { // Rule at src/prelude.isle line 319. let expr0_0 = C::emit_safepoint(ctx, &pattern1_0); let expr1_0 = C::value_regs_invalid(ctx); return Some(expr1_0); } return None; } // Generated as internal constructor for term with_flags. pub fn constructor_with_flags( ctx: &mut C, arg0: &ProducesFlags, arg1: &ConsumesFlags, ) -> Option { let pattern0_0 = arg0; if let &ProducesFlags::ProducesFlags { inst: ref pattern1_0, result: pattern1_1, } = pattern0_0 { let pattern2_0 = arg1; if let &ConsumesFlags::ConsumesFlags { inst: ref pattern3_0, result: pattern3_1, } = pattern2_0 { // Rule at src/prelude.isle line 340. 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 Some(expr2_0); } } return None; } // Generated as internal constructor for term with_flags_1. pub fn constructor_with_flags_1( ctx: &mut C, arg0: &ProducesFlags, arg1: &ConsumesFlags, ) -> Option { let pattern0_0 = arg0; if let &ProducesFlags::ProducesFlags { inst: ref pattern1_0, result: pattern1_1, } = pattern0_0 { let pattern2_0 = arg1; if let &ConsumesFlags::ConsumesFlags { inst: ref pattern3_0, result: pattern3_1, } = pattern2_0 { // Rule at src/prelude.isle line 348. let expr0_0 = C::emit(ctx, &pattern1_0); let expr1_0 = C::emit(ctx, &pattern3_0); return Some(pattern3_1); } } return None; } // Generated as internal constructor for term with_flags_2. pub fn constructor_with_flags_2( ctx: &mut C, arg0: &ProducesFlags, arg1: &ConsumesFlags, arg2: &ConsumesFlags, ) -> Option { let pattern0_0 = arg0; if let &ProducesFlags::ProducesFlags { inst: ref pattern1_0, result: pattern1_1, } = pattern0_0 { let pattern2_0 = arg1; if let &ConsumesFlags::ConsumesFlags { inst: ref pattern3_0, result: pattern3_1, } = pattern2_0 { let pattern4_0 = arg2; if let &ConsumesFlags::ConsumesFlags { inst: ref pattern5_0, result: pattern5_1, } = pattern4_0 { // Rule at src/prelude.isle line 358. let expr0_0 = C::emit(ctx, &pattern1_0); let expr1_0 = C::emit(ctx, &pattern5_0); let expr2_0 = C::emit(ctx, &pattern3_0); let expr3_0 = C::value_regs(ctx, pattern3_1, pattern5_1); return Some(expr3_0); } } } return None; } // Generated as internal constructor for term vector_size. pub fn constructor_vector_size(ctx: &mut C, arg0: Type) -> Option { let pattern0_0 = arg0; if let Some((pattern1_0, pattern1_1)) = C::multi_lane(ctx, pattern0_0) { if pattern1_0 == 8 { if pattern1_1 == 16 { // Rule at src/isa/aarch64/inst.isle line 953. let expr0_0 = VectorSize::Size8x16; return Some(expr0_0); } } if pattern1_0 == 16 { if pattern1_1 == 8 { // Rule at src/isa/aarch64/inst.isle line 954. let expr0_0 = VectorSize::Size16x8; return Some(expr0_0); } } if pattern1_0 == 32 { if pattern1_1 == 4 { // Rule at src/isa/aarch64/inst.isle line 955. let expr0_0 = VectorSize::Size32x4; return Some(expr0_0); } } if pattern1_0 == 64 { if pattern1_1 == 2 { // Rule at src/isa/aarch64/inst.isle line 956. let expr0_0 = VectorSize::Size64x2; return Some(expr0_0); } } } return None; } // Generated as internal constructor for term movz. pub fn constructor_movz( ctx: &mut C, arg0: MoveWideConst, arg1: &OperandSize, ) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; // Rule at src/isa/aarch64/inst.isle line 1378. let expr0_0: Type = I64; let expr1_0 = C::temp_writable_reg(ctx, expr0_0); let expr2_0 = MInst::MovZ { rd: expr1_0, imm: 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 Some(expr4_0); } // Generated as internal constructor for term movn. pub fn constructor_movn( ctx: &mut C, arg0: MoveWideConst, arg1: &OperandSize, ) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; // Rule at src/isa/aarch64/inst.isle line 1385. let expr0_0: Type = I64; let expr1_0 = C::temp_writable_reg(ctx, expr0_0); let expr2_0 = MInst::MovN { rd: expr1_0, imm: 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 Some(expr4_0); } // Generated as internal constructor for term alu_rr_imm_logic. pub fn constructor_alu_rr_imm_logic( ctx: &mut C, arg0: &ALUOp, arg1: Reg, arg2: ImmLogic, ) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; let pattern2_0 = arg2; // Rule at src/isa/aarch64/inst.isle line 1392. let expr0_0: Type = I64; let expr1_0 = C::temp_writable_reg(ctx, expr0_0); let expr2_0 = MInst::AluRRImmLogic { alu_op: pattern0_0.clone(), rd: expr1_0, rn: pattern1_0, imml: pattern2_0, }; let expr3_0 = C::emit(ctx, &expr2_0); let expr4_0 = C::writable_reg_to_reg(ctx, expr1_0); return Some(expr4_0); } // Generated as internal constructor for term alu_rr_imm_shift. pub fn constructor_alu_rr_imm_shift( ctx: &mut C, arg0: &ALUOp, arg1: Reg, arg2: ImmShift, ) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; let pattern2_0 = arg2; // Rule at src/isa/aarch64/inst.isle line 1399. let expr0_0: Type = I64; let expr1_0 = C::temp_writable_reg(ctx, expr0_0); let expr2_0 = MInst::AluRRImmShift { alu_op: pattern0_0.clone(), rd: expr1_0, rn: pattern1_0, immshift: pattern2_0, }; let expr3_0 = C::emit(ctx, &expr2_0); let expr4_0 = C::writable_reg_to_reg(ctx, expr1_0); return Some(expr4_0); } // Generated as internal constructor for term alu_rrr. pub fn constructor_alu_rrr( ctx: &mut C, arg0: &ALUOp, arg1: Reg, arg2: Reg, ) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; let pattern2_0 = arg2; // Rule at src/isa/aarch64/inst.isle line 1406. 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, 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 Some(expr4_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, ) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; let pattern2_0 = arg2; let pattern3_0 = arg3; // Rule at src/isa/aarch64/inst.isle line 1413. 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 Some(expr4_0); } // Generated as internal constructor for term vec_lanes. pub fn constructor_vec_lanes( ctx: &mut C, arg0: &VecLanesOp, arg1: Reg, arg2: &VectorSize, ) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; let pattern2_0 = arg2; // Rule at src/isa/aarch64/inst.isle line 1420. 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 Some(expr4_0); } // Generated as internal constructor for term vec_dup. pub fn constructor_vec_dup(ctx: &mut C, arg0: Reg, arg1: &VectorSize) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; // Rule at src/isa/aarch64/inst.isle line 1427. 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 Some(expr4_0); } // Generated as internal constructor for term alu_rr_imm12. pub fn constructor_alu_rr_imm12( ctx: &mut C, arg0: &ALUOp, arg1: Reg, arg2: Imm12, ) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; let pattern2_0 = arg2; // Rule at src/isa/aarch64/inst.isle line 1434. 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, rn: 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 Some(expr4_0); } // Generated as internal constructor for term alu_rrr_shift. pub fn constructor_alu_rrr_shift( ctx: &mut C, arg0: &ALUOp, arg1: Reg, arg2: Reg, arg3: ShiftOpAndAmt, ) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; let pattern2_0 = arg2; let pattern3_0 = arg3; // Rule at src/isa/aarch64/inst.isle line 1441. let expr0_0: Type = I64; let expr1_0 = C::temp_writable_reg(ctx, expr0_0); let expr2_0 = MInst::AluRRRShift { alu_op: pattern0_0.clone(), rd: expr1_0, rn: pattern1_0, rm: pattern2_0, shiftop: pattern3_0, }; let expr3_0 = C::emit(ctx, &expr2_0); let expr4_0 = C::writable_reg_to_reg(ctx, expr1_0); return Some(expr4_0); } // Generated as internal constructor for term alu_rrr_extend. pub fn constructor_alu_rrr_extend( ctx: &mut C, arg0: &ALUOp, arg1: Reg, arg2: Reg, arg3: &ExtendOp, ) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; let pattern2_0 = arg2; let pattern3_0 = arg3; // Rule at src/isa/aarch64/inst.isle line 1448. let expr0_0: Type = I64; let expr1_0 = C::temp_writable_reg(ctx, expr0_0); let expr2_0 = MInst::AluRRRExtend { alu_op: pattern0_0.clone(), rd: expr1_0, rn: pattern1_0, rm: pattern2_0, extendop: pattern3_0.clone(), }; let expr3_0 = C::emit(ctx, &expr2_0); let expr4_0 = C::writable_reg_to_reg(ctx, expr1_0); return Some(expr4_0); } // Generated as internal constructor for term alu_rr_extend_reg. pub fn constructor_alu_rr_extend_reg( ctx: &mut C, arg0: &ALUOp, arg1: Reg, arg2: &ExtendedValue, ) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; let pattern2_0 = arg2; // Rule at src/isa/aarch64/inst.isle line 1456. let expr0_0 = C::put_extended_in_reg(ctx, pattern2_0); let expr1_0 = C::get_extended_op(ctx, pattern2_0); let expr2_0 = constructor_alu_rrr_extend(ctx, pattern0_0, pattern1_0, expr0_0, &expr1_0)?; return Some(expr2_0); } // Generated as internal constructor for term alu_rrrr. pub fn constructor_alu_rrrr( ctx: &mut C, arg0: &ALUOp3, arg1: Reg, arg2: Reg, arg3: Reg, ) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; let pattern2_0 = arg2; let pattern3_0 = arg3; // Rule at src/isa/aarch64/inst.isle line 1463. let expr0_0: Type = I64; let expr1_0 = C::temp_writable_reg(ctx, expr0_0); let expr2_0 = MInst::AluRRRR { alu_op: pattern0_0.clone(), rd: expr1_0, rn: pattern1_0, rm: pattern2_0, ra: pattern3_0, }; let expr3_0 = C::emit(ctx, &expr2_0); let expr4_0 = C::writable_reg_to_reg(ctx, expr1_0); return Some(expr4_0); } // Generated as internal constructor for term bit_rr. pub fn constructor_bit_rr(ctx: &mut C, arg0: &BitOp, arg1: Reg) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; // Rule at src/isa/aarch64/inst.isle line 1470. let expr0_0: Type = I64; let expr1_0 = C::temp_writable_reg(ctx, expr0_0); let expr2_0 = MInst::BitRR { 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 Some(expr4_0); } // Generated as internal constructor for term add64_with_flags. pub fn constructor_add64_with_flags( ctx: &mut C, arg0: Reg, arg1: Reg, ) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; // Rule at src/isa/aarch64/inst.isle line 1477. let expr0_0: Type = I64; let expr1_0 = C::temp_writable_reg(ctx, expr0_0); let expr2_0 = ALUOp::AddS64; let expr3_0 = MInst::AluRRR { alu_op: expr2_0, rd: expr1_0, rn: pattern0_0, rm: pattern1_0, }; let expr4_0 = C::writable_reg_to_reg(ctx, expr1_0); let expr5_0 = ProducesFlags::ProducesFlags { inst: expr3_0, result: expr4_0, }; return Some(expr5_0); } // Generated as internal constructor for term adc64. pub fn constructor_adc64(ctx: &mut C, arg0: Reg, arg1: Reg) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; // Rule at src/isa/aarch64/inst.isle line 1484. let expr0_0: Type = I64; let expr1_0 = C::temp_writable_reg(ctx, expr0_0); let expr2_0 = ALUOp::Adc64; let expr3_0 = MInst::AluRRR { alu_op: expr2_0, rd: expr1_0, rn: pattern0_0, rm: pattern1_0, }; let expr4_0 = C::writable_reg_to_reg(ctx, expr1_0); let expr5_0 = ConsumesFlags::ConsumesFlags { inst: expr3_0, result: expr4_0, }; return Some(expr5_0); } // Generated as internal constructor for term sub64_with_flags. pub fn constructor_sub64_with_flags( ctx: &mut C, arg0: Reg, arg1: Reg, ) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; // Rule at src/isa/aarch64/inst.isle line 1491. let expr0_0: Type = I64; let expr1_0 = C::temp_writable_reg(ctx, expr0_0); let expr2_0 = ALUOp::SubS64; let expr3_0 = MInst::AluRRR { alu_op: expr2_0, rd: expr1_0, rn: pattern0_0, rm: pattern1_0, }; let expr4_0 = C::writable_reg_to_reg(ctx, expr1_0); let expr5_0 = ProducesFlags::ProducesFlags { inst: expr3_0, result: expr4_0, }; return Some(expr5_0); } // Generated as internal constructor for term cmp64_imm. pub fn constructor_cmp64_imm( ctx: &mut C, arg0: Reg, arg1: Imm12, ) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; // Rule at src/isa/aarch64/inst.isle line 1497. let expr0_0 = ALUOp::SubS64; let expr1_0 = C::writable_zero_reg(ctx); let expr2_0 = MInst::AluRRImm12 { alu_op: expr0_0, rd: expr1_0, rn: pattern0_0, imm12: pattern1_0, }; let expr3_0 = C::zero_reg(ctx); let expr4_0 = ProducesFlags::ProducesFlags { inst: expr2_0, result: expr3_0, }; return Some(expr4_0); } // Generated as internal constructor for term sbc64. pub fn constructor_sbc64(ctx: &mut C, arg0: Reg, arg1: Reg) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; // Rule at src/isa/aarch64/inst.isle line 1503. let expr0_0: Type = I64; let expr1_0 = C::temp_writable_reg(ctx, expr0_0); let expr2_0 = ALUOp::Sbc64; let expr3_0 = MInst::AluRRR { alu_op: expr2_0, rd: expr1_0, rn: pattern0_0, rm: pattern1_0, }; let expr4_0 = C::writable_reg_to_reg(ctx, expr1_0); let expr5_0 = ConsumesFlags::ConsumesFlags { inst: expr3_0, result: expr4_0, }; return Some(expr5_0); } // Generated as internal constructor for term vec_misc. pub fn constructor_vec_misc( ctx: &mut C, arg0: &VecMisc2, arg1: Reg, arg2: &VectorSize, ) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; let pattern2_0 = arg2; // Rule at src/isa/aarch64/inst.isle line 1510. 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 Some(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, ) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; let pattern2_0 = arg2; let pattern3_0 = arg3; // Rule at src/isa/aarch64/inst.isle line 1517. 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 Some(expr4_0); } // Generated as internal constructor for term vec_rrrr_long. pub fn constructor_vec_rrrr_long( ctx: &mut C, arg0: &VecRRRLongOp, arg1: Reg, arg2: Reg, arg3: Reg, arg4: bool, ) -> Option { 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 1527. 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 = MInst::VecRRRLong { alu_op: pattern0_0.clone(), rd: expr1_0, rn: pattern2_0, rm: pattern3_0, high_half: pattern4_0, }; let expr5_0 = C::emit(ctx, &expr4_0); let expr6_0 = C::writable_reg_to_reg(ctx, expr1_0); return Some(expr6_0); } // Generated as internal constructor for term vec_rr_narrow. pub fn constructor_vec_rr_narrow( ctx: &mut C, arg0: &VecRRNarrowOp, arg1: Reg, arg2: bool, ) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; let pattern2_0 = arg2; // Rule at src/isa/aarch64/inst.isle line 1535. let expr0_0: Type = I8X16; let expr1_0 = C::temp_writable_reg(ctx, expr0_0); let expr2_0 = MInst::VecRRNarrow { 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 Some(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, ) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; let pattern2_0 = arg2; // Rule at src/isa/aarch64/inst.isle line 1542. 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 Some(expr4_0); } // Generated as internal constructor for term mov_to_fpu. pub fn constructor_mov_to_fpu( ctx: &mut C, arg0: Reg, arg1: &ScalarSize, ) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; // Rule at src/isa/aarch64/inst.isle line 1549. 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 Some(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, ) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; let pattern2_0 = arg2; let pattern3_0 = arg3; // Rule at src/isa/aarch64/inst.isle line 1556. 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 = MInst::MovToVec { rd: expr1_0, rn: pattern1_0, idx: pattern2_0, size: pattern3_0.clone(), }; let expr5_0 = C::emit(ctx, &expr4_0); let expr6_0 = C::writable_reg_to_reg(ctx, expr1_0); return Some(expr6_0); } // Generated as internal constructor for term mov_from_vec. pub fn constructor_mov_from_vec( ctx: &mut C, arg0: Reg, arg1: u8, arg2: &VectorSize, ) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; let pattern2_0 = arg2; // Rule at src/isa/aarch64/inst.isle line 1564. 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 Some(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, ) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; let pattern2_0 = arg2; let pattern3_0 = arg3; // Rule at src/isa/aarch64/inst.isle line 1571. 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 Some(expr4_0); } // Generated as internal constructor for term extend. pub fn constructor_extend( ctx: &mut C, arg0: Reg, arg1: bool, arg2: u8, arg3: u8, ) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; let pattern2_0 = arg2; let pattern3_0 = arg3; // Rule at src/isa/aarch64/inst.isle line 1578. 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 Some(expr4_0); } // Generated as internal constructor for term load_acquire. pub fn constructor_load_acquire(ctx: &mut C, arg0: Type, arg1: Reg) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; // Rule at src/isa/aarch64/inst.isle line 1585. 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: pattern1_0, }; let expr3_0 = C::emit(ctx, &expr2_0); let expr4_0 = C::writable_reg_to_reg(ctx, expr1_0); return Some(expr4_0); } // Generated as internal constructor for term tst64_imm. pub fn constructor_tst64_imm( ctx: &mut C, arg0: Reg, arg1: ImmLogic, ) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; // Rule at src/isa/aarch64/inst.isle line 1595. let expr0_0 = ALUOp::AndS64; let expr1_0 = C::writable_zero_reg(ctx); let expr2_0 = MInst::AluRRImmLogic { alu_op: expr0_0, rd: expr1_0, rn: pattern0_0, imml: pattern1_0, }; let expr3_0 = C::invalid_reg(ctx); let expr4_0 = ProducesFlags::ProducesFlags { inst: expr2_0, result: expr3_0, }; return Some(expr4_0); } // Generated as internal constructor for term csel. pub fn constructor_csel( ctx: &mut C, arg0: &Cond, arg1: Reg, arg2: Reg, ) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; let pattern2_0 = arg2; // Rule at src/isa/aarch64/inst.isle line 1608. 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::ConsumesFlags { inst: expr2_0, result: expr3_0, }; return Some(expr4_0); } // Generated as internal constructor for term add. pub fn constructor_add(ctx: &mut C, arg0: Type, arg1: Reg, arg2: Reg) -> Option { let pattern0_0 = arg0; if pattern0_0 == I64 { let pattern2_0 = arg1; let pattern3_0 = arg2; // Rule at src/isa/aarch64/inst.isle line 1617. let expr0_0 = constructor_add64(ctx, pattern2_0, pattern3_0)?; return Some(expr0_0); } if let Some(pattern1_0) = C::fits_in_32(ctx, pattern0_0) { let pattern2_0 = arg1; let pattern3_0 = arg2; // Rule at src/isa/aarch64/inst.isle line 1616. let expr0_0 = constructor_add32(ctx, pattern2_0, pattern3_0)?; return Some(expr0_0); } return None; } // Generated as internal constructor for term add32. pub fn constructor_add32(ctx: &mut C, arg0: Reg, arg1: Reg) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; // Rule at src/isa/aarch64/inst.isle line 1620. let expr0_0 = ALUOp::Add32; let expr1_0 = constructor_alu_rrr(ctx, &expr0_0, pattern0_0, pattern1_0)?; return Some(expr1_0); } // Generated as internal constructor for term add64. pub fn constructor_add64(ctx: &mut C, arg0: Reg, arg1: Reg) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; // Rule at src/isa/aarch64/inst.isle line 1623. let expr0_0 = ALUOp::Add64; let expr1_0 = constructor_alu_rrr(ctx, &expr0_0, pattern0_0, pattern1_0)?; return Some(expr1_0); } // Generated as internal constructor for term add_imm. pub fn constructor_add_imm( ctx: &mut C, arg0: Type, arg1: Reg, arg2: Imm12, ) -> Option { let pattern0_0 = arg0; if pattern0_0 == I64 { let pattern2_0 = arg1; let pattern3_0 = arg2; // Rule at src/isa/aarch64/inst.isle line 1627. let expr0_0 = constructor_add64_imm(ctx, pattern2_0, pattern3_0)?; return Some(expr0_0); } if let Some(pattern1_0) = C::fits_in_32(ctx, pattern0_0) { let pattern2_0 = arg1; let pattern3_0 = arg2; // Rule at src/isa/aarch64/inst.isle line 1626. let expr0_0 = constructor_add32_imm(ctx, pattern2_0, pattern3_0)?; return Some(expr0_0); } return None; } // Generated as internal constructor for term add32_imm. pub fn constructor_add32_imm(ctx: &mut C, arg0: Reg, arg1: Imm12) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; // Rule at src/isa/aarch64/inst.isle line 1630. let expr0_0 = ALUOp::Add32; let expr1_0 = constructor_alu_rr_imm12(ctx, &expr0_0, pattern0_0, pattern1_0)?; return Some(expr1_0); } // Generated as internal constructor for term add64_imm. pub fn constructor_add64_imm(ctx: &mut C, arg0: Reg, arg1: Imm12) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; // Rule at src/isa/aarch64/inst.isle line 1633. let expr0_0 = ALUOp::Add64; let expr1_0 = constructor_alu_rr_imm12(ctx, &expr0_0, pattern0_0, pattern1_0)?; return Some(expr1_0); } // Generated as internal constructor for term add_extend. pub fn constructor_add_extend( ctx: &mut C, arg0: Type, arg1: Reg, arg2: &ExtendedValue, ) -> Option { let pattern0_0 = arg0; if pattern0_0 == I64 { let pattern2_0 = arg1; let pattern3_0 = arg2; // Rule at src/isa/aarch64/inst.isle line 1637. let expr0_0 = constructor_add64_extend(ctx, pattern2_0, pattern3_0)?; return Some(expr0_0); } if let Some(pattern1_0) = C::fits_in_32(ctx, pattern0_0) { let pattern2_0 = arg1; let pattern3_0 = arg2; // Rule at src/isa/aarch64/inst.isle line 1636. let expr0_0 = constructor_add32_extend(ctx, pattern2_0, pattern3_0)?; return Some(expr0_0); } return None; } // Generated as internal constructor for term add32_extend. pub fn constructor_add32_extend( ctx: &mut C, arg0: Reg, arg1: &ExtendedValue, ) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; // Rule at src/isa/aarch64/inst.isle line 1640. let expr0_0 = ALUOp::Add32; let expr1_0 = constructor_alu_rr_extend_reg(ctx, &expr0_0, pattern0_0, pattern1_0)?; return Some(expr1_0); } // Generated as internal constructor for term add64_extend. pub fn constructor_add64_extend( ctx: &mut C, arg0: Reg, arg1: &ExtendedValue, ) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; // Rule at src/isa/aarch64/inst.isle line 1643. let expr0_0 = ALUOp::Add64; let expr1_0 = constructor_alu_rr_extend_reg(ctx, &expr0_0, pattern0_0, pattern1_0)?; return Some(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, ) -> Option { let pattern0_0 = arg0; if pattern0_0 == I64 { let pattern2_0 = arg1; let pattern3_0 = arg2; let pattern4_0 = arg3; // Rule at src/isa/aarch64/inst.isle line 1647. let expr0_0 = constructor_add64_shift(ctx, pattern2_0, pattern3_0, pattern4_0)?; return Some(expr0_0); } if let Some(pattern1_0) = C::fits_in_32(ctx, pattern0_0) { let pattern2_0 = arg1; let pattern3_0 = arg2; let pattern4_0 = arg3; // Rule at src/isa/aarch64/inst.isle line 1646. let expr0_0 = constructor_add32_shift(ctx, pattern2_0, pattern3_0, pattern4_0)?; return Some(expr0_0); } return None; } // Generated as internal constructor for term add32_shift. pub fn constructor_add32_shift( ctx: &mut C, arg0: Reg, arg1: Reg, arg2: ShiftOpAndAmt, ) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; let pattern2_0 = arg2; // Rule at src/isa/aarch64/inst.isle line 1650. let expr0_0 = ALUOp::Add32; let expr1_0 = constructor_alu_rrr_shift(ctx, &expr0_0, pattern0_0, pattern1_0, pattern2_0)?; return Some(expr1_0); } // Generated as internal constructor for term add64_shift. pub fn constructor_add64_shift( ctx: &mut C, arg0: Reg, arg1: Reg, arg2: ShiftOpAndAmt, ) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; let pattern2_0 = arg2; // Rule at src/isa/aarch64/inst.isle line 1653. let expr0_0 = ALUOp::Add64; let expr1_0 = constructor_alu_rrr_shift(ctx, &expr0_0, pattern0_0, pattern1_0, pattern2_0)?; return Some(expr1_0); } // Generated as internal constructor for term add_vec. pub fn constructor_add_vec( ctx: &mut C, arg0: Reg, arg1: Reg, arg2: &VectorSize, ) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; let pattern2_0 = arg2; // Rule at src/isa/aarch64/inst.isle line 1656. let expr0_0 = VecALUOp::Add; let expr1_0 = constructor_vec_rrr(ctx, &expr0_0, pattern0_0, pattern1_0, pattern2_0)?; return Some(expr1_0); } // Generated as internal constructor for term sub. pub fn constructor_sub(ctx: &mut C, arg0: Type, arg1: Reg, arg2: Reg) -> Option { let pattern0_0 = arg0; if pattern0_0 == I64 { let pattern2_0 = arg1; let pattern3_0 = arg2; // Rule at src/isa/aarch64/inst.isle line 1662. let expr0_0 = constructor_sub64(ctx, pattern2_0, pattern3_0)?; return Some(expr0_0); } if let Some(pattern1_0) = C::fits_in_32(ctx, pattern0_0) { let pattern2_0 = arg1; let pattern3_0 = arg2; // Rule at src/isa/aarch64/inst.isle line 1661. let expr0_0 = constructor_sub32(ctx, pattern2_0, pattern3_0)?; return Some(expr0_0); } return None; } // Generated as internal constructor for term sub32. pub fn constructor_sub32(ctx: &mut C, arg0: Reg, arg1: Reg) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; // Rule at src/isa/aarch64/inst.isle line 1665. let expr0_0 = ALUOp::Sub32; let expr1_0 = constructor_alu_rrr(ctx, &expr0_0, pattern0_0, pattern1_0)?; return Some(expr1_0); } // Generated as internal constructor for term sub64. pub fn constructor_sub64(ctx: &mut C, arg0: Reg, arg1: Reg) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; // Rule at src/isa/aarch64/inst.isle line 1668. let expr0_0 = ALUOp::Sub64; let expr1_0 = constructor_alu_rrr(ctx, &expr0_0, pattern0_0, pattern1_0)?; return Some(expr1_0); } // Generated as internal constructor for term sub_imm. pub fn constructor_sub_imm( ctx: &mut C, arg0: Type, arg1: Reg, arg2: Imm12, ) -> Option { let pattern0_0 = arg0; if pattern0_0 == I64 { let pattern2_0 = arg1; let pattern3_0 = arg2; // Rule at src/isa/aarch64/inst.isle line 1672. let expr0_0 = constructor_sub64_imm(ctx, pattern2_0, pattern3_0)?; return Some(expr0_0); } if let Some(pattern1_0) = C::fits_in_32(ctx, pattern0_0) { let pattern2_0 = arg1; let pattern3_0 = arg2; // Rule at src/isa/aarch64/inst.isle line 1671. let expr0_0 = constructor_sub32_imm(ctx, pattern2_0, pattern3_0)?; return Some(expr0_0); } return None; } // Generated as internal constructor for term sub32_imm. pub fn constructor_sub32_imm(ctx: &mut C, arg0: Reg, arg1: Imm12) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; // Rule at src/isa/aarch64/inst.isle line 1675. let expr0_0 = ALUOp::Sub32; let expr1_0 = constructor_alu_rr_imm12(ctx, &expr0_0, pattern0_0, pattern1_0)?; return Some(expr1_0); } // Generated as internal constructor for term sub64_imm. pub fn constructor_sub64_imm(ctx: &mut C, arg0: Reg, arg1: Imm12) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; // Rule at src/isa/aarch64/inst.isle line 1678. let expr0_0 = ALUOp::Sub64; let expr1_0 = constructor_alu_rr_imm12(ctx, &expr0_0, pattern0_0, pattern1_0)?; return Some(expr1_0); } // Generated as internal constructor for term sub_extend. pub fn constructor_sub_extend( ctx: &mut C, arg0: Type, arg1: Reg, arg2: &ExtendedValue, ) -> Option { let pattern0_0 = arg0; if pattern0_0 == I64 { let pattern2_0 = arg1; let pattern3_0 = arg2; // Rule at src/isa/aarch64/inst.isle line 1682. let expr0_0 = constructor_sub64_extend(ctx, pattern2_0, pattern3_0)?; return Some(expr0_0); } if let Some(pattern1_0) = C::fits_in_32(ctx, pattern0_0) { let pattern2_0 = arg1; let pattern3_0 = arg2; // Rule at src/isa/aarch64/inst.isle line 1681. let expr0_0 = constructor_sub32_extend(ctx, pattern2_0, pattern3_0)?; return Some(expr0_0); } return None; } // Generated as internal constructor for term sub32_extend. pub fn constructor_sub32_extend( ctx: &mut C, arg0: Reg, arg1: &ExtendedValue, ) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; // Rule at src/isa/aarch64/inst.isle line 1685. let expr0_0 = ALUOp::Sub32; let expr1_0 = constructor_alu_rr_extend_reg(ctx, &expr0_0, pattern0_0, pattern1_0)?; return Some(expr1_0); } // Generated as internal constructor for term sub64_extend. pub fn constructor_sub64_extend( ctx: &mut C, arg0: Reg, arg1: &ExtendedValue, ) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; // Rule at src/isa/aarch64/inst.isle line 1688. let expr0_0 = ALUOp::Sub64; let expr1_0 = constructor_alu_rr_extend_reg(ctx, &expr0_0, pattern0_0, pattern1_0)?; return Some(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, ) -> Option { let pattern0_0 = arg0; if pattern0_0 == I64 { let pattern2_0 = arg1; let pattern3_0 = arg2; let pattern4_0 = arg3; // Rule at src/isa/aarch64/inst.isle line 1692. let expr0_0 = constructor_sub64_shift(ctx, pattern2_0, pattern3_0, pattern4_0)?; return Some(expr0_0); } if let Some(pattern1_0) = C::fits_in_32(ctx, pattern0_0) { let pattern2_0 = arg1; let pattern3_0 = arg2; let pattern4_0 = arg3; // Rule at src/isa/aarch64/inst.isle line 1691. let expr0_0 = constructor_sub32_shift(ctx, pattern2_0, pattern3_0, pattern4_0)?; return Some(expr0_0); } return None; } // Generated as internal constructor for term sub32_shift. pub fn constructor_sub32_shift( ctx: &mut C, arg0: Reg, arg1: Reg, arg2: ShiftOpAndAmt, ) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; let pattern2_0 = arg2; // Rule at src/isa/aarch64/inst.isle line 1695. let expr0_0 = ALUOp::Sub32; let expr1_0 = constructor_alu_rrr_shift(ctx, &expr0_0, pattern0_0, pattern1_0, pattern2_0)?; return Some(expr1_0); } // Generated as internal constructor for term sub64_shift. pub fn constructor_sub64_shift( ctx: &mut C, arg0: Reg, arg1: Reg, arg2: ShiftOpAndAmt, ) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; let pattern2_0 = arg2; // Rule at src/isa/aarch64/inst.isle line 1698. let expr0_0 = ALUOp::Sub64; let expr1_0 = constructor_alu_rrr_shift(ctx, &expr0_0, pattern0_0, pattern1_0, pattern2_0)?; return Some(expr1_0); } // Generated as internal constructor for term sub_vec. pub fn constructor_sub_vec( ctx: &mut C, arg0: Reg, arg1: Reg, arg2: &VectorSize, ) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; let pattern2_0 = arg2; // Rule at src/isa/aarch64/inst.isle line 1701. let expr0_0 = VecALUOp::Sub; let expr1_0 = constructor_vec_rrr(ctx, &expr0_0, pattern0_0, pattern1_0, pattern2_0)?; return Some(expr1_0); } // Generated as internal constructor for term madd. pub fn constructor_madd( ctx: &mut C, arg0: Type, arg1: Reg, arg2: Reg, arg3: Reg, ) -> Option { let pattern0_0 = arg0; if pattern0_0 == I64 { let pattern2_0 = arg1; let pattern3_0 = arg2; let pattern4_0 = arg3; // Rule at src/isa/aarch64/inst.isle line 1707. let expr0_0 = constructor_madd64(ctx, pattern2_0, pattern3_0, pattern4_0)?; return Some(expr0_0); } if let Some(pattern1_0) = C::fits_in_32(ctx, pattern0_0) { let pattern2_0 = arg1; let pattern3_0 = arg2; let pattern4_0 = arg3; // Rule at src/isa/aarch64/inst.isle line 1706. let expr0_0 = constructor_madd32(ctx, pattern2_0, pattern3_0, pattern4_0)?; return Some(expr0_0); } return None; } // Generated as internal constructor for term madd32. pub fn constructor_madd32(ctx: &mut C, arg0: Reg, arg1: Reg, arg2: Reg) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; let pattern2_0 = arg2; // Rule at src/isa/aarch64/inst.isle line 1710. let expr0_0 = ALUOp3::MAdd32; let expr1_0 = constructor_alu_rrrr(ctx, &expr0_0, pattern0_0, pattern1_0, pattern2_0)?; return Some(expr1_0); } // Generated as internal constructor for term madd64. pub fn constructor_madd64(ctx: &mut C, arg0: Reg, arg1: Reg, arg2: Reg) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; let pattern2_0 = arg2; // Rule at src/isa/aarch64/inst.isle line 1713. let expr0_0 = ALUOp3::MAdd64; let expr1_0 = constructor_alu_rrrr(ctx, &expr0_0, pattern0_0, pattern1_0, pattern2_0)?; return Some(expr1_0); } // Generated as internal constructor for term msub64. pub fn constructor_msub64(ctx: &mut C, arg0: Reg, arg1: Reg, arg2: Reg) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; let pattern2_0 = arg2; // Rule at src/isa/aarch64/inst.isle line 1718. let expr0_0 = ALUOp3::MSub64; let expr1_0 = constructor_alu_rrrr(ctx, &expr0_0, pattern0_0, pattern1_0, pattern2_0)?; return Some(expr1_0); } // Generated as internal constructor for term uqadd. pub fn constructor_uqadd( ctx: &mut C, arg0: Reg, arg1: Reg, arg2: &VectorSize, ) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; let pattern2_0 = arg2; // Rule at src/isa/aarch64/inst.isle line 1722. let expr0_0 = VecALUOp::Uqadd; let expr1_0 = constructor_vec_rrr(ctx, &expr0_0, pattern0_0, pattern1_0, pattern2_0)?; return Some(expr1_0); } // Generated as internal constructor for term sqadd. pub fn constructor_sqadd( ctx: &mut C, arg0: Reg, arg1: Reg, arg2: &VectorSize, ) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; let pattern2_0 = arg2; // Rule at src/isa/aarch64/inst.isle line 1726. let expr0_0 = VecALUOp::Sqadd; let expr1_0 = constructor_vec_rrr(ctx, &expr0_0, pattern0_0, pattern1_0, pattern2_0)?; return Some(expr1_0); } // Generated as internal constructor for term uqsub. pub fn constructor_uqsub( ctx: &mut C, arg0: Reg, arg1: Reg, arg2: &VectorSize, ) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; let pattern2_0 = arg2; // Rule at src/isa/aarch64/inst.isle line 1730. let expr0_0 = VecALUOp::Uqsub; let expr1_0 = constructor_vec_rrr(ctx, &expr0_0, pattern0_0, pattern1_0, pattern2_0)?; return Some(expr1_0); } // Generated as internal constructor for term sqsub. pub fn constructor_sqsub( ctx: &mut C, arg0: Reg, arg1: Reg, arg2: &VectorSize, ) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; let pattern2_0 = arg2; // Rule at src/isa/aarch64/inst.isle line 1734. let expr0_0 = VecALUOp::Sqsub; let expr1_0 = constructor_vec_rrr(ctx, &expr0_0, pattern0_0, pattern1_0, pattern2_0)?; return Some(expr1_0); } // Generated as internal constructor for term umulh. pub fn constructor_umulh(ctx: &mut C, arg0: Reg, arg1: Reg) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; // Rule at src/isa/aarch64/inst.isle line 1738. let expr0_0 = ALUOp::UMulH; let expr1_0 = constructor_alu_rrr(ctx, &expr0_0, pattern0_0, pattern1_0)?; return Some(expr1_0); } // Generated as internal constructor for term smulh. pub fn constructor_smulh(ctx: &mut C, arg0: Reg, arg1: Reg) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; // Rule at src/isa/aarch64/inst.isle line 1742. let expr0_0 = ALUOp::SMulH; let expr1_0 = constructor_alu_rrr(ctx, &expr0_0, pattern0_0, pattern1_0)?; return Some(expr1_0); } // Generated as internal constructor for term mul. pub fn constructor_mul( ctx: &mut C, arg0: Reg, arg1: Reg, arg2: &VectorSize, ) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; let pattern2_0 = arg2; // Rule at src/isa/aarch64/inst.isle line 1746. let expr0_0 = VecALUOp::Mul; let expr1_0 = constructor_vec_rrr(ctx, &expr0_0, pattern0_0, pattern1_0, pattern2_0)?; return Some(expr1_0); } // Generated as internal constructor for term neg. pub fn constructor_neg(ctx: &mut C, arg0: Reg, arg1: &VectorSize) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; // Rule at src/isa/aarch64/inst.isle line 1750. let expr0_0 = VecMisc2::Neg; let expr1_0 = constructor_vec_misc(ctx, &expr0_0, pattern0_0, pattern1_0)?; return Some(expr1_0); } // Generated as internal constructor for term rev64. pub fn constructor_rev64(ctx: &mut C, arg0: Reg, arg1: &VectorSize) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; // Rule at src/isa/aarch64/inst.isle line 1754. let expr0_0 = VecMisc2::Rev64; let expr1_0 = constructor_vec_misc(ctx, &expr0_0, pattern0_0, pattern1_0)?; return Some(expr1_0); } // Generated as internal constructor for term xtn64. pub fn constructor_xtn64(ctx: &mut C, arg0: Reg, arg1: bool) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; // Rule at src/isa/aarch64/inst.isle line 1758. let expr0_0 = VecRRNarrowOp::Xtn64; let expr1_0 = constructor_vec_rr_narrow(ctx, &expr0_0, pattern0_0, pattern1_0)?; return Some(expr1_0); } // Generated as internal constructor for term addp. pub fn constructor_addp( ctx: &mut C, arg0: Reg, arg1: Reg, arg2: &VectorSize, ) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; let pattern2_0 = arg2; // Rule at src/isa/aarch64/inst.isle line 1762. let expr0_0 = VecALUOp::Addp; let expr1_0 = constructor_vec_rrr(ctx, &expr0_0, pattern0_0, pattern1_0, pattern2_0)?; return Some(expr1_0); } // Generated as internal constructor for term addv. pub fn constructor_addv(ctx: &mut C, arg0: Reg, arg1: &VectorSize) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; // Rule at src/isa/aarch64/inst.isle line 1766. let expr0_0 = VecLanesOp::Addv; let expr1_0 = constructor_vec_lanes(ctx, &expr0_0, pattern0_0, pattern1_0)?; return Some(expr1_0); } // Generated as internal constructor for term shll32. pub fn constructor_shll32(ctx: &mut C, arg0: Reg, arg1: bool) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; // Rule at src/isa/aarch64/inst.isle line 1770. let expr0_0 = VecRRLongOp::Shll32; let expr1_0 = constructor_vec_rr_long(ctx, &expr0_0, pattern0_0, pattern1_0)?; return Some(expr1_0); } // Generated as internal constructor for term umlal32. pub fn constructor_umlal32( ctx: &mut C, arg0: Reg, arg1: Reg, arg2: Reg, arg3: bool, ) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; let pattern2_0 = arg2; let pattern3_0 = arg3; // Rule at src/isa/aarch64/inst.isle line 1774. let expr0_0 = VecRRRLongOp::Umlal32; let expr1_0 = constructor_vec_rrrr_long( ctx, &expr0_0, pattern0_0, pattern1_0, pattern2_0, pattern3_0, )?; return Some(expr1_0); } // Generated as internal constructor for term smull8. pub fn constructor_smull8( ctx: &mut C, arg0: Reg, arg1: Reg, arg2: bool, ) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; let pattern2_0 = arg2; // Rule at src/isa/aarch64/inst.isle line 1778. let expr0_0 = VecRRRLongOp::Smull8; let expr1_0 = constructor_vec_rrr_long(ctx, &expr0_0, pattern0_0, pattern1_0, pattern2_0)?; return Some(expr1_0); } // Generated as internal constructor for term umull8. pub fn constructor_umull8( ctx: &mut C, arg0: Reg, arg1: Reg, arg2: bool, ) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; let pattern2_0 = arg2; // Rule at src/isa/aarch64/inst.isle line 1782. let expr0_0 = VecRRRLongOp::Umull8; let expr1_0 = constructor_vec_rrr_long(ctx, &expr0_0, pattern0_0, pattern1_0, pattern2_0)?; return Some(expr1_0); } // Generated as internal constructor for term smull16. pub fn constructor_smull16( ctx: &mut C, arg0: Reg, arg1: Reg, arg2: bool, ) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; let pattern2_0 = arg2; // Rule at src/isa/aarch64/inst.isle line 1786. let expr0_0 = VecRRRLongOp::Smull16; let expr1_0 = constructor_vec_rrr_long(ctx, &expr0_0, pattern0_0, pattern1_0, pattern2_0)?; return Some(expr1_0); } // Generated as internal constructor for term umull16. pub fn constructor_umull16( ctx: &mut C, arg0: Reg, arg1: Reg, arg2: bool, ) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; let pattern2_0 = arg2; // Rule at src/isa/aarch64/inst.isle line 1790. let expr0_0 = VecRRRLongOp::Umull16; let expr1_0 = constructor_vec_rrr_long(ctx, &expr0_0, pattern0_0, pattern1_0, pattern2_0)?; return Some(expr1_0); } // Generated as internal constructor for term smull32. pub fn constructor_smull32( ctx: &mut C, arg0: Reg, arg1: Reg, arg2: bool, ) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; let pattern2_0 = arg2; // Rule at src/isa/aarch64/inst.isle line 1794. let expr0_0 = VecRRRLongOp::Smull32; let expr1_0 = constructor_vec_rrr_long(ctx, &expr0_0, pattern0_0, pattern1_0, pattern2_0)?; return Some(expr1_0); } // Generated as internal constructor for term umull32. pub fn constructor_umull32( ctx: &mut C, arg0: Reg, arg1: Reg, arg2: bool, ) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; let pattern2_0 = arg2; // Rule at src/isa/aarch64/inst.isle line 1798. let expr0_0 = VecRRRLongOp::Umull32; let expr1_0 = constructor_vec_rrr_long(ctx, &expr0_0, pattern0_0, pattern1_0, pattern2_0)?; return Some(expr1_0); } // Generated as internal constructor for term asr64. pub fn constructor_asr64(ctx: &mut C, arg0: Reg, arg1: Reg) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; // Rule at src/isa/aarch64/inst.isle line 1802. let expr0_0 = ALUOp::Asr64; let expr1_0 = constructor_alu_rrr(ctx, &expr0_0, pattern0_0, pattern1_0)?; return Some(expr1_0); } // Generated as internal constructor for term asr64_imm. pub fn constructor_asr64_imm(ctx: &mut C, arg0: Reg, arg1: ImmShift) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; // Rule at src/isa/aarch64/inst.isle line 1805. let expr0_0 = ALUOp::Asr64; let expr1_0 = constructor_alu_rr_imm_shift(ctx, &expr0_0, pattern0_0, pattern1_0)?; return Some(expr1_0); } // Generated as internal constructor for term lsr32. pub fn constructor_lsr32(ctx: &mut C, arg0: Reg, arg1: Reg) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; // Rule at src/isa/aarch64/inst.isle line 1809. let expr0_0 = ALUOp::Lsr32; let expr1_0 = constructor_alu_rrr(ctx, &expr0_0, pattern0_0, pattern1_0)?; return Some(expr1_0); } // Generated as internal constructor for term lsr32_imm. pub fn constructor_lsr32_imm(ctx: &mut C, arg0: Reg, arg1: ImmShift) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; // Rule at src/isa/aarch64/inst.isle line 1812. let expr0_0 = ALUOp::Lsr32; let expr1_0 = constructor_alu_rr_imm_shift(ctx, &expr0_0, pattern0_0, pattern1_0)?; return Some(expr1_0); } // Generated as internal constructor for term lsr64. pub fn constructor_lsr64(ctx: &mut C, arg0: Reg, arg1: Reg) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; // Rule at src/isa/aarch64/inst.isle line 1815. let expr0_0 = ALUOp::Lsr64; let expr1_0 = constructor_alu_rrr(ctx, &expr0_0, pattern0_0, pattern1_0)?; return Some(expr1_0); } // Generated as internal constructor for term lsr64_imm. pub fn constructor_lsr64_imm(ctx: &mut C, arg0: Reg, arg1: ImmShift) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; // Rule at src/isa/aarch64/inst.isle line 1818. let expr0_0 = ALUOp::Lsr64; let expr1_0 = constructor_alu_rr_imm_shift(ctx, &expr0_0, pattern0_0, pattern1_0)?; return Some(expr1_0); } // Generated as internal constructor for term lsl32. pub fn constructor_lsl32(ctx: &mut C, arg0: Reg, arg1: Reg) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; // Rule at src/isa/aarch64/inst.isle line 1822. let expr0_0 = ALUOp::Lsl32; let expr1_0 = constructor_alu_rrr(ctx, &expr0_0, pattern0_0, pattern1_0)?; return Some(expr1_0); } // Generated as internal constructor for term lsl32_imm. pub fn constructor_lsl32_imm(ctx: &mut C, arg0: Reg, arg1: ImmShift) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; // Rule at src/isa/aarch64/inst.isle line 1825. let expr0_0 = ALUOp::Lsl32; let expr1_0 = constructor_alu_rr_imm_shift(ctx, &expr0_0, pattern0_0, pattern1_0)?; return Some(expr1_0); } // Generated as internal constructor for term lsl64. pub fn constructor_lsl64(ctx: &mut C, arg0: Reg, arg1: Reg) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; // Rule at src/isa/aarch64/inst.isle line 1828. let expr0_0 = ALUOp::Lsl64; let expr1_0 = constructor_alu_rrr(ctx, &expr0_0, pattern0_0, pattern1_0)?; return Some(expr1_0); } // Generated as internal constructor for term lsl64_imm. pub fn constructor_lsl64_imm(ctx: &mut C, arg0: Reg, arg1: ImmShift) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; // Rule at src/isa/aarch64/inst.isle line 1831. let expr0_0 = ALUOp::Lsl64; let expr1_0 = constructor_alu_rr_imm_shift(ctx, &expr0_0, pattern0_0, pattern1_0)?; return Some(expr1_0); } // Generated as internal constructor for term udiv64. pub fn constructor_udiv64(ctx: &mut C, arg0: Reg, arg1: Reg) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; // Rule at src/isa/aarch64/inst.isle line 1835. let expr0_0 = ALUOp::UDiv64; let expr1_0 = constructor_alu_rrr(ctx, &expr0_0, pattern0_0, pattern1_0)?; return Some(expr1_0); } // Generated as internal constructor for term sdiv64. pub fn constructor_sdiv64(ctx: &mut C, arg0: Reg, arg1: Reg) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; // Rule at src/isa/aarch64/inst.isle line 1839. let expr0_0 = ALUOp::SDiv64; let expr1_0 = constructor_alu_rrr(ctx, &expr0_0, pattern0_0, pattern1_0)?; return Some(expr1_0); } // Generated as internal constructor for term not. pub fn constructor_not(ctx: &mut C, arg0: Reg, arg1: &VectorSize) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; // Rule at src/isa/aarch64/inst.isle line 1843. let expr0_0 = VecMisc2::Not; let expr1_0 = constructor_vec_misc(ctx, &expr0_0, pattern0_0, pattern1_0)?; return Some(expr1_0); } // Generated as internal constructor for term orr_not. pub fn constructor_orr_not( ctx: &mut C, arg0: Type, arg1: Reg, arg2: Reg, ) -> Option { let pattern0_0 = arg0; if pattern0_0 == I64 { let pattern2_0 = arg1; let pattern3_0 = arg2; // Rule at src/isa/aarch64/inst.isle line 1849. let expr0_0 = constructor_orr_not64(ctx, pattern2_0, pattern3_0)?; return Some(expr0_0); } if let Some(pattern1_0) = C::fits_in_32(ctx, pattern0_0) { let pattern2_0 = arg1; let pattern3_0 = arg2; // Rule at src/isa/aarch64/inst.isle line 1848. let expr0_0 = constructor_orr_not32(ctx, pattern2_0, pattern3_0)?; return Some(expr0_0); } return None; } // Generated as internal constructor for term orr_not32. pub fn constructor_orr_not32(ctx: &mut C, arg0: Reg, arg1: Reg) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; // Rule at src/isa/aarch64/inst.isle line 1852. let expr0_0 = ALUOp::OrrNot32; let expr1_0 = constructor_alu_rrr(ctx, &expr0_0, pattern0_0, pattern1_0)?; return Some(expr1_0); } // Generated as internal constructor for term orr_not64. pub fn constructor_orr_not64(ctx: &mut C, arg0: Reg, arg1: Reg) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; // Rule at src/isa/aarch64/inst.isle line 1855. let expr0_0 = ALUOp::OrrNot64; let expr1_0 = constructor_alu_rrr(ctx, &expr0_0, pattern0_0, pattern1_0)?; return Some(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, ) -> Option { let pattern0_0 = arg0; if pattern0_0 == I64 { let pattern2_0 = arg1; let pattern3_0 = arg2; let pattern4_0 = arg3; // Rule at src/isa/aarch64/inst.isle line 1859. let expr0_0 = constructor_orr_not_shift64(ctx, pattern2_0, pattern3_0, pattern4_0)?; return Some(expr0_0); } if let Some(pattern1_0) = C::fits_in_32(ctx, pattern0_0) { let pattern2_0 = arg1; let pattern3_0 = arg2; let pattern4_0 = arg3; // Rule at src/isa/aarch64/inst.isle line 1858. let expr0_0 = constructor_orr_not_shift32(ctx, pattern2_0, pattern3_0, pattern4_0)?; return Some(expr0_0); } return None; } // Generated as internal constructor for term orr_not_shift32. pub fn constructor_orr_not_shift32( ctx: &mut C, arg0: Reg, arg1: Reg, arg2: ShiftOpAndAmt, ) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; let pattern2_0 = arg2; // Rule at src/isa/aarch64/inst.isle line 1862. let expr0_0 = ALUOp::OrrNot32; let expr1_0 = constructor_alu_rrr_shift(ctx, &expr0_0, pattern0_0, pattern1_0, pattern2_0)?; return Some(expr1_0); } // Generated as internal constructor for term orr_not_shift64. pub fn constructor_orr_not_shift64( ctx: &mut C, arg0: Reg, arg1: Reg, arg2: ShiftOpAndAmt, ) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; let pattern2_0 = arg2; // Rule at src/isa/aarch64/inst.isle line 1865. let expr0_0 = ALUOp::OrrNot64; let expr1_0 = constructor_alu_rrr_shift(ctx, &expr0_0, pattern0_0, pattern1_0, pattern2_0)?; return Some(expr1_0); } // Generated as internal constructor for term orr32. pub fn constructor_orr32(ctx: &mut C, arg0: Reg, arg1: Reg) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; // Rule at src/isa/aarch64/inst.isle line 1870. let expr0_0 = ALUOp::Orr32; let expr1_0 = constructor_alu_rrr(ctx, &expr0_0, pattern0_0, pattern1_0)?; return Some(expr1_0); } // Generated as internal constructor for term orr32_imm. pub fn constructor_orr32_imm(ctx: &mut C, arg0: Reg, arg1: ImmLogic) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; // Rule at src/isa/aarch64/inst.isle line 1873. let expr0_0 = ALUOp::Orr32; let expr1_0 = constructor_alu_rr_imm_logic(ctx, &expr0_0, pattern0_0, pattern1_0)?; return Some(expr1_0); } // Generated as internal constructor for term orr64. pub fn constructor_orr64(ctx: &mut C, arg0: Reg, arg1: Reg) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; // Rule at src/isa/aarch64/inst.isle line 1876. let expr0_0 = ALUOp::Orr64; let expr1_0 = constructor_alu_rrr(ctx, &expr0_0, pattern0_0, pattern1_0)?; return Some(expr1_0); } // Generated as internal constructor for term orr64_imm. pub fn constructor_orr64_imm(ctx: &mut C, arg0: Reg, arg1: ImmLogic) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; // Rule at src/isa/aarch64/inst.isle line 1879. let expr0_0 = ALUOp::Orr64; let expr1_0 = constructor_alu_rr_imm_logic(ctx, &expr0_0, pattern0_0, pattern1_0)?; return Some(expr1_0); } // Generated as internal constructor for term orr_vec. pub fn constructor_orr_vec( ctx: &mut C, arg0: Reg, arg1: Reg, arg2: &VectorSize, ) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; let pattern2_0 = arg2; // Rule at src/isa/aarch64/inst.isle line 1882. let expr0_0 = VecALUOp::Orr; let expr1_0 = constructor_vec_rrr(ctx, &expr0_0, pattern0_0, pattern1_0, pattern2_0)?; return Some(expr1_0); } // Generated as internal constructor for term and32_imm. pub fn constructor_and32_imm(ctx: &mut C, arg0: Reg, arg1: ImmLogic) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; // Rule at src/isa/aarch64/inst.isle line 1887. let expr0_0 = ALUOp::And32; let expr1_0 = constructor_alu_rr_imm_logic(ctx, &expr0_0, pattern0_0, pattern1_0)?; return Some(expr1_0); } // Generated as internal constructor for term and_vec. pub fn constructor_and_vec( ctx: &mut C, arg0: Reg, arg1: Reg, arg2: &VectorSize, ) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; let pattern2_0 = arg2; // Rule at src/isa/aarch64/inst.isle line 1890. let expr0_0 = VecALUOp::And; let expr1_0 = constructor_vec_rrr(ctx, &expr0_0, pattern0_0, pattern1_0, pattern2_0)?; return Some(expr1_0); } // Generated as internal constructor for term eor_vec. pub fn constructor_eor_vec( ctx: &mut C, arg0: Reg, arg1: Reg, arg2: &VectorSize, ) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; let pattern2_0 = arg2; // Rule at src/isa/aarch64/inst.isle line 1894. let expr0_0 = VecALUOp::Eor; let expr1_0 = constructor_vec_rrr(ctx, &expr0_0, pattern0_0, pattern1_0, pattern2_0)?; return Some(expr1_0); } // Generated as internal constructor for term bic_vec. pub fn constructor_bic_vec( ctx: &mut C, arg0: Reg, arg1: Reg, arg2: &VectorSize, ) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; let pattern2_0 = arg2; // Rule at src/isa/aarch64/inst.isle line 1898. let expr0_0 = VecALUOp::Bic; let expr1_0 = constructor_vec_rrr(ctx, &expr0_0, pattern0_0, pattern1_0, pattern2_0)?; return Some(expr1_0); } // Generated as internal constructor for term sshl. pub fn constructor_sshl( ctx: &mut C, arg0: Reg, arg1: Reg, arg2: &VectorSize, ) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; let pattern2_0 = arg2; // Rule at src/isa/aarch64/inst.isle line 1902. let expr0_0 = VecALUOp::Sshl; let expr1_0 = constructor_vec_rrr(ctx, &expr0_0, pattern0_0, pattern1_0, pattern2_0)?; return Some(expr1_0); } // Generated as internal constructor for term ushl. pub fn constructor_ushl( ctx: &mut C, arg0: Reg, arg1: Reg, arg2: &VectorSize, ) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; let pattern2_0 = arg2; // Rule at src/isa/aarch64/inst.isle line 1906. let expr0_0 = VecALUOp::Ushl; let expr1_0 = constructor_vec_rrr(ctx, &expr0_0, pattern0_0, pattern1_0, pattern2_0)?; return Some(expr1_0); } // Generated as internal constructor for term rotr32. pub fn constructor_rotr32(ctx: &mut C, arg0: Reg, arg1: Reg) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; // Rule at src/isa/aarch64/inst.isle line 1911. let expr0_0 = ALUOp::RotR32; let expr1_0 = constructor_alu_rrr(ctx, &expr0_0, pattern0_0, pattern1_0)?; return Some(expr1_0); } // Generated as internal constructor for term rotr32_imm. pub fn constructor_rotr32_imm(ctx: &mut C, arg0: Reg, arg1: ImmShift) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; // Rule at src/isa/aarch64/inst.isle line 1914. let expr0_0 = ALUOp::RotR32; let expr1_0 = constructor_alu_rr_imm_shift(ctx, &expr0_0, pattern0_0, pattern1_0)?; return Some(expr1_0); } // Generated as internal constructor for term rotr64. pub fn constructor_rotr64(ctx: &mut C, arg0: Reg, arg1: Reg) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; // Rule at src/isa/aarch64/inst.isle line 1917. let expr0_0 = ALUOp::RotR64; let expr1_0 = constructor_alu_rrr(ctx, &expr0_0, pattern0_0, pattern1_0)?; return Some(expr1_0); } // Generated as internal constructor for term rotr64_imm. pub fn constructor_rotr64_imm(ctx: &mut C, arg0: Reg, arg1: ImmShift) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; // Rule at src/isa/aarch64/inst.isle line 1920. let expr0_0 = ALUOp::RotR64; let expr1_0 = constructor_alu_rr_imm_shift(ctx, &expr0_0, pattern0_0, pattern1_0)?; return Some(expr1_0); } // Generated as internal constructor for term rbit32. pub fn constructor_rbit32(ctx: &mut C, arg0: Reg) -> Option { let pattern0_0 = arg0; // Rule at src/isa/aarch64/inst.isle line 1925. let expr0_0 = BitOp::RBit32; let expr1_0 = constructor_bit_rr(ctx, &expr0_0, pattern0_0)?; return Some(expr1_0); } // Generated as internal constructor for term rbit64. pub fn constructor_rbit64(ctx: &mut C, arg0: Reg) -> Option { let pattern0_0 = arg0; // Rule at src/isa/aarch64/inst.isle line 1928. let expr0_0 = BitOp::RBit64; let expr1_0 = constructor_bit_rr(ctx, &expr0_0, pattern0_0)?; return Some(expr1_0); } // Generated as internal constructor for term clz32. pub fn constructor_clz32(ctx: &mut C, arg0: Reg) -> Option { let pattern0_0 = arg0; // Rule at src/isa/aarch64/inst.isle line 1933. let expr0_0 = BitOp::Clz32; let expr1_0 = constructor_bit_rr(ctx, &expr0_0, pattern0_0)?; return Some(expr1_0); } // Generated as internal constructor for term clz64. pub fn constructor_clz64(ctx: &mut C, arg0: Reg) -> Option { let pattern0_0 = arg0; // Rule at src/isa/aarch64/inst.isle line 1936. let expr0_0 = BitOp::Clz64; let expr1_0 = constructor_bit_rr(ctx, &expr0_0, pattern0_0)?; return Some(expr1_0); } // Generated as internal constructor for term cls32. pub fn constructor_cls32(ctx: &mut C, arg0: Reg) -> Option { let pattern0_0 = arg0; // Rule at src/isa/aarch64/inst.isle line 1941. let expr0_0 = BitOp::Cls32; let expr1_0 = constructor_bit_rr(ctx, &expr0_0, pattern0_0)?; return Some(expr1_0); } // Generated as internal constructor for term cls64. pub fn constructor_cls64(ctx: &mut C, arg0: Reg) -> Option { let pattern0_0 = arg0; // Rule at src/isa/aarch64/inst.isle line 1944. let expr0_0 = BitOp::Cls64; let expr1_0 = constructor_bit_rr(ctx, &expr0_0, pattern0_0)?; return Some(expr1_0); } // Generated as internal constructor for term eon32. pub fn constructor_eon32(ctx: &mut C, arg0: Reg, arg1: Reg) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; // Rule at src/isa/aarch64/inst.isle line 1949. let expr0_0 = ALUOp::EorNot32; let expr1_0 = constructor_alu_rrr(ctx, &expr0_0, pattern0_0, pattern1_0)?; return Some(expr1_0); } // Generated as internal constructor for term eon64. pub fn constructor_eon64(ctx: &mut C, arg0: Reg, arg1: Reg) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; // Rule at src/isa/aarch64/inst.isle line 1952. let expr0_0 = ALUOp::EorNot64; let expr1_0 = constructor_alu_rrr(ctx, &expr0_0, pattern0_0, pattern1_0)?; return Some(expr1_0); } // Generated as internal constructor for term vec_cnt. pub fn constructor_vec_cnt(ctx: &mut C, arg0: Reg, arg1: &VectorSize) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; // Rule at src/isa/aarch64/inst.isle line 1957. let expr0_0 = VecMisc2::Cnt; let expr1_0 = constructor_vec_misc(ctx, &expr0_0, pattern0_0, pattern1_0)?; return Some(expr1_0); } // Generated as internal constructor for term imm. pub fn constructor_imm(ctx: &mut C, arg0: Type, arg1: u64) -> Option { let pattern0_0 = arg0; if let Some(pattern1_0) = C::integral_ty(ctx, pattern0_0) { let pattern2_0 = arg1; let closure3 = || { let expr0_0: Type = I64; return Some(expr0_0); }; if let Some(pattern3_0) = closure3() { if let Some(pattern4_0) = C::imm_logic_from_u64(ctx, pattern2_0, pattern3_0) { // Rule at src/isa/aarch64/inst.isle line 1972. let expr0_0 = C::zero_reg(ctx); let expr1_0 = constructor_orr64_imm(ctx, expr0_0, pattern4_0)?; return Some(expr1_0); } } if let Some(pattern3_0) = C::move_wide_const_from_u64(ctx, pattern2_0) { // Rule at src/isa/aarch64/inst.isle line 1964. let expr0_0 = OperandSize::Size64; let expr1_0 = constructor_movz(ctx, pattern3_0, &expr0_0)?; return Some(expr1_0); } if let Some(pattern3_0) = C::move_wide_const_from_negated_u64(ctx, pattern2_0) { // Rule at src/isa/aarch64/inst.isle line 1968. let expr0_0 = OperandSize::Size64; let expr1_0 = constructor_movn(ctx, pattern3_0, &expr0_0)?; return Some(expr1_0); } // Rule at src/isa/aarch64/inst.isle line 1979. let expr0_0 = C::load_constant64_full(ctx, pattern2_0); return Some(expr0_0); } return None; } // Generated as internal constructor for term put_in_reg_sext32. pub fn constructor_put_in_reg_sext32(ctx: &mut C, arg0: Value) -> Option { 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 1990. let expr0_0 = C::put_in_reg(ctx, pattern0_0); return Some(expr0_0); } if pattern1_0 == I64 { // Rule at src/isa/aarch64/inst.isle line 1991. let expr0_0 = C::put_in_reg(ctx, pattern0_0); return Some(expr0_0); } if let Some(pattern2_0) = C::fits_in_32(ctx, pattern1_0) { // Rule at src/isa/aarch64/inst.isle line 1986. 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 = 32; let expr4_0 = constructor_extend(ctx, expr0_0, expr1_0, expr2_0, expr3_0)?; return Some(expr4_0); } return None; } // Generated as internal constructor for term put_in_reg_zext32. pub fn constructor_put_in_reg_zext32(ctx: &mut C, arg0: Value) -> Option { 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 1999. let expr0_0 = C::put_in_reg(ctx, pattern0_0); return Some(expr0_0); } if pattern1_0 == I64 { // Rule at src/isa/aarch64/inst.isle line 2000. let expr0_0 = C::put_in_reg(ctx, pattern0_0); return Some(expr0_0); } if let Some(pattern2_0) = C::fits_in_32(ctx, pattern1_0) { // Rule at src/isa/aarch64/inst.isle line 1995. 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 = 32; let expr4_0 = constructor_extend(ctx, expr0_0, expr1_0, expr2_0, expr3_0)?; return Some(expr4_0); } return None; } // Generated as internal constructor for term put_in_reg_sext64. pub fn constructor_put_in_reg_sext64(ctx: &mut C, arg0: Value) -> Option { 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 2008. let expr0_0 = C::put_in_reg(ctx, pattern0_0); return Some(expr0_0); } if let Some(pattern2_0) = C::fits_in_32(ctx, pattern1_0) { // Rule at src/isa/aarch64/inst.isle line 2004. 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 = 64; let expr4_0 = constructor_extend(ctx, expr0_0, expr1_0, expr2_0, expr3_0)?; return Some(expr4_0); } return None; } // Generated as internal constructor for term put_in_reg_zext64. pub fn constructor_put_in_reg_zext64(ctx: &mut C, arg0: Value) -> Option { 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 2016. let expr0_0 = C::put_in_reg(ctx, pattern0_0); return Some(expr0_0); } if let Some(pattern2_0) = C::fits_in_32(ctx, pattern1_0) { // Rule at src/isa/aarch64/inst.isle line 2012. 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 = 64; let expr4_0 = constructor_extend(ctx, expr0_0, expr1_0, expr2_0, expr3_0)?; return Some(expr4_0); } return None; } // Generated as internal constructor for term trap_if_zero_divisor. pub fn constructor_trap_if_zero_divisor(ctx: &mut C, arg0: Reg) -> Option { let pattern0_0 = arg0; // Rule at src/isa/aarch64/inst.isle line 2021. 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 Some(pattern0_0); } // Generated as internal constructor for term size_from_ty. pub fn constructor_size_from_ty(ctx: &mut C, arg0: Type) -> Option { let pattern0_0 = arg0; if pattern0_0 == I64 { // Rule at src/isa/aarch64/inst.isle line 2027. let expr0_0 = OperandSize::Size64; return Some(expr0_0); } if let Some(pattern1_0) = C::fits_in_32(ctx, pattern0_0) { // Rule at src/isa/aarch64/inst.isle line 2026. let expr0_0 = OperandSize::Size32; return Some(expr0_0); } return None; } // 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, ) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; let pattern2_0 = arg2; // Rule at src/isa/aarch64/inst.isle line 2033. let expr0_0 = constructor_adds_op(ctx, pattern0_0)?; let expr1_0 = C::writable_zero_reg(ctx); let expr2_0: u8 = 1; let expr3_0 = C::u8_into_imm12(ctx, expr2_0); let expr4_0 = MInst::AluRRImm12 { alu_op: expr0_0, rd: expr1_0, rn: pattern2_0, imm12: expr3_0, }; let expr5_0 = C::emit(ctx, &expr4_0); let expr6_0 = constructor_size_from_ty(ctx, pattern0_0)?; let expr7_0: u8 = 1; let expr8_0 = C::u8_into_uimm5(ctx, expr7_0); let expr9_0: bool = false; let expr10_0: bool = false; let expr11_0: bool = false; let expr12_0: bool = false; let expr13_0 = C::nzcv(ctx, expr9_0, expr10_0, expr11_0, expr12_0); let expr14_0 = Cond::Eq; let expr15_0 = MInst::CCmpImm { size: expr6_0, rn: pattern1_0, imm: expr8_0, nzcv: expr13_0, cond: expr14_0, }; let expr16_0 = C::emit(ctx, &expr15_0); let expr17_0 = Cond::Vs; let expr18_0 = C::cond_br_cond(ctx, &expr17_0); let expr19_0 = C::trap_code_integer_overflow(ctx); let expr20_0 = MInst::TrapIf { kind: expr18_0, trap_code: expr19_0, }; let expr21_0 = C::emit(ctx, &expr20_0); return Some(pattern1_0); } // Generated as internal constructor for term adds_op. pub fn constructor_adds_op(ctx: &mut C, arg0: Type) -> Option { let pattern0_0 = arg0; if pattern0_0 == I64 { // Rule at src/isa/aarch64/inst.isle line 2053. let expr0_0 = ALUOp::AddS64; return Some(expr0_0); } if let Some(pattern1_0) = C::fits_in_32(ctx, pattern0_0) { // Rule at src/isa/aarch64/inst.isle line 2052. let expr0_0 = ALUOp::AddS32; return Some(expr0_0); } return None; } // 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, ) -> Option { 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 closure7 = || { return Some(pattern1_0); }; if let Some(pattern7_0) = closure7() { if let Some(pattern8_0) = C::imm_logic_from_imm64(ctx, pattern5_1, pattern7_0) { let pattern9_0 = arg3; // Rule at src/isa/aarch64/inst.isle line 2083. let expr0_0 = C::put_in_reg(ctx, pattern9_0); let expr1_0 = constructor_alu_rr_imm_logic(ctx, pattern0_0, expr0_0, pattern8_0)?; return Some(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 closure12 = || { return Some(pattern1_0); }; if let Some(pattern12_0) = closure12() { if let Some(pattern13_0) = C::lshl_from_imm64(ctx, pattern10_1, pattern12_0) { let pattern14_0 = arg3; // Rule at src/isa/aarch64/inst.isle line 2089. let expr0_0 = C::put_in_reg(ctx, pattern14_0); let expr1_0 = C::put_in_reg(ctx, pattern7_0); let expr2_0 = constructor_alu_rrr_shift( ctx, pattern0_0, expr0_0, expr1_0, pattern13_0, )?; return Some(expr2_0); } } } } } } } _ => {} } } 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 closure8 = || { return Some(pattern1_0); }; if let Some(pattern8_0) = closure8() { if let Some(pattern9_0) = C::imm_logic_from_imm64(ctx, pattern6_1, pattern8_0) { // Rule at src/isa/aarch64/inst.isle line 2081. let expr0_0 = C::put_in_reg(ctx, pattern2_0); let expr1_0 = constructor_alu_rr_imm_logic(ctx, pattern0_0, expr0_0, pattern9_0)?; return Some(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 closure13 = || { return Some(pattern1_0); }; if let Some(pattern13_0) = closure13() { if let Some(pattern14_0) = C::lshl_from_imm64(ctx, pattern11_1, pattern13_0) { // Rule at src/isa/aarch64/inst.isle line 2087. 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, expr0_0, expr1_0, pattern14_0, )?; return Some(expr2_0); } } } } } } } _ => {} } } // Rule at src/isa/aarch64/inst.isle line 2077. 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, expr0_0, expr1_0)?; return Some(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, ) -> Option { 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 closure8 = || { return Some(pattern1_0); }; if let Some(pattern8_0) = closure8() { if let Some(pattern9_0) = C::imm_logic_from_imm64(ctx, pattern6_1, pattern8_0) { // Rule at src/isa/aarch64/inst.isle line 2097. let expr0_0 = C::put_in_reg(ctx, pattern2_0); let expr1_0 = constructor_alu_rr_imm_logic(ctx, pattern0_0, expr0_0, pattern9_0)?; return Some(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 closure13 = || { return Some(pattern1_0); }; if let Some(pattern13_0) = closure13() { if let Some(pattern14_0) = C::lshl_from_imm64(ctx, pattern11_1, pattern13_0) { // Rule at src/isa/aarch64/inst.isle line 2099. 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, expr0_0, expr1_0, pattern14_0, )?; return Some(expr2_0); } } } } } } } _ => {} } } // Rule at src/isa/aarch64/inst.isle line 2095. 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, expr0_0, expr1_0)?; return Some(expr2_0); } // Generated as internal constructor for term i128_alu_bitop. pub fn constructor_i128_alu_bitop( ctx: &mut C, arg0: &ALUOp, arg1: Value, arg2: Value, ) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; let pattern2_0 = arg2; // Rule at src/isa/aarch64/inst.isle line 2107. let expr0_0 = C::put_in_regs(ctx, pattern1_0); let expr1_0: usize = 0; let expr2_0 = C::value_regs_get(ctx, expr0_0, expr1_0); let expr3_0: usize = 1; let expr4_0 = C::value_regs_get(ctx, expr0_0, expr3_0); let expr5_0 = C::put_in_regs(ctx, pattern2_0); let expr6_0: usize = 0; let expr7_0 = C::value_regs_get(ctx, expr5_0, expr6_0); let expr8_0: usize = 1; let expr9_0 = C::value_regs_get(ctx, expr5_0, expr8_0); let expr10_0 = constructor_alu_rrr(ctx, pattern0_0, expr2_0, expr7_0)?; let expr11_0 = constructor_alu_rrr(ctx, pattern0_0, expr4_0, expr9_0)?; let expr12_0 = C::value_regs(ctx, expr10_0, expr11_0); return Some(expr12_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::Unary { opcode: ref pattern5_0, arg: pattern5_1, } = &pattern4_0 { match &pattern5_0 { &Opcode::Bitrev => { // Rule at src/isa/aarch64/lower.isle line 1013. let expr0_0 = C::put_in_reg(ctx, pattern5_1); let expr1_0 = constructor_rbit32(ctx, expr0_0)?; let expr2_0: u8 = 24; let expr3_0 = C::imm_shift_from_u8(ctx, expr2_0); let expr4_0 = constructor_lsr32_imm(ctx, expr1_0, expr3_0)?; let expr5_0 = C::value_reg(ctx, expr4_0); return Some(expr5_0); } &Opcode::Clz => { // Rule at src/isa/aarch64/lower.isle line 1038. let expr0_0 = constructor_put_in_reg_zext32(ctx, pattern5_1)?; let expr1_0 = constructor_clz32(ctx, expr0_0)?; let expr2_0: u8 = 24; let expr3_0 = C::u8_into_imm12(ctx, expr2_0); let expr4_0 = constructor_sub32_imm(ctx, expr1_0, expr3_0)?; let expr5_0 = C::value_reg(ctx, expr4_0); return Some(expr5_0); } &Opcode::Cls => { // Rule at src/isa/aarch64/lower.isle line 1095. let expr0_0 = constructor_put_in_reg_zext32(ctx, pattern5_1)?; let expr1_0 = constructor_cls32(ctx, expr0_0)?; let expr2_0: u8 = 24; let expr3_0 = C::u8_into_imm12(ctx, expr2_0); let expr4_0 = constructor_sub32_imm(ctx, expr1_0, expr3_0)?; let expr5_0 = C::value_reg(ctx, expr4_0); return Some(expr5_0); } &Opcode::Ctz => { // Rule at src/isa/aarch64/lower.isle line 1073. let expr0_0 = C::put_in_reg(ctx, pattern5_1); let expr1_0 = constructor_rbit32(ctx, expr0_0)?; let expr2_0: Type = I32; let expr3_0: u64 = 8388608; let expr4_0 = C::u64_into_imm_logic(ctx, expr2_0, expr3_0); let expr5_0 = constructor_orr32_imm(ctx, expr1_0, expr4_0)?; let expr6_0 = constructor_clz32(ctx, expr5_0)?; let expr7_0 = C::value_reg(ctx, expr6_0); return Some(expr7_0); } &Opcode::Popcnt => { // Rule at src/isa/aarch64/lower.isle line 1152. 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 = 0; let expr6_0 = VectorSize::Size8x16; let expr7_0 = constructor_mov_from_vec(ctx, expr4_0, expr5_0, &expr6_0)?; let expr8_0 = C::value_reg(ctx, expr7_0); return Some(expr8_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/aarch64/lower.isle line 1019. let expr0_0 = C::put_in_reg(ctx, pattern5_1); let expr1_0 = constructor_rbit32(ctx, expr0_0)?; let expr2_0: u8 = 16; let expr3_0 = C::imm_shift_from_u8(ctx, expr2_0); let expr4_0 = constructor_lsr32_imm(ctx, expr1_0, expr3_0)?; let expr5_0 = C::value_reg(ctx, expr4_0); return Some(expr5_0); } &Opcode::Clz => { // Rule at src/isa/aarch64/lower.isle line 1041. let expr0_0 = constructor_put_in_reg_zext32(ctx, pattern5_1)?; let expr1_0 = constructor_clz32(ctx, expr0_0)?; let expr2_0: u8 = 16; let expr3_0 = C::u8_into_imm12(ctx, expr2_0); let expr4_0 = constructor_sub32_imm(ctx, expr1_0, expr3_0)?; let expr5_0 = C::value_reg(ctx, expr4_0); return Some(expr5_0); } &Opcode::Cls => { // Rule at src/isa/aarch64/lower.isle line 1098. let expr0_0 = constructor_put_in_reg_zext32(ctx, pattern5_1)?; let expr1_0 = constructor_cls32(ctx, expr0_0)?; let expr2_0: u8 = 16; let expr3_0 = C::u8_into_imm12(ctx, expr2_0); let expr4_0 = constructor_sub32_imm(ctx, expr1_0, expr3_0)?; let expr5_0 = C::value_reg(ctx, expr4_0); return Some(expr5_0); } &Opcode::Ctz => { // Rule at src/isa/aarch64/lower.isle line 1076. let expr0_0 = C::put_in_reg(ctx, pattern5_1); let expr1_0 = constructor_rbit32(ctx, expr0_0)?; let expr2_0: Type = I32; let expr3_0: u64 = 32768; let expr4_0 = C::u64_into_imm_logic(ctx, expr2_0, expr3_0); let expr5_0 = constructor_orr32_imm(ctx, expr1_0, expr4_0)?; let expr6_0 = constructor_clz32(ctx, expr5_0)?; let expr7_0 = C::value_reg(ctx, expr6_0); return Some(expr7_0); } &Opcode::Popcnt => { // Rule at src/isa/aarch64/lower.isle line 1160. 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 = 0; let expr8_0 = VectorSize::Size8x16; let expr9_0 = constructor_mov_from_vec(ctx, expr6_0, expr7_0, &expr8_0)?; let expr10_0 = C::value_reg(ctx, expr9_0); return Some(expr10_0); } _ => {} } } } if pattern2_0 == I32 { 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::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 closure12 = || { let expr0_0: Type = I32; return Some(expr0_0); }; if let Some(pattern12_0) = closure12() { if let Some(pattern13_0) = C::imm_shift_from_imm64( ctx, pattern10_1, pattern12_0, ) { // Rule at src/isa/aarch64/lower.isle line 896. let expr0_0 = C::put_in_reg(ctx, pattern7_0); let expr1_0: Type = I32; let expr2_0 = C::negate_imm_shift(ctx, expr1_0, pattern13_0); let expr3_0 = constructor_rotr32_imm(ctx, expr0_0, expr2_0)?; let expr4_0 = C::value_reg(ctx, expr3_0); return Some(expr4_0); } } } } } // Rule at src/isa/aarch64/lower.isle line 886. let expr0_0 = C::zero_reg(ctx); let expr1_0 = C::put_in_reg(ctx, pattern7_1); let expr2_0 = constructor_sub32(ctx, expr0_0, expr1_0)?; let expr3_0 = C::put_in_reg(ctx, pattern7_0); let expr4_0 = constructor_rotr32(ctx, expr3_0, expr2_0)?; let expr5_0 = C::value_reg(ctx, expr4_0); return Some(expr5_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 closure12 = || { let expr0_0: Type = I32; return Some(expr0_0); }; if let Some(pattern12_0) = closure12() { if let Some(pattern13_0) = C::imm_shift_from_imm64( ctx, pattern10_1, pattern12_0, ) { // Rule at src/isa/aarch64/lower.isle line 940. let expr0_0 = C::put_in_reg(ctx, pattern7_0); let expr1_0 = constructor_rotr32_imm( ctx, expr0_0, pattern13_0, )?; let expr2_0 = C::value_reg(ctx, expr1_0); return Some(expr2_0); } } } } } // Rule at src/isa/aarch64/lower.isle line 928. let expr0_0 = C::put_in_reg(ctx, pattern7_0); let expr1_0 = C::put_in_reg(ctx, pattern7_1); let expr2_0 = constructor_rotr32(ctx, expr0_0, expr1_0)?; let expr3_0 = C::value_reg(ctx, expr2_0); return Some(expr3_0); } _ => {} } } &InstructionData::Unary { opcode: ref pattern5_0, arg: pattern5_1, } => { match &pattern5_0 { &Opcode::Bitrev => { // Rule at src/isa/aarch64/lower.isle line 1022. let expr0_0 = C::put_in_reg(ctx, pattern5_1); let expr1_0 = constructor_rbit32(ctx, expr0_0)?; let expr2_0 = C::value_reg(ctx, expr1_0); return Some(expr2_0); } &Opcode::Clz => { // Rule at src/isa/aarch64/lower.isle line 1044. let expr0_0 = C::put_in_reg(ctx, pattern5_1); let expr1_0 = constructor_clz32(ctx, expr0_0)?; let expr2_0 = C::value_reg(ctx, expr1_0); return Some(expr2_0); } &Opcode::Cls => { // Rule at src/isa/aarch64/lower.isle line 1101. let expr0_0 = C::put_in_reg(ctx, pattern5_1); let expr1_0 = constructor_cls32(ctx, expr0_0)?; let expr2_0 = C::value_reg(ctx, expr1_0); return Some(expr2_0); } &Opcode::Ctz => { // Rule at src/isa/aarch64/lower.isle line 1079. let expr0_0 = C::put_in_reg(ctx, pattern5_1); let expr1_0 = constructor_rbit32(ctx, expr0_0)?; let expr2_0 = constructor_clz32(ctx, expr1_0)?; let expr3_0 = C::value_reg(ctx, expr2_0); return Some(expr3_0); } &Opcode::Popcnt => { // Rule at src/isa/aarch64/lower.isle line 1168. 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 = 0; let expr8_0 = VectorSize::Size8x16; let expr9_0 = constructor_mov_from_vec(ctx, expr6_0, expr7_0, &expr8_0)?; let expr10_0 = C::value_reg(ctx, expr9_0); return Some(expr10_0); } _ => {} } } _ => {} } } if pattern2_0 == I64 { 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::Umulhi => { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, &pattern5_1); // Rule at src/isa/aarch64/lower.isle line 374. let expr0_0 = C::put_in_reg(ctx, pattern7_0); let expr1_0 = C::put_in_reg(ctx, pattern7_1); let expr2_0 = constructor_umulh(ctx, expr0_0, expr1_0)?; let expr3_0 = C::value_reg(ctx, expr2_0); return Some(expr3_0); } &Opcode::Smulhi => { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, &pattern5_1); // Rule at src/isa/aarch64/lower.isle line 360. let expr0_0 = C::put_in_reg(ctx, pattern7_0); let expr1_0 = C::put_in_reg(ctx, pattern7_1); let expr2_0 = constructor_smulh(ctx, expr0_0, expr1_0)?; let expr3_0 = C::value_reg(ctx, expr2_0); return Some(expr3_0); } &Opcode::Band => { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, &pattern5_1); // Rule at src/isa/aarch64/lower.isle line 609. let expr0_0 = ALUOp::And64; 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 = C::value_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 622. let expr0_0 = ALUOp::Orr64; 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 = C::value_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 635. let expr0_0 = ALUOp::Eor64; 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 = C::value_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 648. let expr0_0 = ALUOp::AndNot64; 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 = C::value_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 661. let expr0_0 = ALUOp::OrrNot64; 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 = C::value_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 671. let expr0_0 = ALUOp::EorNot64; 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 = C::value_reg(ctx, expr2_0); return Some(expr3_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 closure12 = || { let expr0_0: Type = I64; return Some(expr0_0); }; if let Some(pattern12_0) = closure12() { if let Some(pattern13_0) = C::imm_shift_from_imm64( ctx, pattern10_1, pattern12_0, ) { // Rule at src/isa/aarch64/lower.isle line 900. let expr0_0 = C::put_in_reg(ctx, pattern7_0); let expr1_0: Type = I64; let expr2_0 = C::negate_imm_shift(ctx, expr1_0, pattern13_0); let expr3_0 = constructor_rotr64_imm(ctx, expr0_0, expr2_0)?; let expr4_0 = C::value_reg(ctx, expr3_0); return Some(expr4_0); } } } } } // Rule at src/isa/aarch64/lower.isle line 891. let expr0_0 = C::zero_reg(ctx); let expr1_0 = C::put_in_reg(ctx, pattern7_1); let expr2_0 = constructor_sub64(ctx, expr0_0, expr1_0)?; let expr3_0 = C::put_in_reg(ctx, pattern7_0); let expr4_0 = constructor_rotr64(ctx, expr3_0, expr2_0)?; let expr5_0 = C::value_reg(ctx, expr4_0); return Some(expr5_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 closure12 = || { let expr0_0: Type = I64; return Some(expr0_0); }; if let Some(pattern12_0) = closure12() { if let Some(pattern13_0) = C::imm_shift_from_imm64( ctx, pattern10_1, pattern12_0, ) { // Rule at src/isa/aarch64/lower.isle line 944. let expr0_0 = C::put_in_reg(ctx, pattern7_0); let expr1_0 = constructor_rotr64_imm( ctx, expr0_0, pattern13_0, )?; let expr2_0 = C::value_reg(ctx, expr1_0); return Some(expr2_0); } } } } } // Rule at src/isa/aarch64/lower.isle line 932. let expr0_0 = C::put_in_reg(ctx, pattern7_0); let expr1_0 = C::put_in_reg(ctx, pattern7_1); let expr2_0 = constructor_rotr64(ctx, expr0_0, expr1_0)?; let expr3_0 = C::value_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 683. let expr0_0 = ALUOp::Lsl64; 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 = C::value_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 771. let expr0_0 = ALUOp::Lsr64; 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 = C::value_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 820. let expr0_0 = ALUOp::Asr64; 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 = C::value_reg(ctx, expr3_0); return Some(expr4_0); } _ => {} } } &InstructionData::Unary { opcode: ref pattern5_0, arg: pattern5_1, } => { match &pattern5_0 { &Opcode::Bitrev => { // Rule at src/isa/aarch64/lower.isle line 1025. let expr0_0 = C::put_in_reg(ctx, pattern5_1); let expr1_0 = constructor_rbit64(ctx, expr0_0)?; let expr2_0 = C::value_reg(ctx, expr1_0); return Some(expr2_0); } &Opcode::Clz => { // Rule at src/isa/aarch64/lower.isle line 1047. let expr0_0 = C::put_in_reg(ctx, pattern5_1); let expr1_0 = constructor_clz64(ctx, expr0_0)?; let expr2_0 = C::value_reg(ctx, expr1_0); return Some(expr2_0); } &Opcode::Cls => { // Rule at src/isa/aarch64/lower.isle line 1104. let expr0_0 = C::put_in_reg(ctx, pattern5_1); let expr1_0 = constructor_cls64(ctx, expr0_0)?; let expr2_0 = C::value_reg(ctx, expr1_0); return Some(expr2_0); } &Opcode::Ctz => { // Rule at src/isa/aarch64/lower.isle line 1082. let expr0_0 = C::put_in_reg(ctx, pattern5_1); let expr1_0 = constructor_rbit64(ctx, expr0_0)?; let expr2_0 = constructor_clz64(ctx, expr1_0)?; let expr3_0 = C::value_reg(ctx, expr2_0); return Some(expr3_0); } &Opcode::Popcnt => { // Rule at src/isa/aarch64/lower.isle line 1176. 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 = 0; let expr8_0 = VectorSize::Size8x16; let expr9_0 = constructor_mov_from_vec(ctx, expr6_0, expr7_0, &expr8_0)?; let expr10_0 = C::value_reg(ctx, expr9_0); return Some(expr10_0); } _ => {} } } _ => {} } } if pattern2_0 == I128 { 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); // Rule at src/isa/aarch64/lower.isle line 79. let expr0_0 = C::put_in_regs(ctx, pattern7_0); let expr1_0: usize = 0; let expr2_0 = C::value_regs_get(ctx, expr0_0, expr1_0); let expr3_0: usize = 1; 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 = 0; let expr7_0 = C::value_regs_get(ctx, expr5_0, expr6_0); let expr8_0: usize = 1; let expr9_0 = C::value_regs_get(ctx, expr5_0, expr8_0); let expr10_0 = constructor_add64_with_flags(ctx, expr2_0, expr7_0)?; let expr11_0 = constructor_adc64(ctx, expr4_0, expr9_0)?; let expr12_0 = constructor_with_flags(ctx, &expr10_0, &expr11_0)?; return Some(expr12_0); } &Opcode::Isub => { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, &pattern5_1); // Rule at src/isa/aarch64/lower.isle line 130. let expr0_0 = C::put_in_regs(ctx, pattern7_0); let expr1_0: usize = 0; let expr2_0 = C::value_regs_get(ctx, expr0_0, expr1_0); let expr3_0: usize = 1; 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 = 0; let expr7_0 = C::value_regs_get(ctx, expr5_0, expr6_0); let expr8_0: usize = 1; let expr9_0 = C::value_regs_get(ctx, expr5_0, expr8_0); let expr10_0 = constructor_sub64_with_flags(ctx, expr2_0, expr7_0)?; let expr11_0 = constructor_sbc64(ctx, expr4_0, expr9_0)?; let expr12_0 = constructor_with_flags(ctx, &expr10_0, &expr11_0)?; return Some(expr12_0); } &Opcode::Imul => { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, &pattern5_1); // Rule at src/isa/aarch64/lower.isle line 185. let expr0_0 = C::put_in_regs(ctx, pattern7_0); let expr1_0: usize = 0; let expr2_0 = C::value_regs_get(ctx, expr0_0, expr1_0); let expr3_0: usize = 1; 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 = 0; let expr7_0 = C::value_regs_get(ctx, expr5_0, expr6_0); let expr8_0: usize = 1; 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_madd64(ctx, expr2_0, expr9_0, expr10_0)?; let expr12_0 = constructor_madd64(ctx, expr4_0, expr7_0, expr11_0)?; let expr13_0 = C::zero_reg(ctx); let expr14_0 = constructor_madd64(ctx, expr2_0, expr7_0, expr13_0)?; let expr15_0 = C::value_regs(ctx, expr14_0, expr12_0); return Some(expr15_0); } &Opcode::Band => { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, &pattern5_1); // Rule at src/isa/aarch64/lower.isle line 612. let expr0_0 = ALUOp::And64; let expr1_0 = constructor_i128_alu_bitop(ctx, &expr0_0, pattern7_0, pattern7_1)?; return Some(expr1_0); } &Opcode::Bor => { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, &pattern5_1); // Rule at src/isa/aarch64/lower.isle line 625. let expr0_0 = ALUOp::Orr64; let expr1_0 = constructor_i128_alu_bitop(ctx, &expr0_0, pattern7_0, pattern7_1)?; return Some(expr1_0); } &Opcode::Bxor => { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, &pattern5_1); // Rule at src/isa/aarch64/lower.isle line 638. let expr0_0 = ALUOp::Eor64; let expr1_0 = constructor_i128_alu_bitop(ctx, &expr0_0, pattern7_0, pattern7_1)?; return Some(expr1_0); } &Opcode::BandNot => { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, &pattern5_1); // Rule at src/isa/aarch64/lower.isle line 651. let expr0_0 = ALUOp::AndNot64; let expr1_0 = constructor_i128_alu_bitop(ctx, &expr0_0, pattern7_0, pattern7_1)?; return Some(expr1_0); } &Opcode::BorNot => { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, &pattern5_1); // Rule at src/isa/aarch64/lower.isle line 664. let expr0_0 = ALUOp::OrrNot64; let expr1_0 = constructor_i128_alu_bitop(ctx, &expr0_0, pattern7_0, pattern7_1)?; return Some(expr1_0); } &Opcode::BxorNot => { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, &pattern5_1); // Rule at src/isa/aarch64/lower.isle line 674. let expr0_0 = ALUOp::EorNot64; let expr1_0 = constructor_i128_alu_bitop(ctx, &expr0_0, pattern7_0, pattern7_1)?; return Some(expr1_0); } &Opcode::Rotl => { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, &pattern5_1); // Rule at src/isa/aarch64/lower.isle line 909. let expr0_0 = C::put_in_regs(ctx, pattern7_0); let expr1_0 = C::put_in_regs(ctx, pattern7_1); let expr2_0: usize = 0; let expr3_0 = C::value_regs_get(ctx, expr1_0, expr2_0); let expr4_0: Type = I64; let expr5_0: u64 = 128; let expr6_0 = constructor_imm(ctx, expr4_0, expr5_0)?; let expr7_0 = constructor_sub64(ctx, expr6_0, expr3_0)?; let expr8_0 = constructor_lower_shl128(ctx, expr0_0, expr3_0)?; let expr9_0 = constructor_lower_ushr128(ctx, expr0_0, expr7_0)?; let expr10_0: usize = 0; let expr11_0 = C::value_regs_get(ctx, expr8_0, expr10_0); let expr12_0: usize = 0; let expr13_0 = C::value_regs_get(ctx, expr9_0, expr12_0); let expr14_0 = constructor_orr64(ctx, expr11_0, expr13_0)?; let expr15_0: usize = 1; let expr16_0 = C::value_regs_get(ctx, expr8_0, expr15_0); let expr17_0: usize = 1; let expr18_0 = C::value_regs_get(ctx, expr9_0, expr17_0); let expr19_0 = constructor_orr64(ctx, expr16_0, expr18_0)?; let expr20_0 = C::value_regs(ctx, expr14_0, expr19_0); return Some(expr20_0); } &Opcode::Rotr => { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, &pattern5_1); // Rule at src/isa/aarch64/lower.isle line 996. let expr0_0 = C::put_in_regs(ctx, pattern7_0); let expr1_0 = C::put_in_regs(ctx, pattern7_1); let expr2_0: usize = 0; let expr3_0 = C::value_regs_get(ctx, expr1_0, expr2_0); let expr4_0: Type = I64; let expr5_0: u64 = 128; let expr6_0 = constructor_imm(ctx, expr4_0, expr5_0)?; let expr7_0 = constructor_sub64(ctx, expr6_0, expr3_0)?; let expr8_0 = constructor_lower_ushr128(ctx, expr0_0, expr3_0)?; let expr9_0 = constructor_lower_shl128(ctx, expr0_0, expr7_0)?; let expr10_0: usize = 1; let expr11_0 = C::value_regs_get(ctx, expr8_0, expr10_0); let expr12_0: usize = 1; let expr13_0 = C::value_regs_get(ctx, expr9_0, expr12_0); let expr14_0 = constructor_orr64(ctx, expr11_0, expr13_0)?; let expr15_0: usize = 0; let expr16_0 = C::value_regs_get(ctx, expr8_0, expr15_0); let expr17_0: usize = 0; let expr18_0 = C::value_regs_get(ctx, expr9_0, expr17_0); let expr19_0 = constructor_orr64(ctx, expr16_0, expr18_0)?; let expr20_0 = C::value_regs(ctx, expr19_0, expr14_0); return Some(expr20_0); } &Opcode::Ishl => { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, &pattern5_1); // Rule at src/isa/aarch64/lower.isle line 687. let expr0_0 = C::put_in_regs(ctx, pattern7_0); let expr1_0 = C::put_in_regs(ctx, pattern7_1); let expr2_0: usize = 0; let expr3_0 = C::value_regs_get(ctx, expr1_0, expr2_0); let expr4_0 = constructor_lower_shl128(ctx, expr0_0, 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 775. let expr0_0 = C::put_in_regs(ctx, pattern7_0); let expr1_0 = C::put_in_regs(ctx, pattern7_1); let expr2_0: usize = 0; let expr3_0 = C::value_regs_get(ctx, expr1_0, expr2_0); let expr4_0 = constructor_lower_ushr128(ctx, expr0_0, 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 824. let expr0_0 = C::put_in_regs(ctx, pattern7_0); let expr1_0 = C::put_in_regs(ctx, pattern7_1); let expr2_0: usize = 0; let expr3_0 = C::value_regs_get(ctx, expr1_0, expr2_0); let expr4_0 = constructor_lower_sshr128(ctx, expr0_0, expr3_0)?; return Some(expr4_0); } _ => {} } } &InstructionData::Unary { opcode: ref pattern5_0, arg: pattern5_1, } => { match &pattern5_0 { &Opcode::Bnot => { // Rule at src/isa/aarch64/lower.isle line 590. let expr0_0 = C::put_in_regs(ctx, pattern5_1); let expr1_0: usize = 0; let expr2_0 = C::value_regs_get(ctx, expr0_0, expr1_0); let expr3_0: usize = 1; let expr4_0 = C::value_regs_get(ctx, expr0_0, expr3_0); let expr5_0 = C::zero_reg(ctx); let expr6_0 = constructor_orr_not64(ctx, expr5_0, expr2_0)?; let expr7_0 = C::zero_reg(ctx); let expr8_0 = constructor_orr_not64(ctx, expr7_0, expr4_0)?; let expr9_0 = C::value_regs(ctx, expr6_0, expr8_0); return Some(expr9_0); } &Opcode::Bitrev => { // Rule at src/isa/aarch64/lower.isle line 1028. let expr0_0 = C::put_in_regs(ctx, pattern5_1); let expr1_0: usize = 0; let expr2_0 = C::value_regs_get(ctx, expr0_0, expr1_0); let expr3_0 = constructor_rbit64(ctx, expr2_0)?; let expr4_0: usize = 1; let expr5_0 = C::value_regs_get(ctx, expr0_0, expr4_0); let expr6_0 = constructor_rbit64(ctx, expr5_0)?; let expr7_0 = C::value_regs(ctx, expr6_0, expr3_0); return Some(expr7_0); } &Opcode::Clz => { // Rule at src/isa/aarch64/lower.isle line 1050. let expr0_0 = C::put_in_regs(ctx, pattern5_1); let expr1_0 = constructor_lower_clz128(ctx, expr0_0)?; return Some(expr1_0); } &Opcode::Cls => { // Rule at src/isa/aarch64/lower.isle line 1116. let expr0_0 = C::put_in_regs(ctx, pattern5_1); let expr1_0: usize = 0; let expr2_0 = C::value_regs_get(ctx, expr0_0, expr1_0); let expr3_0: usize = 1; let expr4_0 = C::value_regs_get(ctx, expr0_0, expr3_0); let expr5_0 = constructor_cls64(ctx, expr2_0)?; let expr6_0 = constructor_cls64(ctx, expr4_0)?; let expr7_0 = constructor_eon64(ctx, expr4_0, expr2_0)?; let expr8_0: u8 = 63; let expr9_0 = C::imm_shift_from_u8(ctx, expr8_0); let expr10_0 = constructor_lsr64_imm(ctx, expr7_0, expr9_0)?; let expr11_0 = constructor_madd64(ctx, expr5_0, expr10_0, expr10_0)?; let expr12_0: u8 = 63; let expr13_0 = C::u8_into_imm12(ctx, expr12_0); let expr14_0 = constructor_cmp64_imm(ctx, expr6_0, expr13_0)?; let expr15_0 = Cond::Eq; let expr16_0 = C::zero_reg(ctx); let expr17_0 = constructor_csel(ctx, &expr15_0, expr11_0, expr16_0)?; let expr18_0 = constructor_with_flags_1(ctx, &expr14_0, &expr17_0)?; let expr19_0 = constructor_add64(ctx, expr18_0, expr6_0)?; let expr20_0: Type = I64; let expr21_0: u64 = 0; let expr22_0 = constructor_imm(ctx, expr20_0, expr21_0)?; let expr23_0 = C::value_regs(ctx, expr19_0, expr22_0); return Some(expr23_0); } &Opcode::Ctz => { // Rule at src/isa/aarch64/lower.isle line 1085. let expr0_0 = C::put_in_regs(ctx, pattern5_1); let expr1_0: usize = 0; let expr2_0 = C::value_regs_get(ctx, expr0_0, expr1_0); let expr3_0 = constructor_rbit64(ctx, expr2_0)?; let expr4_0: usize = 1; let expr5_0 = C::value_regs_get(ctx, expr0_0, expr4_0); let expr6_0 = constructor_rbit64(ctx, expr5_0)?; let expr7_0 = C::value_regs(ctx, expr6_0, expr3_0); let expr8_0 = constructor_lower_clz128(ctx, expr7_0)?; return Some(expr8_0); } &Opcode::Popcnt => { // Rule at src/isa/aarch64/lower.isle line 1184. let expr0_0 = C::put_in_regs(ctx, pattern5_1); let expr1_0: usize = 0; 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 = 1; let expr6_0 = C::value_regs_get(ctx, expr0_0, expr5_0); let expr7_0: u8 = 1; 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 = 0; let expr15_0 = VectorSize::Size8x16; let expr16_0 = constructor_mov_from_vec(ctx, expr13_0, expr14_0, &expr15_0)?; let expr17_0: Type = I64; let expr18_0: u64 = 0; let expr19_0 = constructor_imm(ctx, expr17_0, expr18_0)?; let expr20_0 = C::value_regs(ctx, expr16_0, expr19_0); return Some(expr20_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 514. let expr0_0 = C::put_in_reg(ctx, pattern9_1); let expr1_0 = constructor_vector_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: u64 = 0; let expr5_0 = constructor_imm(ctx, expr3_0, expr4_0)?; let expr6_0 = C::value_regs(ctx, expr2_0, expr5_0); return Some(expr6_0); } } } // Rule at src/isa/aarch64/lower.isle line 509. let expr0_0 = constructor_put_in_reg_zext64(ctx, pattern5_1)?; let expr1_0: Type = I64; let expr2_0: u64 = 0; let expr3_0 = constructor_imm(ctx, expr1_0, expr2_0)?; let expr4_0 = C::value_regs(ctx, expr0_0, expr3_0); return Some(expr4_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 562. let expr0_0 = C::put_in_reg(ctx, pattern9_1); let expr1_0 = VectorSize::Size64x2; let expr2_0 = constructor_mov_from_vec( ctx, expr0_0, pattern13_0, &expr1_0, )?; let expr3_0: u8 = 63; let expr4_0 = C::imm_shift_from_u8(ctx, expr3_0); let expr5_0 = constructor_asr64_imm(ctx, expr2_0, expr4_0)?; let expr6_0 = C::value_regs(ctx, expr2_0, expr5_0); return Some(expr6_0); } 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 549. 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: u8 = 63; let expr6_0 = C::imm_shift_from_u8(ctx, expr5_0); let expr7_0 = constructor_asr64_imm(ctx, expr4_0, expr6_0)?; let expr8_0 = C::value_regs(ctx, expr4_0, expr7_0); return Some(expr8_0); } } } } // Rule at src/isa/aarch64/lower.isle line 537. let expr0_0 = constructor_put_in_reg_sext64(ctx, pattern5_1)?; let expr1_0: u8 = 63; let expr2_0 = C::imm_shift_from_u8(ctx, expr1_0); let expr3_0 = constructor_asr64_imm(ctx, expr0_0, expr2_0)?; let expr4_0 = C::value_regs(ctx, expr0_0, 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 1194. 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 = C::value_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 { if let &Opcode::Imul = &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 { 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 287. 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 = C::value_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 293. 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 = C::value_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 299. 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 = C::value_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 305. 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 = C::value_reg(ctx, expr3_0); return Some(expr4_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 { if let &Opcode::Imul = &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 { 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 311. 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 = C::value_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 317. 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 = C::value_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 323. 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 = C::value_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 329. 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 = C::value_reg(ctx, expr3_0); return Some(expr4_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); 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 335. 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 = C::value_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 341. 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 = C::value_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 347. 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 = C::value_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 353. 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 = C::value_reg(ctx, expr3_0); return Some(expr4_0); } } } } } } _ => {} } } } // Rule at src/isa/aarch64/lower.isle line 246. 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: bool = false; let expr7_0 = constructor_xtn64(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: bool = false; let expr11_0 = constructor_xtn64(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 = C::value_reg(ctx, expr15_0); return Some(expr16_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 22. let expr0_0: u64 = 0; let expr1_0 = constructor_imm(ctx, pattern2_0, expr0_0)?; let expr2_0 = C::value_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/aarch64/lower.isle line 9. let expr0_0 = constructor_imm(ctx, pattern2_0, pattern6_0)?; let expr1_0 = C::value_reg(ctx, expr0_0); return Some(expr1_0); } } &InstructionData::UnaryBool { opcode: ref pattern4_0, imm: pattern4_1, } => { if let &Opcode::Bconst = &pattern4_0 { if pattern4_1 == true { // Rule at src/isa/aarch64/lower.isle line 17. let expr0_0: u64 = 1; let expr1_0 = constructor_imm(ctx, pattern2_0, expr0_0)?; let expr2_0 = C::value_reg(ctx, expr1_0); return Some(expr2_0); } if pattern4_1 == false { // Rule at src/isa/aarch64/lower.isle line 14. let expr0_0: u64 = 0; let expr1_0 = constructor_imm(ctx, pattern2_0, expr0_0)?; let expr2_0 = C::value_reg(ctx, expr1_0); return Some(expr2_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 75. 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); 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 126. 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); return Some(expr4_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); 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 closure12 = || { return Some(pattern3_0); }; if let Some(pattern12_0) = closure12() { if let Some(pattern13_0) = C::imm_shift_from_imm64(ctx, pattern10_1, pattern12_0) { // Rule at src/isa/aarch64/lower.isle line 874. let expr0_0 = constructor_put_in_reg_zext32(ctx, pattern7_0)?; let expr1_0 = C::negate_imm_shift(ctx, pattern3_0, pattern13_0); let expr2_0 = constructor_small_rotr_imm( ctx, pattern3_0, expr0_0, expr1_0, )?; let expr3_0 = C::value_reg(ctx, expr2_0); return Some(expr3_0); } } } } } // Rule at src/isa/aarch64/lower.isle line 869. let expr0_0 = C::zero_reg(ctx); let expr1_0 = C::put_in_reg(ctx, pattern7_1); let expr2_0 = constructor_sub32(ctx, expr0_0, expr1_0)?; let expr3_0 = constructor_put_in_reg_zext32(ctx, pattern7_0)?; let expr4_0 = constructor_small_rotr(ctx, pattern3_0, expr3_0, expr2_0)?; let expr5_0 = C::value_reg(ctx, expr4_0); return Some(expr5_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 closure12 = || { return Some(pattern3_0); }; if let Some(pattern12_0) = closure12() { if let Some(pattern13_0) = C::imm_shift_from_imm64(ctx, pattern10_1, pattern12_0) { // Rule at src/isa/aarch64/lower.isle line 936. let expr0_0 = constructor_put_in_reg_zext32(ctx, pattern7_0)?; let expr1_0 = constructor_small_rotr_imm( ctx, pattern3_0, expr0_0, pattern13_0, )?; let expr2_0 = C::value_reg(ctx, expr1_0); return Some(expr2_0); } } } } } // Rule at src/isa/aarch64/lower.isle line 924. let expr0_0 = constructor_put_in_reg_zext32(ctx, pattern7_0)?; let expr1_0 = C::put_in_reg(ctx, pattern7_1); let expr2_0 = constructor_small_rotr(ctx, pattern3_0, expr0_0, expr1_0)?; let expr3_0 = C::value_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::Umulhi => { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, &pattern5_1); // Rule at src/isa/aarch64/lower.isle line 377. 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 = C::zero_reg(ctx); let expr3_0 = constructor_madd64(ctx, expr0_0, expr1_0, expr2_0)?; let expr4_0 = C::ty_bits(ctx, pattern3_0); let expr5_0 = C::imm_shift_from_u8(ctx, expr4_0); let expr6_0 = constructor_lsr64_imm(ctx, expr3_0, expr5_0)?; let expr7_0 = C::value_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/aarch64/lower.isle line 363. 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 = C::zero_reg(ctx); let expr3_0 = constructor_madd64(ctx, expr0_0, expr1_0, expr2_0)?; let expr4_0 = C::ty_bits(ctx, pattern3_0); let expr5_0 = C::imm_shift_from_u8(ctx, expr4_0); let expr6_0 = constructor_asr64_imm(ctx, expr3_0, expr5_0)?; let expr7_0 = C::value_reg(ctx, expr6_0); return Some(expr7_0); } &Opcode::Band => { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, &pattern5_1); // Rule at src/isa/aarch64/lower.isle line 606. let expr0_0 = ALUOp::And32; let expr1_0 = constructor_alu_rs_imm_logic_commutative( ctx, &expr0_0, pattern3_0, pattern7_0, pattern7_1, )?; let expr2_0 = C::value_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 619. let expr0_0 = ALUOp::Orr32; let expr1_0 = constructor_alu_rs_imm_logic_commutative( ctx, &expr0_0, pattern3_0, pattern7_0, pattern7_1, )?; let expr2_0 = C::value_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 632. let expr0_0 = ALUOp::Eor32; let expr1_0 = constructor_alu_rs_imm_logic_commutative( ctx, &expr0_0, pattern3_0, pattern7_0, pattern7_1, )?; let expr2_0 = C::value_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 645. let expr0_0 = ALUOp::AndNot32; let expr1_0 = constructor_alu_rs_imm_logic( ctx, &expr0_0, pattern3_0, pattern7_0, pattern7_1, )?; let expr2_0 = C::value_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 658. let expr0_0 = ALUOp::OrrNot32; let expr1_0 = constructor_alu_rs_imm_logic( ctx, &expr0_0, pattern3_0, pattern7_0, pattern7_1, )?; let expr2_0 = C::value_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 668. let expr0_0 = ALUOp::EorNot32; let expr1_0 = constructor_alu_rs_imm_logic( ctx, &expr0_0, pattern3_0, pattern7_0, pattern7_1, )?; let expr2_0 = C::value_reg(ctx, expr1_0); return Some(expr2_0); } &Opcode::Ishl => { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, &pattern5_1); // Rule at src/isa/aarch64/lower.isle line 679. let expr0_0 = ALUOp::Lsl32; 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 = C::value_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 767. let expr0_0 = ALUOp::Lsr32; 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 = C::value_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/aarch64/lower.isle line 816. let expr0_0 = ALUOp::Asr32; 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 = C::value_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::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_0) { 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 37. 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 = C::value_reg(ctx, expr1_0); return Some(expr2_0); } if let Some(pattern13_0) = C::imm12_from_negated_u64(ctx, pattern12_0) { // Rule at src/isa/aarch64/lower.isle line 45. 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 = C::value_reg(ctx, expr1_0); return Some(expr2_0); } } } &InstructionData::Binary { opcode: ref pattern10_0, args: ref pattern10_1, } => { 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 70. 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 = C::value_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 closure17 = || { return Some(pattern3_0); }; if let Some(pattern17_0) = closure17() { if let Some(pattern18_0) = C::lshl_from_imm64( ctx, pattern15_1, pattern17_0, ) { // Rule at src/isa/aarch64/lower.isle line 62. 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, pattern18_0, )?; let expr3_0 = C::value_reg(ctx, expr2_0); return Some(expr3_0); } } } } } } _ => {} } } _ => {} } } if let Some(pattern8_0) = C::extended_value_from_value(ctx, pattern7_0) { // Rule at src/isa/aarch64/lower.isle line 53. 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 = C::value_reg(ctx, expr1_0); return Some(expr2_0); } 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 34. 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 = C::value_reg(ctx, expr1_0); return Some(expr2_0); } if let Some(pattern13_0) = C::imm12_from_negated_u64(ctx, pattern12_0) { // Rule at src/isa/aarch64/lower.isle line 42. 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 = C::value_reg(ctx, expr1_0); return Some(expr2_0); } } } &InstructionData::Binary { opcode: ref pattern10_0, args: ref pattern10_1, } => { 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 67. 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 = C::value_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 closure17 = || { return Some(pattern3_0); }; if let Some(pattern17_0) = closure17() { if let Some(pattern18_0) = C::lshl_from_imm64( ctx, pattern15_1, pattern17_0, ) { // Rule at src/isa/aarch64/lower.isle line 58. 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, pattern18_0, )?; let expr3_0 = C::value_reg(ctx, expr2_0); return Some(expr3_0); } } } } } } _ => {} } } _ => {} } } if let Some(pattern8_0) = C::extended_value_from_value(ctx, pattern7_1) { // Rule at src/isa/aarch64/lower.isle line 50. 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 = C::value_reg(ctx, expr1_0); return Some(expr2_0); } // Rule at src/isa/aarch64/lower.isle line 30. 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 = C::value_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); 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 106. 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 = C::value_reg(ctx, expr1_0); return Some(expr2_0); } if let Some(pattern13_0) = C::imm12_from_negated_u64(ctx, pattern12_0) { // Rule at src/isa/aarch64/lower.isle line 111. 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 = C::value_reg(ctx, expr1_0); return Some(expr2_0); } } } &InstructionData::Binary { opcode: ref pattern10_0, args: ref pattern10_1, } => { 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 closure17 = || { return Some(pattern3_0); }; if let Some(pattern17_0) = closure17() { if let Some(pattern18_0) = C::lshl_from_imm64( ctx, pattern15_1, pattern17_0, ) { // Rule at src/isa/aarch64/lower.isle line 121. 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, pattern18_0, )?; let expr3_0 = C::value_reg(ctx, expr2_0); return Some(expr3_0); } } } } } } } _ => {} } } if let Some(pattern8_0) = C::extended_value_from_value(ctx, pattern7_1) { // Rule at src/isa/aarch64/lower.isle line 116. 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 = C::value_reg(ctx, expr1_0); return Some(expr2_0); } // Rule at src/isa/aarch64/lower.isle line 102. 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 = C::value_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 181. 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 = C::value_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 393. 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 = constructor_udiv64(ctx, expr0_0, expr1_0)?; let expr3_0 = C::value_reg(ctx, expr2_0); return Some(expr3_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 441. let expr0_0 = constructor_put_in_reg_sext64(ctx, pattern7_0)?; let expr1_0 = constructor_imm(ctx, pattern3_0, pattern12_0)?; let expr2_0 = constructor_sdiv64(ctx, expr0_0, expr1_0)?; let expr3_0 = C::value_reg(ctx, expr2_0); return Some(expr3_0); } } } } // Rule at src/isa/aarch64/lower.isle line 426. 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 = constructor_sdiv64(ctx, expr2_0, expr1_0)?; let expr4_0 = C::value_reg(ctx, expr3_0); return Some(expr4_0); } &Opcode::Urem => { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, &pattern5_1); // Rule at src/isa/aarch64/lower.isle line 469. 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 = constructor_udiv64(ctx, expr0_0, expr1_0)?; let expr3_0 = constructor_msub64(ctx, expr2_0, expr1_0, expr0_0)?; let expr4_0 = C::value_reg(ctx, expr3_0); return Some(expr4_0); } &Opcode::Srem => { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, &pattern5_1); // Rule at src/isa/aarch64/lower.isle line 478. 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_sdiv64(ctx, expr0_0, expr1_0)?; let expr3_0 = constructor_msub64(ctx, expr2_0, expr1_0, expr0_0)?; let expr4_0 = C::value_reg(ctx, expr3_0); return Some(expr4_0); } _ => {} } } &InstructionData::Unary { opcode: ref pattern5_0, arg: pattern5_1, } => { match &pattern5_0 { &Opcode::Ineg => { // Rule at src/isa/aarch64/lower.isle line 171. 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 = C::value_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 closure16 = || { return Some(pattern3_0); }; if let Some(pattern16_0) = closure16() { if let Some(pattern17_0) = C::lshl_from_imm64( ctx, pattern14_1, pattern16_0, ) { // Rule at src/isa/aarch64/lower.isle line 585. 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, pattern17_0, )?; let expr3_0 = C::value_reg(ctx, expr2_0); return Some(expr3_0); } } } } } } } } // Rule at src/isa/aarch64/lower.isle line 580. 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 = C::value_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 496. let expr0_0 = C::put_in_reg(ctx, pattern9_1); let expr1_0 = constructor_vector_size(ctx, pattern11_0)?; let expr2_0 = constructor_mov_from_vec( ctx, expr0_0, pattern12_0, &expr1_0, )?; let expr3_0 = C::value_reg(ctx, expr2_0); return Some(expr3_0); } } } let pattern7_0 = C::value_type(ctx, pattern5_1); if let Some(pattern8_0) = C::sinkable_atomic_load(ctx, pattern5_1) { // Rule at src/isa/aarch64/lower.isle line 503. let expr0_0 = C::sink_atomic_load(ctx, &pattern8_0); let expr1_0 = constructor_load_acquire(ctx, pattern7_0, expr0_0)?; let expr2_0 = C::value_reg(ctx, expr1_0); return Some(expr2_0); } // Rule at src/isa/aarch64/lower.isle line 491. 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 = C::value_reg(ctx, expr4_0); return Some(expr5_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); let pattern12_0 = C::u8_from_uimm8(ctx, pattern9_2); // Rule at src/isa/aarch64/lower.isle line 528. 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 = C::value_reg(ctx, expr3_0); return Some(expr4_0); } } } let pattern7_0 = C::value_type(ctx, pattern5_1); // Rule at src/isa/aarch64/lower.isle line 523. 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 = C::value_reg(ctx, expr4_0); return Some(expr5_0); } _ => {} } } _ => {} } } if let Some(pattern3_0) = C::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::UaddSat => { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, &pattern5_1); // Rule at src/isa/aarch64/lower.isle line 150. 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 = C::value_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 155. 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 = C::value_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 160. 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 = C::value_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 165. 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 = C::value_reg(ctx, expr3_0); return Some(expr4_0); } &Opcode::Band => { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, &pattern5_1); // Rule at src/isa/aarch64/lower.isle line 614. 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 = C::value_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 627. 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 = C::value_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 640. 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 = C::value_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 653. 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 = C::value_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 717. let expr0_0 = constructor_vector_size(ctx, pattern3_0)?; let expr1_0 = C::put_in_reg(ctx, pattern7_1); let expr2_0 = constructor_vec_dup(ctx, expr1_0, &expr0_0)?; let expr3_0 = C::put_in_reg(ctx, pattern7_0); let expr4_0 = constructor_sshl(ctx, expr3_0, expr2_0, &expr0_0)?; let expr5_0 = C::value_reg(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 779. let expr0_0 = constructor_vector_size(ctx, pattern3_0)?; let expr1_0 = C::zero_reg(ctx); let expr2_0 = C::put_in_reg(ctx, pattern7_1); let expr3_0 = constructor_sub32(ctx, expr1_0, expr2_0)?; let expr4_0 = constructor_vec_dup(ctx, expr3_0, &expr0_0)?; let expr5_0 = C::put_in_reg(ctx, pattern7_0); let expr6_0 = constructor_ushl(ctx, expr5_0, expr4_0, &expr0_0)?; let expr7_0 = C::value_reg(ctx, expr6_0); return Some(expr7_0); } &Opcode::Sshr => { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, &pattern5_1); // Rule at src/isa/aarch64/lower.isle line 830. let expr0_0 = constructor_vector_size(ctx, pattern3_0)?; let expr1_0 = C::zero_reg(ctx); let expr2_0 = C::put_in_reg(ctx, pattern7_1); let expr3_0 = constructor_sub32(ctx, expr1_0, expr2_0)?; let expr4_0 = constructor_vec_dup(ctx, expr3_0, &expr0_0)?; let expr5_0 = C::put_in_reg(ctx, pattern7_0); let expr6_0 = constructor_sshl(ctx, expr5_0, expr4_0, &expr0_0)?; let expr7_0 = C::value_reg(ctx, expr6_0); return Some(expr7_0); } _ => {} } } &InstructionData::Unary { opcode: ref pattern5_0, arg: pattern5_1, } => { match &pattern5_0 { &Opcode::Ineg => { // Rule at src/isa/aarch64/lower.isle line 175. 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 = C::value_reg(ctx, expr2_0); return Some(expr3_0); } &Opcode::Bnot => { // Rule at src/isa/aarch64/lower.isle line 601. 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 = C::value_reg(ctx, expr2_0); return Some(expr3_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 214. 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 = C::value_reg(ctx, expr3_0); return Some(expr4_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) -> Option { 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 403. let expr0_0 = constructor_imm(ctx, pattern1_0, pattern6_0)?; return Some(expr0_0); } } } } // Rule at src/isa/aarch64/lower.isle line 398. let expr0_0 = constructor_put_in_reg_zext64(ctx, pattern0_0)?; let expr1_0 = constructor_trap_if_zero_divisor(ctx, expr0_0)?; return Some(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) -> Option { 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 451. let expr0_0 = constructor_imm(ctx, pattern1_0, pattern6_0)?; return Some(expr0_0); } } } } // Rule at src/isa/aarch64/lower.isle line 446. let expr0_0 = constructor_put_in_reg_sext64(ctx, pattern0_0)?; let expr1_0 = constructor_trap_if_zero_divisor(ctx, expr0_0)?; return Some(expr1_0); } // Generated as internal constructor for term lower_shl128. pub fn constructor_lower_shl128( ctx: &mut C, arg0: ValueRegs, arg1: Reg, ) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; // Rule at src/isa/aarch64/lower.isle line 700. let expr0_0: usize = 0; let expr1_0 = C::value_regs_get(ctx, pattern0_0, expr0_0); let expr2_0: usize = 1; let expr3_0 = C::value_regs_get(ctx, pattern0_0, expr2_0); let expr4_0 = constructor_lsl64(ctx, expr1_0, pattern1_0)?; let expr5_0 = constructor_lsl64(ctx, expr3_0, pattern1_0)?; let expr6_0 = C::zero_reg(ctx); let expr7_0 = constructor_orr_not32(ctx, expr6_0, pattern1_0)?; let expr8_0: u8 = 1; let expr9_0 = C::imm_shift_from_u8(ctx, expr8_0); let expr10_0 = constructor_lsr64_imm(ctx, expr1_0, expr9_0)?; let expr11_0 = constructor_lsr64(ctx, expr10_0, expr7_0)?; let expr12_0 = constructor_orr64(ctx, expr5_0, expr11_0)?; let expr13_0: Type = I64; let expr14_0: u64 = 64; let expr15_0 = C::u64_into_imm_logic(ctx, expr13_0, expr14_0); let expr16_0 = constructor_tst64_imm(ctx, pattern1_0, expr15_0)?; let expr17_0 = Cond::Ne; let expr18_0 = C::zero_reg(ctx); let expr19_0 = constructor_csel(ctx, &expr17_0, expr18_0, expr4_0)?; let expr20_0 = Cond::Ne; let expr21_0 = constructor_csel(ctx, &expr20_0, expr4_0, expr12_0)?; let expr22_0 = constructor_with_flags_2(ctx, &expr16_0, &expr19_0, &expr21_0)?; return Some(expr22_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, ) -> Option { 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 closure8 = || { return Some(pattern1_0); }; if let Some(pattern8_0) = closure8() { if let Some(pattern9_0) = C::imm_shift_from_imm64(ctx, pattern6_1, pattern8_0) { // Rule at src/isa/aarch64/lower.isle line 761. let expr0_0 = constructor_alu_rr_imm_shift(ctx, pattern0_0, pattern2_0, pattern9_0)?; return Some(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 752. let expr0_0 = C::put_in_regs(ctx, pattern4_0); let expr1_0: usize = 0; let expr2_0 = C::value_regs_get(ctx, expr0_0, expr1_0); let expr3_0 = constructor_alu_rrr(ctx, pattern0_0, pattern3_0, expr2_0)?; return Some(expr3_0); } if pattern1_0 == I64 { let pattern3_0 = arg2; let pattern4_0 = arg3; // Rule at src/isa/aarch64/lower.isle line 753. let expr0_0 = C::put_in_regs(ctx, pattern4_0); let expr1_0: usize = 0; let expr2_0 = C::value_regs_get(ctx, expr0_0, expr1_0); let expr3_0 = constructor_alu_rrr(ctx, pattern0_0, pattern3_0, expr2_0)?; return Some(expr3_0); } 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 741. let expr0_0 = C::put_in_regs(ctx, pattern4_0); let expr1_0: usize = 0; let expr2_0 = C::value_regs_get(ctx, expr0_0, expr1_0); let expr3_0 = C::shift_mask(ctx, pattern2_0); let expr4_0 = constructor_and32_imm(ctx, expr2_0, expr3_0)?; let expr5_0 = constructor_alu_rrr(ctx, pattern0_0, pattern3_0, expr4_0)?; return Some(expr5_0); } return None; } // Generated as internal constructor for term lower_ushr128. pub fn constructor_lower_ushr128( ctx: &mut C, arg0: ValueRegs, arg1: Reg, ) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; // Rule at src/isa/aarch64/lower.isle line 796. let expr0_0: usize = 0; let expr1_0 = C::value_regs_get(ctx, pattern0_0, expr0_0); let expr2_0: usize = 1; let expr3_0 = C::value_regs_get(ctx, pattern0_0, expr2_0); let expr4_0 = constructor_lsr64(ctx, expr1_0, pattern1_0)?; let expr5_0 = constructor_lsr64(ctx, expr3_0, pattern1_0)?; let expr6_0 = C::zero_reg(ctx); let expr7_0 = constructor_orr_not32(ctx, expr6_0, pattern1_0)?; let expr8_0: u8 = 1; let expr9_0 = C::imm_shift_from_u8(ctx, expr8_0); let expr10_0 = constructor_lsl64_imm(ctx, expr3_0, expr9_0)?; let expr11_0 = constructor_lsl64(ctx, expr10_0, expr7_0)?; let expr12_0 = constructor_orr64(ctx, expr4_0, expr11_0)?; let expr13_0: Type = I64; let expr14_0: u64 = 64; let expr15_0 = C::u64_into_imm_logic(ctx, expr13_0, expr14_0); let expr16_0 = constructor_tst64_imm(ctx, pattern1_0, expr15_0)?; let expr17_0 = Cond::Ne; let expr18_0 = constructor_csel(ctx, &expr17_0, expr5_0, expr12_0)?; let expr19_0 = Cond::Ne; let expr20_0 = C::zero_reg(ctx); let expr21_0 = constructor_csel(ctx, &expr19_0, expr20_0, expr5_0)?; let expr22_0 = constructor_with_flags_2(ctx, &expr16_0, &expr18_0, &expr21_0)?; return Some(expr22_0); } // Generated as internal constructor for term lower_sshr128. pub fn constructor_lower_sshr128( ctx: &mut C, arg0: ValueRegs, arg1: Reg, ) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; // Rule at src/isa/aarch64/lower.isle line 848. let expr0_0: usize = 0; let expr1_0 = C::value_regs_get(ctx, pattern0_0, expr0_0); let expr2_0: usize = 1; let expr3_0 = C::value_regs_get(ctx, pattern0_0, expr2_0); let expr4_0 = constructor_lsr64(ctx, expr1_0, pattern1_0)?; let expr5_0 = constructor_asr64(ctx, expr3_0, pattern1_0)?; let expr6_0 = C::zero_reg(ctx); let expr7_0 = constructor_orr_not32(ctx, expr6_0, pattern1_0)?; let expr8_0: u8 = 1; let expr9_0 = C::imm_shift_from_u8(ctx, expr8_0); let expr10_0 = constructor_lsl64_imm(ctx, expr3_0, expr9_0)?; let expr11_0 = constructor_lsl64(ctx, expr10_0, expr7_0)?; let expr12_0: u8 = 63; let expr13_0 = C::imm_shift_from_u8(ctx, expr12_0); let expr14_0 = constructor_asr64_imm(ctx, expr3_0, expr13_0)?; let expr15_0 = constructor_orr64(ctx, expr4_0, expr11_0)?; let expr16_0: Type = I64; let expr17_0: u64 = 64; let expr18_0 = C::u64_into_imm_logic(ctx, expr16_0, expr17_0); let expr19_0 = constructor_tst64_imm(ctx, pattern1_0, expr18_0)?; let expr20_0 = Cond::Ne; let expr21_0 = constructor_csel(ctx, &expr20_0, expr5_0, expr15_0)?; let expr22_0 = Cond::Ne; let expr23_0 = constructor_csel(ctx, &expr22_0, expr14_0, expr5_0)?; let expr24_0 = constructor_with_flags_2(ctx, &expr19_0, &expr21_0, &expr23_0)?; return Some(expr24_0); } // Generated as internal constructor for term small_rotr. pub fn constructor_small_rotr( ctx: &mut C, arg0: Type, arg1: Reg, arg2: Reg, ) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; let pattern2_0 = arg2; // Rule at src/isa/aarch64/lower.isle line 960. let expr0_0 = C::rotr_mask(ctx, pattern0_0); let expr1_0 = constructor_and32_imm(ctx, pattern2_0, expr0_0)?; let expr2_0 = C::ty_bits(ctx, pattern0_0); let expr3_0 = C::u8_into_imm12(ctx, expr2_0); let expr4_0 = constructor_sub32_imm(ctx, expr1_0, expr3_0)?; let expr5_0 = C::zero_reg(ctx); let expr6_0 = constructor_sub32(ctx, expr5_0, expr4_0)?; let expr7_0 = constructor_lsr32(ctx, pattern1_0, expr1_0)?; let expr8_0 = constructor_lsl32(ctx, pattern1_0, expr6_0)?; let expr9_0 = constructor_orr32(ctx, expr8_0, expr7_0)?; return Some(expr9_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, ) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; let pattern2_0 = arg2; // Rule at src/isa/aarch64/lower.isle line 983. let expr0_0 = constructor_lsr32_imm(ctx, pattern1_0, pattern2_0)?; let expr1_0 = C::rotr_opposite_amount(ctx, pattern0_0, pattern2_0); let expr2_0 = constructor_lsl32_imm(ctx, pattern1_0, expr1_0)?; let expr3_0 = constructor_orr32(ctx, expr2_0, expr0_0)?; return Some(expr3_0); } // Generated as internal constructor for term lower_clz128. pub fn constructor_lower_clz128(ctx: &mut C, arg0: ValueRegs) -> Option { let pattern0_0 = arg0; // Rule at src/isa/aarch64/lower.isle line 1059. let expr0_0: usize = 1; let expr1_0 = C::value_regs_get(ctx, pattern0_0, expr0_0); let expr2_0 = constructor_clz64(ctx, expr1_0)?; let expr3_0: usize = 0; let expr4_0 = C::value_regs_get(ctx, pattern0_0, expr3_0); let expr5_0 = constructor_clz64(ctx, expr4_0)?; let expr6_0: u8 = 6; let expr7_0 = C::imm_shift_from_u8(ctx, expr6_0); let expr8_0 = constructor_lsr64_imm(ctx, expr2_0, expr7_0)?; let expr9_0 = constructor_madd64(ctx, expr5_0, expr8_0, expr2_0)?; let expr10_0: Type = I64; let expr11_0: u64 = 0; let expr12_0 = constructor_imm(ctx, expr10_0, expr11_0)?; let expr13_0 = C::value_regs(ctx, expr9_0, expr12_0); return Some(expr13_0); }