srctools/tranasm/tranasm_x86.pl
changeset 0 044383f39525
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srctools/tranasm/tranasm_x86.pl	Tue Oct 27 16:36:35 2009 +0000
@@ -0,0 +1,75 @@
+# Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# Small Perl script for converting GCC inline X86 assembly instructions 
+# into a format acceptable to the MSVC compiler.
+# 
+#
+
+
+	# Read the input .cia file
+	open (INPUT_FILE,"$ARGV[0]") or
+		die "Couldn't open input file $!";
+	my @lines = <INPUT_FILE>;
+	close INPUT_FILE;
+
+	# Open the output file (somewhere under \epoc32\build)
+	open (OUTPUT_FILE,">$ARGV[1]") or
+		die "Couldn't open output file  $!";
+
+	# Iterate each line of the input .cia
+	foreach my $line (@lines) {
+
+		# Filter GCC inline assembly lines
+		$line=~s/\/\*(.*?)\*\///g;
+		my $output_line=$line;
+		if ($line=~m/^\s*asm\("(.*?)"(.*)\)(.*)/) {
+
+			# The above regexp seperates the asm declaration into the instruction part, and
+			# optionally a C expression as an operand
+			my $instr=$1;
+			my $c_arg=$2;
+			my $eol=$3;
+
+			# If a C operand is used, strip the weird GCC-specific syntax from it and paste
+			# it into the '%0' or '%a0' operand in the assembly instruction
+			if ($c_arg =~m/^\s*:\s*:\s*"i"\s*(.*)/) {
+				$c_arg = $1;
+				$output_line=$instr;
+
+				# Use of _FOFF has to be converted to MSVC syntax
+				if ($c_arg =~m/^_FOFF\((.*)\s*,\s*(.*)\)/) {
+					my $classname=$1;
+					my $member=$2;
+					$output_line=~s/\+%0]/]$classname.$member/;
+					$output_line=~s/\%0/$classname.$member/;
+				}
+				else {
+
+					$c_arg=~s/&//;			# strip the '&' used for address-of global code/data
+					$output_line=~s/%0/$c_arg/;
+					$output_line=~s/%a0/$c_arg/;
+				}
+			}
+			else {
+				$output_line="$instr$c_arg";
+			}
+
+			# Prefix the MSVC __asm keyword
+			$output_line = "__asm $output_line $eol\n";
+		}
+		print OUTPUT_FILE "$output_line";
+	}
+
+	close OUTPUT_FILE;
+