Explorar el Código

vector register on the left hand side of an assignment

git-svn-id: https://svn.inf.ethz.ch/svn/lecturers/a2/trunk@8148 8c9fc860-2736-0410-a75d-ab315db34111
felixf hace 7 años
padre
commit
ea71e5e348
Se han modificado 2 ficheros con 14 adiciones y 1 borrados
  1. 9 1
      source/FoxIntermediateBackend.Mod
  2. 5 0
      source/FoxIntermediateCode.Mod

+ 9 - 1
source/FoxIntermediateBackend.Mod

@@ -10370,7 +10370,13 @@ TYPE
 					Designate(right,rightO);
 					Designate(left,leftO);
 					size := ToMemoryUnits(system,system.SizeOf(rightType));
-					Emit(Copy(position,leftO.op, rightO.op, IntermediateCode.Immediate(addressType,size)));
+					IF IntermediateCode.IsVectorRegister(leftO.op) THEN
+						MakeMemory(mem, rightO.op, leftO.op.type,0);
+						Emit(Mov(position, leftO.op, mem)); 
+						ReleaseIntermediateOperand(mem); 
+					ELSE
+						Emit(Copy(position,leftO.op, rightO.op, IntermediateCode.Immediate(addressType,size)));
+					END;
 					ReleaseOperand(leftO); ReleaseOperand(rightO);
 				ELSE
 					AssignMathArray(left,right);
@@ -14684,6 +14690,8 @@ TYPE
 	PROCEDURE Copy(position: Basic.Position;dest,src,size: IntermediateCode.Operand): IntermediateCode.Instruction;
 	VAR instruction: IntermediateCode.Instruction;
 	BEGIN
+		ASSERT(~IntermediateCode.IsVectorRegister(dest)); 
+		ASSERT(~IntermediateCode.IsVectorRegister(src)); 
 		IntermediateCode.InitInstruction(instruction,position,IntermediateCode.copy,dest,src,size);
 		RETURN instruction
 	END Copy;

+ 5 - 0
source/FoxIntermediateCode.Mod

@@ -1087,6 +1087,11 @@ TYPE
 	PROCEDURE ToVectorType*(VAR type: Type; length: LONGINT);
 	BEGIN type.length := length
 	END ToVectorType;
+	
+	PROCEDURE IsVectorRegister*(CONST op: Operand): BOOLEAN;
+	BEGIN
+		RETURN (op.mode = ModeRegister) & (op.type.length > 1);
+	END IsVectorRegister;
 
 	PROCEDURE InitRegisterClass*(VAR registerClass: RegisterClass; class: SHORTINT; number: LONGINT);
 	BEGIN registerClass.class := class; registerClass.number := INTEGER(number)