From: Martin Storsjo Date: Wed, 15 May 2013 14:09:22 +0000 (+0300) Subject: thumb: Add a parameter for specifying a shift offset for the pc addition conversion X-Git-Tag: v1.3.0~1120 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=6b9a7b3333352a6f0e8f1b2d8b690b33e18a9a08;p=libvpx thumb: Add a parameter for specifying a shift offset for the pc addition conversion The branch instructions are encoded as 16 bit instructions by the microsoft assembler, while they are encoded as 32 bit instructions by gnu binutils. Change-Id: I622b9025df3520c08eef8447df078f5517fb4b67 --- diff --git a/build/make/ads2armasm_ms.pl b/build/make/ads2armasm_ms.pl index 2d3e6328f..1def53901 100755 --- a/build/make/ads2armasm_ms.pl +++ b/build/make/ads2armasm_ms.pl @@ -28,7 +28,7 @@ while () s/qsubaddx/qsax/i; s/qaddsubx/qasx/i; - thumb::FixThumbInstructions($_); + thumb::FixThumbInstructions($_, 1); s/ldrneb/ldrbne/i; s/ldrneh/ldrhne/i; diff --git a/build/make/ads2gas.pl b/build/make/ads2gas.pl index c84941e99..9c4190129 100755 --- a/build/make/ads2gas.pl +++ b/build/make/ads2gas.pl @@ -183,7 +183,7 @@ while () s/(vtbl.\d+\s+[^,]+),([^,]+)/$1,\{$2\}/g; if ($thumb) { - thumb::FixThumbInstructions($_); + thumb::FixThumbInstructions($_, 0); } # eabi_attributes numerical equivalents can be found in the diff --git a/build/make/thumb.pm b/build/make/thumb.pm index d04dffe85..f34728743 100644 --- a/build/make/thumb.pm +++ b/build/make/thumb.pm @@ -11,8 +11,11 @@ package thumb; -sub FixThumbInstructions($) +sub FixThumbInstructions($$) { + my $short_branches = $_[1]; + my $branch_shift_offset = $short_branches ? 1 : 0; + # Write additions with shifts, such as "add r10, r11, lsl #8", # in three operand form, "add r10, r10, r11, lsl #8". s/(add\s+)(r\d+),\s*(r\d+),\s*(lsl #\d+)/$1$2, $2, $3, $4/g; @@ -56,7 +59,7 @@ sub FixThumbInstructions($) # "itttt lt", "movlt.n r12, pc", "addlt.w r12, #12", # "addlt.w r12, r12, r3, lsl #2", "movlt.n pc, r12". # This assumes that r12 is free at this point. - s/^(\s*)addlt(\s+)pc,\s*pc,\s*(\w+),\s*lsl\s*#(\d+)/$1itttt$2lt\n$1movlt.n$2r12, pc\n$1addlt.w$2r12, #12\n$1addlt.w$2r12, r12, $3, lsl #$4\n$1movlt.n$2pc, r12/g; + s/^(\s*)addlt(\s+)pc,\s*pc,\s*(\w+),\s*lsl\s*#(\d+)/$1itttt$2lt\n$1movlt.n$2r12, pc\n$1addlt.w$2r12, #12\n$1addlt.w$2r12, r12, $3, lsl #($4-$branch_shift_offset)\n$1movlt.n$2pc, r12/g; # Convert "mov pc, lr" into "bx lr", since the former only works # for switching from arm to thumb (and only in armv7), but not