Пример #1
0
 public InstrDecoder(Opcode opcode, InstrClass iclass, ArmVectorData vectorData, params Mutator <A32Disassembler>[] mutators)
 {
     this.opcode     = opcode;
     this.iclass     = iclass;
     this.vectorData = vectorData;
     this.mutators   = mutators;
 }
Пример #2
0
 public InstrDecoder(Mnemonic mnemonic, InstrClass iclass, ArmVectorData vec, params Mutator <T32Disassembler>[] mutators)
 {
     this.mnemonic = mnemonic;
     this.iclass   = iclass;
     this.vec      = vec;
     this.mutators = mutators;
 }
Пример #3
0
        private DataType VectorElementDataType(ArmVectorData elemType)
        {
            switch (elemType)
            {
            case ArmVectorData.I8: return(PrimitiveType.SByte);

            case ArmVectorData.S8: return(PrimitiveType.SByte);

            case ArmVectorData.U8: return(PrimitiveType.Byte);

            case ArmVectorData.I16: return(PrimitiveType.Int16);

            case ArmVectorData.S16: return(PrimitiveType.Int16);

            case ArmVectorData.U16: return(PrimitiveType.UInt16);

            case ArmVectorData.F32: return(PrimitiveType.Real32);

            case ArmVectorData.I32: return(PrimitiveType.Int32);

            case ArmVectorData.S32: return(PrimitiveType.Int32);

            case ArmVectorData.U32: return(PrimitiveType.UInt32);

            case ArmVectorData.F64: return(PrimitiveType.Real64);

            case ArmVectorData.I64: return(PrimitiveType.Int64);

            case ArmVectorData.S64: return(PrimitiveType.Int64);

            case ArmVectorData.U64: return(PrimitiveType.UInt64);

            default: NotImplementedYet(); return(VoidType.Instance);
            }
        }
Пример #4
0
        string VectorElementType(ArmVectorData elemType)
        {
            switch (elemType)
            {
            case ArmVectorData.I8: return("i8");

            case ArmVectorData.S8: return("s8");

            case ArmVectorData.U8: return("u8");

            case ArmVectorData.I16: return("i16");

            case ArmVectorData.S16: return("s16");

            case ArmVectorData.U16: return("u16");

            case ArmVectorData.F32: return("f32");

            case ArmVectorData.I32: return("i32");

            case ArmVectorData.S32: return("s32");

            case ArmVectorData.U32: return("u32");

            case ArmVectorData.F64: return("f64");

            case ArmVectorData.I64: return("i64");

            case ArmVectorData.S64: return("s64");

            case ArmVectorData.U64: return("u64");

            default: NotImplementedYet(); return("(NYI)");
            }
        }
Пример #5
0
        private void RewriteVectorUnaryOp(string fnNameFormat, ArmVectorData elemType)
        {
            var src1        = this.Operand(Src1());
            var dst         = this.Operand(Dst(), PrimitiveType.Word32, true);
            var dstType     = Dst().Width;
            var srcType     = Src1().Width;
            var srcElemSize = Arm32Architecture.VectorElementDataType(elemType);
            var celemSrc    = srcType.BitSize / srcElemSize.BitSize;
            var arrSrc      = new ArrayType(srcType, celemSrc);
            var arrDst      = new ArrayType(dstType, celemSrc);
            var fnName      = string.Format(fnNameFormat, VectorElementTypeName(elemType));
            var intrinsic   = host.Intrinsic(fnName, true, arrDst, src1);

            m.Assign(dst, intrinsic);
        }
Пример #6
0
        private void RewriteVectorBinOp(string fnNameFormat, ArmVectorData elemType)
        {
            var src1        = this.Operand(Src1());
            var src2        = this.Operand(Src2());
            var dst         = this.Operand(Dst(), PrimitiveType.Word32, true);
            var dstType     = Dst().Width;
            var srcType     = Src1().Width;
            var srcElemSize = VectorElementDataType(elemType);
            //$BUG: some instructions are returned with srcElemnSize == 0!
            var celemSrc  = srcType.BitSize / (srcElemSize.BitSize != 0 ? srcElemSize.BitSize : 8);
            var arrSrc    = new ArrayType(srcType, celemSrc);
            var arrDst    = new ArrayType(dstType, celemSrc);
            var fnName    = string.Format(fnNameFormat, VectorElementType(elemType));
            var intrinsic = host.PseudoProcedure(fnName, arrDst, src1, src2);

            m.Assign(dst, intrinsic);
        }
