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