Browse Source

improved CRC computation (performance)

git-svn-id: https://svn.inf.ethz.ch/svn/lecturers/a2/trunk@7269 8c9fc860-2736-0410-a75d-ab315db34111
felixf 8 years ago
parent
commit
ed9b331dbd
2 changed files with 96 additions and 0 deletions
  1. 70 0
      source/FoxIntermediateCode.Mod
  2. 26 0
      source/FoxSections.Mod

+ 70 - 0
source/FoxIntermediateCode.Mod

@@ -376,6 +376,17 @@ TYPE
 				ww.DecIndent;
 			END;
 		END Dump;
+		
+		PROCEDURE WriteRaw(w: Streams.Writer);
+		VAR i: LONGINT;
+		BEGIN
+			FOR i := 0 TO pc-1 DO
+				w.Int(i,2); w.String(": ");
+				WriteRawInstruction(w,instructions[i]); w.Ln;
+				INC(i);
+			END;
+		END WriteRaw;
+		
 
 	END Section;
 
@@ -676,6 +687,55 @@ TYPE
 		CheckOperand(operand);
 		*)
 	END DumpOperand;
+	
+	PROCEDURE WriteRawOperand*(w: Streams.Writer; CONST operand: Operand );
+	VAR i: LONGINT;
+	BEGIN
+		w.RawLInt(operand.type.form);
+		w.RawLInt(operand.type.sizeInBits);
+		w.RawLInt(operand.type.length);
+		CASE operand.mode OF
+			Undefined:
+		|ModeMemory:
+			IF operand.register # None THEN
+				w.RawLInt(operand.register);
+				w.RawSInt(operand.registerClass.class);
+				w.RawInt(operand.registerClass.number);
+				w.RawLInt(operand.offset);
+			ELSIF operand.symbol.name # "" THEN
+				Basic.WriteSegmentedName(w,operand.symbol.name);
+				IF operand.symbol.fingerprint # 0 THEN w.RawLInt(operand.symbol.fingerprint);END;
+				w.RawLInt(operand.symbolOffset);
+				w.RawLInt(operand.offset);
+			ELSE w.RawLInt(SHORT(operand.intValue));
+			END;
+		|ModeRegister:
+			w.RawLInt(operand.register);
+			w.RawSInt(operand.registerClass.class);
+			w.RawInt(operand.registerClass.number);
+			w.RawLInt(operand.offset);
+		|ModeImmediate:
+			IF operand.symbol.name # "" THEN
+				Basic.WriteSegmentedName(w,operand.symbol.name);
+				IF operand.symbol.fingerprint # 0 THEN w.RawLInt(operand.symbol.fingerprint);END;
+				w.RawLInt(operand.symbolOffset);
+				w.RawLInt(operand.offset);
+			ELSE
+				IF operand.type.form IN Integer THEN
+						w.RawLInt(SHORT(operand.intValue));
+				ELSE
+					w.RawLReal(operand.floatValue);
+				END;
+			END;
+		|ModeString:
+			w.RawString(operand.string^);
+		|ModeNumber: w.RawLInt(SHORT(operand.intValue));
+		|ModeRule:
+			FOR i := 0 TO LEN(operand.rule)-1 DO
+				WriteRawOperand(w,operand.rule[i]);  w.RawString(operand.rule[i].string^);
+			END;
+		END;
+	END WriteRawOperand;
 
 	PROCEDURE TypeEquals*(CONST s1,s2: Type): BOOLEAN;
 	BEGIN RETURN (s1.form = s2.form) & (s1.sizeInBits = s2.sizeInBits) & (s1.length = s2.length);
@@ -698,6 +758,16 @@ TYPE
 		RETURN TRUE
 	END Equals;
 
+	PROCEDURE WriteRawInstruction*(w: Streams.Writer; CONST instr: Instruction);
+	BEGIN
+		w.RawLInt(instr.opcode);
+		IF instr.op1.mode # Undefined THEN WriteRawOperand(w,instr.op1) END;
+		IF instr.op2.mode # Undefined THEN WriteRawOperand(w,instr.op2) END;
+		IF instr.op3.mode # Undefined THEN WriteRawOperand(w,instr.op3) END;
+		IF instr.opcode = special THEN w.RawLInt(instr.subtype) END;		
+	END WriteRawInstruction;
+	
+
 	PROCEDURE DumpInstruction*(w: Streams.Writer; CONST instr: Instruction);
 	BEGIN
 		w.String(instructionFormat[instr.opcode].name);

+ 26 - 0
source/FoxSections.Mod

@@ -139,6 +139,17 @@ TYPE
 
 			w.Update
 		END Dump;
+		
+		PROCEDURE WriteRaw*(w: Streams.Writer);
+		BEGIN
+			w.RawInt(type); 
+			Basic.WriteSegmentedName(w,name);
+			w.RawBool(fixed);
+			w.RawLInt(positionOrAlignment); 
+			w.RawLInt(priority);
+			w.RawLInt(fingerprint);
+			w.RawLInt(bitsPerUnit);
+		END WriteRaw;
 
 		PROCEDURE DumpName*(w: Streams.Writer);
 		BEGIN
@@ -351,7 +362,22 @@ TYPE
 				section.Dump(w); w.Ln
 			END;
 		END Dump;
+
+		PROCEDURE WriteRaw*(w: Streams.Writer);
+		VAR
+			i: LONGINT;
+			section: Section;
+		BEGIN
+			FOR i := 0 TO Length() - 1 DO
+				section := GetSection(i);
+				section.WriteRaw(w);
+			END;
+		END WriteRaw;
+		
+		
 	END SectionList;
+	
+	
 
 	NameEntry = POINTER TO RECORD
 		name: SyntaxTree.IdentifierString;