public InstrDecoder(Opcode opcode, InstrClass iclass, ArmVectorData vectorData, params Mutator <A32Disassembler>[] mutators) { this.opcode = opcode; this.iclass = iclass; this.vectorData = vectorData; this.mutators = mutators; }
public InstrDecoder(Mnemonic mnemonic, InstrClass iclass, ArmVectorData vec, params Mutator <T32Disassembler>[] mutators) { this.mnemonic = mnemonic; this.iclass = iclass; this.vec = vec; this.mutators = mutators; }
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); } }
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)"); } }
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); }
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); }
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); }
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)); } }
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); } }
private void RewriteVectorBinOp(string fnNameFormat, ArmVectorData elemType) { RewriteVectorBinOp(fnNameFormat, elemType, Dst(), Src1(), Src2()); }
public InstrDecoder(Opcode opcode, ArmVectorData vectorData, params Func <uint, A32Disassembler, bool>[] mutators) { this.opcode = opcode; this.vectorData = vectorData; this.mutators = mutators; }