Files
wasmtime/cranelift/codegen/src/isa/aarch64/lower/isle/generated_code.rs
Ulrich Weigand 10198553c7 ISLE: Common accessors for some insn data fields (#3781)
Add accessors to prelude.isle to access data fields of
`func_addr` and `symbol_value` instructions.

These are based on similar versions I had added to the s390x
back-end, but are a bit more straightforward to use.

- func_ref_data: Extract SigRef, ExternalName, and RelocDistance
  fields given a FuncRef.

- symbol_value_data: Extract ExternalName, RelocDistance, and
  offset fields given a GlobalValue representing a Symbol.

- reloc_distance_near: Test for RelocDistance::Near.

The s390x back-end is changed to use these common versions.

Note that this exposed a bug in common isle code: This extractor:

(extractor (load_sym inst)
  (and inst
       (load _ (def_inst (symbol_value
                           (symbol_value_data _
                             (reloc_distance_near) offset)))
               (i64_from_offset
                 (memarg_symbol_offset_sum <offset _)))))

would raise an assertion in sema.rs due to a supposed cycle in
extractor definitions.  But there was no actual cycle, it was
simply that the extractor tree refers twice to the `insn_data`
extractor (once via the `load` and once via the `symbol_value`
extractor).  Fixed by checking for pre-existing definitions only
along one path in the tree, not across the whole tree.
2022-02-08 17:57:27 -08:00

6601 lines
282 KiB
Rust
Generated

// 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<Type>;
fn fits_in_32(&mut self, arg0: Type) -> Option<Type>;
fn fits_in_64(&mut self, arg0: Type) -> Option<Type>;
fn ty_32_or_64(&mut self, arg0: Type) -> Option<Type>;
fn ty_8_or_16(&mut self, arg0: Type) -> Option<Type>;
fn vec128(&mut self, arg0: Type) -> Option<Type>;
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<u64>;
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<Value>;
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<Inst>;
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<MoveWideConst>;
fn move_wide_const_from_negated_u64(&mut self, arg0: u64) -> Option<MoveWideConst>;
fn imm_logic_from_u64(&mut self, arg0: u64, arg1: Type) -> Option<ImmLogic>;
fn imm_logic_from_imm64(&mut self, arg0: Imm64, arg1: Type) -> Option<ImmLogic>;
fn imm_shift_from_imm64(&mut self, arg0: Imm64, arg1: Type) -> Option<ImmShift>;
fn imm_shift_from_u8(&mut self, arg0: u8) -> ImmShift;
fn imm12_from_u64(&mut self, arg0: u64) -> Option<Imm12>;
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<Imm12>;
fn lshl_from_imm64(&mut self, arg0: Imm64, arg1: Type) -> Option<ShiftOpAndAmt>;
fn integral_ty(&mut self, arg0: Type) -> Option<Type>;
fn extended_value_from_value(&mut self, arg0: Value) -> Option<ExtendedValue>;
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<SinkableAtomicLoad>;
fn sink_atomic_load(&mut self, arg0: &SinkableAtomicLoad) -> Reg;
fn safe_divisor_from_imm64(&mut self, arg0: Imm64) -> Option<u64>;
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<C: Context>(ctx: &mut C, arg0: Type) -> Option<Reg> {
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<C: Context>(ctx: &mut C, arg0: Value) -> Option<Reg> {
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<C: Context>(
ctx: &mut C,
arg0: &SideEffectNoResult,
) -> Option<ValueRegs> {
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<C: Context>(
ctx: &mut C,
arg0: &SideEffectNoResult,
) -> Option<ValueRegs> {
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<C: Context>(
ctx: &mut C,
arg0: &ProducesFlags,
arg1: &ConsumesFlags,
) -> Option<ValueRegs> {
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<C: Context>(
ctx: &mut C,
arg0: &ProducesFlags,
arg1: &ConsumesFlags,
) -> Option<Reg> {
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<C: Context>(
ctx: &mut C,
arg0: &ProducesFlags,
arg1: &ConsumesFlags,
arg2: &ConsumesFlags,
) -> Option<ValueRegs> {
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<C: Context>(ctx: &mut C, arg0: Type) -> Option<VectorSize> {
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<C: Context>(
ctx: &mut C,
arg0: MoveWideConst,
arg1: &OperandSize,
) -> Option<Reg> {
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<C: Context>(
ctx: &mut C,
arg0: MoveWideConst,
arg1: &OperandSize,
) -> Option<Reg> {
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<C: Context>(
ctx: &mut C,
arg0: &ALUOp,
arg1: Reg,
arg2: ImmLogic,
) -> Option<Reg> {
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<C: Context>(
ctx: &mut C,
arg0: &ALUOp,
arg1: Reg,
arg2: ImmShift,
) -> Option<Reg> {
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<C: Context>(
ctx: &mut C,
arg0: &ALUOp,
arg1: Reg,
arg2: Reg,
) -> Option<Reg> {
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<C: Context>(
ctx: &mut C,
arg0: &VecALUOp,
arg1: Reg,
arg2: Reg,
arg3: &VectorSize,
) -> Option<Reg> {
let pattern0_0 = arg0;
let pattern1_0 = arg1;
let pattern2_0 = arg2;
let pattern3_0 = arg3;
// Rule at src/isa/aarch64/inst.isle line 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<C: Context>(
ctx: &mut C,
arg0: &VecLanesOp,
arg1: Reg,
arg2: &VectorSize,
) -> Option<Reg> {
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<C: Context>(ctx: &mut C, arg0: Reg, arg1: &VectorSize) -> Option<Reg> {
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<C: Context>(
ctx: &mut C,
arg0: &ALUOp,
arg1: Reg,
arg2: Imm12,
) -> Option<Reg> {
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<C: Context>(
ctx: &mut C,
arg0: &ALUOp,
arg1: Reg,
arg2: Reg,
arg3: ShiftOpAndAmt,
) -> Option<Reg> {
let pattern0_0 = arg0;
let pattern1_0 = arg1;
let pattern2_0 = arg2;
let pattern3_0 = arg3;
// Rule at src/isa/aarch64/inst.isle line 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<C: Context>(
ctx: &mut C,
arg0: &ALUOp,
arg1: Reg,
arg2: Reg,
arg3: &ExtendOp,
) -> Option<Reg> {
let pattern0_0 = arg0;
let pattern1_0 = arg1;
let pattern2_0 = arg2;
let pattern3_0 = arg3;
// Rule at src/isa/aarch64/inst.isle line 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<C: Context>(
ctx: &mut C,
arg0: &ALUOp,
arg1: Reg,
arg2: &ExtendedValue,
) -> Option<Reg> {
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<C: Context>(
ctx: &mut C,
arg0: &ALUOp3,
arg1: Reg,
arg2: Reg,
arg3: Reg,
) -> Option<Reg> {
let pattern0_0 = arg0;
let pattern1_0 = arg1;
let pattern2_0 = arg2;
let pattern3_0 = arg3;
// Rule at src/isa/aarch64/inst.isle line 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<C: Context>(ctx: &mut C, arg0: &BitOp, arg1: Reg) -> Option<Reg> {
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<C: Context>(
ctx: &mut C,
arg0: Reg,
arg1: Reg,
) -> Option<ProducesFlags> {
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<C: Context>(ctx: &mut C, arg0: Reg, arg1: Reg) -> Option<ConsumesFlags> {
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<C: Context>(
ctx: &mut C,
arg0: Reg,
arg1: Reg,
) -> Option<ProducesFlags> {
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<C: Context>(
ctx: &mut C,
arg0: Reg,
arg1: Imm12,
) -> Option<ProducesFlags> {
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<C: Context>(ctx: &mut C, arg0: Reg, arg1: Reg) -> Option<ConsumesFlags> {
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<C: Context>(
ctx: &mut C,
arg0: &VecMisc2,
arg1: Reg,
arg2: &VectorSize,
) -> Option<Reg> {
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<C: Context>(
ctx: &mut C,
arg0: &VecRRRLongOp,
arg1: Reg,
arg2: Reg,
arg3: bool,
) -> Option<Reg> {
let pattern0_0 = arg0;
let pattern1_0 = arg1;
let pattern2_0 = arg2;
let pattern3_0 = arg3;
// Rule at src/isa/aarch64/inst.isle line 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<C: Context>(
ctx: &mut C,
arg0: &VecRRRLongOp,
arg1: Reg,
arg2: Reg,
arg3: Reg,
arg4: bool,
) -> Option<Reg> {
let pattern0_0 = arg0;
let pattern1_0 = arg1;
let pattern2_0 = arg2;
let pattern3_0 = arg3;
let pattern4_0 = arg4;
// Rule at src/isa/aarch64/inst.isle line 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<C: Context>(
ctx: &mut C,
arg0: &VecRRNarrowOp,
arg1: Reg,
arg2: bool,
) -> Option<Reg> {
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<C: Context>(
ctx: &mut C,
arg0: &VecRRLongOp,
arg1: Reg,
arg2: bool,
) -> Option<Reg> {
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<C: Context>(
ctx: &mut C,
arg0: Reg,
arg1: &ScalarSize,
) -> Option<Reg> {
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<C: Context>(
ctx: &mut C,
arg0: Reg,
arg1: Reg,
arg2: u8,
arg3: &VectorSize,
) -> Option<Reg> {
let pattern0_0 = arg0;
let pattern1_0 = arg1;
let pattern2_0 = arg2;
let pattern3_0 = arg3;
// Rule at src/isa/aarch64/inst.isle line 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<C: Context>(
ctx: &mut C,
arg0: Reg,
arg1: u8,
arg2: &VectorSize,
) -> Option<Reg> {
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<C: Context>(
ctx: &mut C,
arg0: Reg,
arg1: u8,
arg2: &VectorSize,
arg3: &OperandSize,
) -> Option<Reg> {
let pattern0_0 = arg0;
let pattern1_0 = arg1;
let pattern2_0 = arg2;
let pattern3_0 = arg3;
// Rule at src/isa/aarch64/inst.isle line 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<C: Context>(
ctx: &mut C,
arg0: Reg,
arg1: bool,
arg2: u8,
arg3: u8,
) -> Option<Reg> {
let pattern0_0 = arg0;
let pattern1_0 = arg1;
let pattern2_0 = arg2;
let pattern3_0 = arg3;
// Rule at src/isa/aarch64/inst.isle line 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<C: Context>(ctx: &mut C, arg0: Type, arg1: Reg) -> Option<Reg> {
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<C: Context>(
ctx: &mut C,
arg0: Reg,
arg1: ImmLogic,
) -> Option<ProducesFlags> {
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<C: Context>(
ctx: &mut C,
arg0: &Cond,
arg1: Reg,
arg2: Reg,
) -> Option<ConsumesFlags> {
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<C: Context>(ctx: &mut C, arg0: Type, arg1: Reg, arg2: Reg) -> Option<Reg> {
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<C: Context>(ctx: &mut C, arg0: Reg, arg1: Reg) -> Option<Reg> {
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<C: Context>(ctx: &mut C, arg0: Reg, arg1: Reg) -> Option<Reg> {
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<C: Context>(
ctx: &mut C,
arg0: Type,
arg1: Reg,
arg2: Imm12,
) -> Option<Reg> {
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<C: Context>(ctx: &mut C, arg0: Reg, arg1: Imm12) -> Option<Reg> {
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<C: Context>(ctx: &mut C, arg0: Reg, arg1: Imm12) -> Option<Reg> {
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<C: Context>(
ctx: &mut C,
arg0: Type,
arg1: Reg,
arg2: &ExtendedValue,
) -> Option<Reg> {
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<C: Context>(
ctx: &mut C,
arg0: Reg,
arg1: &ExtendedValue,
) -> Option<Reg> {
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<C: Context>(
ctx: &mut C,
arg0: Reg,
arg1: &ExtendedValue,
) -> Option<Reg> {
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<C: Context>(
ctx: &mut C,
arg0: Type,
arg1: Reg,
arg2: Reg,
arg3: ShiftOpAndAmt,
) -> Option<Reg> {
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<C: Context>(
ctx: &mut C,
arg0: Reg,
arg1: Reg,
arg2: ShiftOpAndAmt,
) -> Option<Reg> {
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<C: Context>(
ctx: &mut C,
arg0: Reg,
arg1: Reg,
arg2: ShiftOpAndAmt,
) -> Option<Reg> {
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<C: Context>(
ctx: &mut C,
arg0: Reg,
arg1: Reg,
arg2: &VectorSize,
) -> Option<Reg> {
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<C: Context>(ctx: &mut C, arg0: Type, arg1: Reg, arg2: Reg) -> Option<Reg> {
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<C: Context>(ctx: &mut C, arg0: Reg, arg1: Reg) -> Option<Reg> {
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<C: Context>(ctx: &mut C, arg0: Reg, arg1: Reg) -> Option<Reg> {
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<C: Context>(
ctx: &mut C,
arg0: Type,
arg1: Reg,
arg2: Imm12,
) -> Option<Reg> {
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<C: Context>(ctx: &mut C, arg0: Reg, arg1: Imm12) -> Option<Reg> {
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<C: Context>(ctx: &mut C, arg0: Reg, arg1: Imm12) -> Option<Reg> {
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<C: Context>(
ctx: &mut C,
arg0: Type,
arg1: Reg,
arg2: &ExtendedValue,
) -> Option<Reg> {
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<C: Context>(
ctx: &mut C,
arg0: Reg,
arg1: &ExtendedValue,
) -> Option<Reg> {
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<C: Context>(
ctx: &mut C,
arg0: Reg,
arg1: &ExtendedValue,
) -> Option<Reg> {
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<C: Context>(
ctx: &mut C,
arg0: Type,
arg1: Reg,
arg2: Reg,
arg3: ShiftOpAndAmt,
) -> Option<Reg> {
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<C: Context>(
ctx: &mut C,
arg0: Reg,
arg1: Reg,
arg2: ShiftOpAndAmt,
) -> Option<Reg> {
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<C: Context>(
ctx: &mut C,
arg0: Reg,
arg1: Reg,
arg2: ShiftOpAndAmt,
) -> Option<Reg> {
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<C: Context>(
ctx: &mut C,
arg0: Reg,
arg1: Reg,
arg2: &VectorSize,
) -> Option<Reg> {
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<C: Context>(
ctx: &mut C,
arg0: Type,
arg1: Reg,
arg2: Reg,
arg3: Reg,
) -> Option<Reg> {
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<C: Context>(ctx: &mut C, arg0: Reg, arg1: Reg, arg2: Reg) -> Option<Reg> {
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<C: Context>(ctx: &mut C, arg0: Reg, arg1: Reg, arg2: Reg) -> Option<Reg> {
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<C: Context>(ctx: &mut C, arg0: Reg, arg1: Reg, arg2: Reg) -> Option<Reg> {
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<C: Context>(
ctx: &mut C,
arg0: Reg,
arg1: Reg,
arg2: &VectorSize,
) -> Option<Reg> {
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<C: Context>(
ctx: &mut C,
arg0: Reg,
arg1: Reg,
arg2: &VectorSize,
) -> Option<Reg> {
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<C: Context>(
ctx: &mut C,
arg0: Reg,
arg1: Reg,
arg2: &VectorSize,
) -> Option<Reg> {
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<C: Context>(
ctx: &mut C,
arg0: Reg,
arg1: Reg,
arg2: &VectorSize,
) -> Option<Reg> {
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<C: Context>(ctx: &mut C, arg0: Reg, arg1: Reg) -> Option<Reg> {
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<C: Context>(ctx: &mut C, arg0: Reg, arg1: Reg) -> Option<Reg> {
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<C: Context>(
ctx: &mut C,
arg0: Reg,
arg1: Reg,
arg2: &VectorSize,
) -> Option<Reg> {
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<C: Context>(ctx: &mut C, arg0: Reg, arg1: &VectorSize) -> Option<Reg> {
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<C: Context>(ctx: &mut C, arg0: Reg, arg1: &VectorSize) -> Option<Reg> {
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<C: Context>(ctx: &mut C, arg0: Reg, arg1: bool) -> Option<Reg> {
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<C: Context>(
ctx: &mut C,
arg0: Reg,
arg1: Reg,
arg2: &VectorSize,
) -> Option<Reg> {
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<C: Context>(ctx: &mut C, arg0: Reg, arg1: &VectorSize) -> Option<Reg> {
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<C: Context>(ctx: &mut C, arg0: Reg, arg1: bool) -> Option<Reg> {
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<C: Context>(
ctx: &mut C,
arg0: Reg,
arg1: Reg,
arg2: Reg,
arg3: bool,
) -> Option<Reg> {
let pattern0_0 = arg0;
let pattern1_0 = arg1;
let pattern2_0 = arg2;
let pattern3_0 = arg3;
// Rule at src/isa/aarch64/inst.isle line 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<C: Context>(
ctx: &mut C,
arg0: Reg,
arg1: Reg,
arg2: bool,
) -> Option<Reg> {
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<C: Context>(
ctx: &mut C,
arg0: Reg,
arg1: Reg,
arg2: bool,
) -> Option<Reg> {
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<C: Context>(
ctx: &mut C,
arg0: Reg,
arg1: Reg,
arg2: bool,
) -> Option<Reg> {
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<C: Context>(
ctx: &mut C,
arg0: Reg,
arg1: Reg,
arg2: bool,
) -> Option<Reg> {
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<C: Context>(
ctx: &mut C,
arg0: Reg,
arg1: Reg,
arg2: bool,
) -> Option<Reg> {
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<C: Context>(
ctx: &mut C,
arg0: Reg,
arg1: Reg,
arg2: bool,
) -> Option<Reg> {
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<C: Context>(ctx: &mut C, arg0: Reg, arg1: Reg) -> Option<Reg> {
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<C: Context>(ctx: &mut C, arg0: Reg, arg1: ImmShift) -> Option<Reg> {
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<C: Context>(ctx: &mut C, arg0: Reg, arg1: Reg) -> Option<Reg> {
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<C: Context>(ctx: &mut C, arg0: Reg, arg1: ImmShift) -> Option<Reg> {
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<C: Context>(ctx: &mut C, arg0: Reg, arg1: Reg) -> Option<Reg> {
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<C: Context>(ctx: &mut C, arg0: Reg, arg1: ImmShift) -> Option<Reg> {
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<C: Context>(ctx: &mut C, arg0: Reg, arg1: Reg) -> Option<Reg> {
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<C: Context>(ctx: &mut C, arg0: Reg, arg1: ImmShift) -> Option<Reg> {
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<C: Context>(ctx: &mut C, arg0: Reg, arg1: Reg) -> Option<Reg> {
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<C: Context>(ctx: &mut C, arg0: Reg, arg1: ImmShift) -> Option<Reg> {
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<C: Context>(ctx: &mut C, arg0: Reg, arg1: Reg) -> Option<Reg> {
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<C: Context>(ctx: &mut C, arg0: Reg, arg1: Reg) -> Option<Reg> {
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<C: Context>(ctx: &mut C, arg0: Reg, arg1: &VectorSize) -> Option<Reg> {
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<C: Context>(
ctx: &mut C,
arg0: Type,
arg1: Reg,
arg2: Reg,
) -> Option<Reg> {
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<C: Context>(ctx: &mut C, arg0: Reg, arg1: Reg) -> Option<Reg> {
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<C: Context>(ctx: &mut C, arg0: Reg, arg1: Reg) -> Option<Reg> {
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<C: Context>(
ctx: &mut C,
arg0: Type,
arg1: Reg,
arg2: Reg,
arg3: ShiftOpAndAmt,
) -> Option<Reg> {
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<C: Context>(
ctx: &mut C,
arg0: Reg,
arg1: Reg,
arg2: ShiftOpAndAmt,
) -> Option<Reg> {
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<C: Context>(
ctx: &mut C,
arg0: Reg,
arg1: Reg,
arg2: ShiftOpAndAmt,
) -> Option<Reg> {
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<C: Context>(ctx: &mut C, arg0: Reg, arg1: Reg) -> Option<Reg> {
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<C: Context>(ctx: &mut C, arg0: Reg, arg1: ImmLogic) -> Option<Reg> {
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<C: Context>(ctx: &mut C, arg0: Reg, arg1: Reg) -> Option<Reg> {
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<C: Context>(ctx: &mut C, arg0: Reg, arg1: ImmLogic) -> Option<Reg> {
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<C: Context>(
ctx: &mut C,
arg0: Reg,
arg1: Reg,
arg2: &VectorSize,
) -> Option<Reg> {
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<C: Context>(ctx: &mut C, arg0: Reg, arg1: ImmLogic) -> Option<Reg> {
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<C: Context>(
ctx: &mut C,
arg0: Reg,
arg1: Reg,
arg2: &VectorSize,
) -> Option<Reg> {
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<C: Context>(
ctx: &mut C,
arg0: Reg,
arg1: Reg,
arg2: &VectorSize,
) -> Option<Reg> {
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<C: Context>(
ctx: &mut C,
arg0: Reg,
arg1: Reg,
arg2: &VectorSize,
) -> Option<Reg> {
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<C: Context>(
ctx: &mut C,
arg0: Reg,
arg1: Reg,
arg2: &VectorSize,
) -> Option<Reg> {
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<C: Context>(
ctx: &mut C,
arg0: Reg,
arg1: Reg,
arg2: &VectorSize,
) -> Option<Reg> {
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<C: Context>(ctx: &mut C, arg0: Reg, arg1: Reg) -> Option<Reg> {
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<C: Context>(ctx: &mut C, arg0: Reg, arg1: ImmShift) -> Option<Reg> {
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<C: Context>(ctx: &mut C, arg0: Reg, arg1: Reg) -> Option<Reg> {
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<C: Context>(ctx: &mut C, arg0: Reg, arg1: ImmShift) -> Option<Reg> {
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<C: Context>(ctx: &mut C, arg0: Reg) -> Option<Reg> {
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<C: Context>(ctx: &mut C, arg0: Reg) -> Option<Reg> {
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<C: Context>(ctx: &mut C, arg0: Reg) -> Option<Reg> {
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<C: Context>(ctx: &mut C, arg0: Reg) -> Option<Reg> {
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<C: Context>(ctx: &mut C, arg0: Reg) -> Option<Reg> {
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<C: Context>(ctx: &mut C, arg0: Reg) -> Option<Reg> {
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<C: Context>(ctx: &mut C, arg0: Reg, arg1: Reg) -> Option<Reg> {
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<C: Context>(ctx: &mut C, arg0: Reg, arg1: Reg) -> Option<Reg> {
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<C: Context>(ctx: &mut C, arg0: Reg, arg1: &VectorSize) -> Option<Reg> {
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<C: Context>(ctx: &mut C, arg0: Type, arg1: u64) -> Option<Reg> {
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<C: Context>(ctx: &mut C, arg0: Value) -> Option<Reg> {
let pattern0_0 = arg0;
let pattern1_0 = C::value_type(ctx, pattern0_0);
if pattern1_0 == I32 {
// Rule at src/isa/aarch64/inst.isle line 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<C: Context>(ctx: &mut C, arg0: Value) -> Option<Reg> {
let pattern0_0 = arg0;
let pattern1_0 = C::value_type(ctx, pattern0_0);
if pattern1_0 == I32 {
// Rule at src/isa/aarch64/inst.isle line 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<C: Context>(ctx: &mut C, arg0: Value) -> Option<Reg> {
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<C: Context>(ctx: &mut C, arg0: Value) -> Option<Reg> {
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<C: Context>(ctx: &mut C, arg0: Reg) -> Option<Reg> {
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<C: Context>(ctx: &mut C, arg0: Type) -> Option<OperandSize> {
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<C: Context>(
ctx: &mut C,
arg0: Type,
arg1: Reg,
arg2: Reg,
) -> Option<Reg> {
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<C: Context>(ctx: &mut C, arg0: Type) -> Option<ALUOp> {
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<C: Context>(
ctx: &mut C,
arg0: &ALUOp,
arg1: Type,
arg2: Value,
arg3: Value,
) -> Option<Reg> {
let pattern0_0 = arg0;
let pattern1_0 = arg1;
let pattern2_0 = arg2;
if let Some(pattern3_0) = C::def_inst(ctx, pattern2_0) {
let pattern4_0 = C::inst_data(ctx, pattern3_0);
match &pattern4_0 {
&InstructionData::UnaryImm {
opcode: ref pattern5_0,
imm: pattern5_1,
} => {
if let &Opcode::Iconst = &pattern5_0 {
let 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<C: Context>(
ctx: &mut C,
arg0: &ALUOp,
arg1: Type,
arg2: Value,
arg3: Value,
) -> Option<Reg> {
let pattern0_0 = arg0;
let pattern1_0 = arg1;
let pattern2_0 = arg2;
let pattern3_0 = arg3;
if let Some(pattern4_0) = C::def_inst(ctx, pattern3_0) {
let pattern5_0 = C::inst_data(ctx, pattern4_0);
match &pattern5_0 {
&InstructionData::UnaryImm {
opcode: ref pattern6_0,
imm: pattern6_1,
} => {
if let &Opcode::Iconst = &pattern6_0 {
let 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<C: Context>(
ctx: &mut C,
arg0: &ALUOp,
arg1: Value,
arg2: Value,
) -> Option<ValueRegs> {
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<C: Context>(ctx: &mut C, arg0: Inst) -> Option<ValueRegs> {
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<C: Context>(ctx: &mut C, arg0: Value) -> Option<Reg> {
let pattern0_0 = arg0;
let pattern1_0 = C::value_type(ctx, pattern0_0);
if let Some(pattern2_0) = C::def_inst(ctx, pattern0_0) {
let pattern3_0 = C::inst_data(ctx, pattern2_0);
if let &InstructionData::UnaryImm {
opcode: ref pattern4_0,
imm: pattern4_1,
} = &pattern3_0
{
if let &Opcode::Iconst = &pattern4_0 {
if let Some(pattern6_0) = C::nonzero_u64_from_imm64(ctx, pattern4_1) {
// Rule at src/isa/aarch64/lower.isle line 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<C: Context>(ctx: &mut C, arg0: Value) -> Option<Reg> {
let pattern0_0 = arg0;
let pattern1_0 = C::value_type(ctx, pattern0_0);
if let Some(pattern2_0) = C::def_inst(ctx, pattern0_0) {
let pattern3_0 = C::inst_data(ctx, pattern2_0);
if let &InstructionData::UnaryImm {
opcode: ref pattern4_0,
imm: pattern4_1,
} = &pattern3_0
{
if let &Opcode::Iconst = &pattern4_0 {
if let Some(pattern6_0) = C::nonzero_u64_from_imm64(ctx, pattern4_1) {
// Rule at src/isa/aarch64/lower.isle line 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<C: Context>(
ctx: &mut C,
arg0: ValueRegs,
arg1: Reg,
) -> Option<ValueRegs> {
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<C: Context>(
ctx: &mut C,
arg0: &ALUOp,
arg1: Type,
arg2: Reg,
arg3: Value,
) -> Option<Reg> {
let pattern0_0 = arg0;
let pattern1_0 = arg1;
let pattern2_0 = arg2;
let pattern3_0 = arg3;
if let Some(pattern4_0) = C::def_inst(ctx, pattern3_0) {
let pattern5_0 = C::inst_data(ctx, pattern4_0);
if let &InstructionData::UnaryImm {
opcode: ref pattern6_0,
imm: pattern6_1,
} = &pattern5_0
{
if let &Opcode::Iconst = &pattern6_0 {
let 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<C: Context>(
ctx: &mut C,
arg0: ValueRegs,
arg1: Reg,
) -> Option<ValueRegs> {
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<C: Context>(
ctx: &mut C,
arg0: ValueRegs,
arg1: Reg,
) -> Option<ValueRegs> {
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<C: Context>(
ctx: &mut C,
arg0: Type,
arg1: Reg,
arg2: Reg,
) -> Option<Reg> {
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<C: Context>(
ctx: &mut C,
arg0: Type,
arg1: Reg,
arg2: ImmShift,
) -> Option<Reg> {
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<C: Context>(ctx: &mut C, arg0: ValueRegs) -> Option<ValueRegs> {
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);
}