Пример #7
0
        private void RewriteVectorBinOp(
            string fnNameFormat,
            ArmVectorData elemType,
            MachineOperand opDst,
            MachineOperand opSrc1,
            MachineOperand opSrc2)
        {
            var src1        = this.Operand(opSrc1);
            var src2        = this.Operand(opSrc2);
            var dst         = this.Operand(opDst, PrimitiveType.Word32, true);
            var dstType     = opDst.Width;
            var srcType     = opSrc1.Width;
            var srcElemSize = Arm32Architecture.VectorElementDataType(elemType);
            //$BUG: some instructions are returned with srcElemnSize == 0!
            var celemSrc  = srcType.BitSize / (srcElemSize.BitSize != 0 ? srcElemSize.BitSize : 8);
            var arrSrc    = new ArrayType(srcType, celemSrc);
            var arrDst    = new ArrayType(dstType, celemSrc);
            var fnName    = string.Format(fnNameFormat, VectorElementTypeName(elemType));
            var intrinsic = host.Intrinsic(fnName, true, arrDst, src1, src2);

            m.Assign(dst, intrinsic);
        }
Пример #8
0
 public static PrimitiveType VectorElementDataType(ArmVectorData elemType)
 {
     switch (elemType)
     {
     case ArmVectorData.I8: return PrimitiveType.SByte;
     case ArmVectorData.S8: return PrimitiveType.SByte;
     case ArmVectorData.U8: return PrimitiveType.Byte;
     case ArmVectorData.F16: return PrimitiveType.Real16;
     case ArmVectorData.I16: return PrimitiveType.Int16;
     case ArmVectorData.S16: return PrimitiveType.Int16;
     case ArmVectorData.U16: return PrimitiveType.UInt16;
     case ArmVectorData.F32: return PrimitiveType.Real32;
     case ArmVectorData.I32: return PrimitiveType.Int32;
     case ArmVectorData.S32: return PrimitiveType.Int32;
     case ArmVectorData.U32: return PrimitiveType.UInt32;
     case ArmVectorData.F64: return PrimitiveType.Real64;
     case ArmVectorData.I64: return PrimitiveType.Int64;
     case ArmVectorData.S64: return PrimitiveType.Int64;
     case ArmVectorData.U64: return PrimitiveType.UInt64;
     default: throw new ArgumentException(nameof(elemType));
     }
 }
Пример #9
0
        PrimitiveType VectorElementType(ArmVectorData elemType)
        {
            switch (elemType)
            {
            case ArmVectorData.I8: return(PrimitiveType.Byte);

            case ArmVectorData.S8: return(PrimitiveType.Int8);

            case ArmVectorData.U8: return(PrimitiveType.UInt8);

            case ArmVectorData.F16: return(PrimitiveType.Real16);

            case ArmVectorData.I16: return(PrimitiveType.Word16);

            case ArmVectorData.S16: return(PrimitiveType.Int16);

            case ArmVectorData.U16: return(PrimitiveType.UInt16);

            case ArmVectorData.F32: return(PrimitiveType.Real32);

            case ArmVectorData.I32: return(PrimitiveType.Word32);

            case ArmVectorData.S32: return(PrimitiveType.Int32);

            case ArmVectorData.U32: return(PrimitiveType.UInt32);

            case ArmVectorData.F64: return(PrimitiveType.Real64);

            case ArmVectorData.I64: return(PrimitiveType.Word64);

            case ArmVectorData.S64: return(PrimitiveType.Int64);

            case ArmVectorData.U64: return(PrimitiveType.UInt64);

            default: NotImplementedYet(); return(PrimitiveType.Bool);
            }
        }
Пример #10
0
 private void RewriteVectorBinOp(string fnNameFormat, ArmVectorData elemType)
 {
     RewriteVectorBinOp(fnNameFormat, elemType, Dst(), Src1(), Src2());
 }
Пример #11
0
 public InstrDecoder(Opcode opcode, ArmVectorData vectorData, params Func <uint, A32Disassembler, bool>[] mutators)
 {
     this.opcode     = opcode;
     this.vectorData = vectorData;
     this.mutators   = mutators;
 }