use crsn::asm::data::{Rd, Wr}; use crsn::builtin::defs::BitSlice; /// A low level instruction #[derive(Clone, Debug, Eq, PartialEq)] pub enum ArithOp { Test { a: Rd }, Compare { a: Rd, b: Rd }, RangeTest { val: Rd, a: Rd, b: Rd }, Rng { dst: Wr, min: Rd, max: Rd }, /// Swap halves Sw32 { dst: Wr, src: Rd }, /// Swap adjacent half-words Sw16 { dst: Wr, src: Rd }, /// Swap neighbouring bytes Sw8 { dst: Wr, src: Rd }, /// Reverse bytes Rev { dst: Wr, src: Rd }, /// Reverse bits Rbit { dst: Wr, src: Rd }, /// Count leading zeros in a slice Clz { dst: Wr, src: Rd, slice: BitSlice }, /// Count leading ones in a slice Clo { dst: Wr, src: Rd, slice: BitSlice }, /// Sign extend a slice (zero aligned) SignExtend { dst: Wr, src: Rd, slice: BitSlice }, Add { dst: Wr, a: Rd, b: Rd }, Sub { dst: Wr, a: Rd, b: Rd }, Mul { dst: Wr, a: Rd, b: Rd }, Div { dst: Wr, rem: Wr, a: Rd, div: Rd }, // "Mod" is functionally equivalent to "Div" with the result discarded, // but status flags are updated by the remainder Mod { dst: Wr, a: Rd, div: Rd }, And { dst: Wr, a: Rd, b: Rd }, Or { dst: Wr, a: Rd, b: Rd }, Xor { dst: Wr, a: Rd, b: Rd }, Cpl { dst: Wr, a: Rd }, Rol { dst: Wr, a: Rd, n: Rd }, // Rotate (with wrap-around) Ror { dst: Wr, a: Rd, n: Rd }, Lsl { dst: Wr, a: Rd, n: Rd }, // Shift Lsr { dst: Wr, a: Rd, n: Rd }, Asr { dst: Wr, a: Rd, n: Rd }, // IntToFloat { dst: Wr, a: Rd }, // FloatToInt { dst: Wr, a: Rd }, // FloatTest { a: Rd }, // FloatCompare { a: Rd, b: Rd }, // FloatRangeTest { val: Rd, a: Rd, b: Rd }, // FloatRng { dst: Wr, min: Rd, max: Rd }, // FloatRound { dst: Wr, a: Rd, b: Rd }, // FloatCeil { dst: Wr, a: Rd, b: Rd }, // FloatFloor { dst: Wr, a: Rd, b: Rd }, // FloatAdd { dst: Wr, a: Rd, b: Rd }, // FloatSub { dst: Wr, a: Rd, b: Rd }, // FloatMul { dst: Wr, a: Rd, b: Rd }, // FloatDiv { dst: Wr, rem: Wr, a: Rd, div: Rd }, // FloatMod { dst: Wr, a: Rd, div: Rd }, }