Преглед на файлове

patched emission of instructions that require a REX prefix that must be positioned after a legacy prefix.

git-svn-id: https://svn.inf.ethz.ch/svn/lecturers/a2/trunk@7659 8c9fc860-2736-0410-a75d-ab315db34111
felixf преди 7 години
родител
ревизия
5ea182c7f1
променени са 1 файла, в които са добавени 17 реда и са изтрити 4 реда
  1. 17 4
      source/FoxAMD64Assembler.Mod

+ 17 - 4
source/FoxAMD64Assembler.Mod

@@ -403,6 +403,12 @@ TYPE
 			BEGIN
 				RETURN {InstructionSet.cpuFPU} * InstructionSet.instructions[instr].cpuOptions # {}
 			END FPOperation;
+			
+			PROCEDURE IsPreREXPrefix(c1,c2: CHAR): BOOLEAN;
+			BEGIN
+				RETURN (c1 = CHR(opCode)) & ((c2 = 0F2X) OR (c2 = 0F3X) ) ;
+			END IsPreREXPrefix;
+			
 
 		BEGIN
 			IF (dump # NIL) & (lastPass) THEN
@@ -551,9 +557,19 @@ TYPE
 			IF InstructionSet.optPREP IN bitwidthOptions THEN code.PutByte (InstructionSet.prfREP) END;
 			IF InstructionSet.optPREPN IN bitwidthOptions THEN code.PutByte (InstructionSet.prfREPNE) END;
 
+
+			op := 0;
+
+			oppos := 0;
+			val := -1;
+
 			IF rexPrefix # {} THEN
 				ASSERT(cpuBits = bits64);
 				byte := 40H;
+				WHILE (oppos < LEN(opcode)-1) & IsPreREXPrefix(opcode[oppos], opcode[oppos+1]) DO
+					code.PutByte(ORD(opcode[oppos+1])); 
+					INC(oppos,2); 
+				END;
 				IF rexB IN rexPrefix THEN byte := byte + 1H END;
 				IF rexX IN rexPrefix THEN byte := byte + 2H END;
 				IF rexR IN rexPrefix THEN byte := byte + 4H END;
@@ -561,12 +577,9 @@ TYPE
 				code.PutByte (byte);
 			END;
 
-			op := 0;
-
-			oppos := 0;
-			val := -1;
 
 			WHILE (oppos < LEN(opcode)) & (opcode[oppos] # CHR(none)) DO
+
 				IF opcode[oppos] = CHR(opCode) THEN
 					IF Trace THEN KernelLog.String("opcode "); KernelLog.Hex(ORD(opcode[oppos+1]),-2);  END;
 					IF val # -1 THEN code.PutByte (val) END;