On 2014-03-17 12:17:46 +0200, Martin Storsjö wrote:
> On Mon, 17 Mar 2014, Janne Grunau wrote:
>
> >On 2014-03-17 10:56:49 +0200, Martin Storsjö wrote:
> >>This does some rudimentary conversions of instructions that aren't
> >>available in thumb mode.
> >>
> >>This allows building OpenH264 for Windows Phone 8 (and Windows RT),
> >>which only supports thumb mode, and the OpenH264 arm assembly is
> >>hardcoded for arm mode.
> >>
> >>This is similar to how libvpx supports assembling in thumb mode - the
> >>source itself is arm mode only, but a perl script can replace
> >>instruction combinations that aren't supported in thumb mode. This
> >>is a small subset of those conversions.
> >>---
> >> gas-preprocessor.pl | 31 +++++++++++++++++++++++++++++++
> >> 1 file changed, 31 insertions(+)
> >>
> >>diff --git a/gas-preprocessor.pl b/gas-preprocessor.pl
> >>index 3d1049b..bbc5ff4 100755
> >>--- a/gas-preprocessor.pl
> >>+++ b/gas-preprocessor.pl
> >>@@ -883,6 +896,24 @@ sub handle_serialized_line {
> >> $line =~ s/&0x/& 0x/g;
> >> }
> >>
> >>+ if ($force_thumb) {
> >>+ # Convert register post indexing to a separate add instruction.
> >>+ # This converts "ldrneb r9, [r0], r2" into "ldrneb r9, [r0]",
> >>+ # "add r0, r2".
> >>+ $line =~
> >>s/^(\s*)((ldr|str)(ne)?[bhd]?)(\s+)(\w+),(\s*\w+,)?\s*\[(\w+)\],\s*(\w+)/$1$2$5$6,$7
> >> [$8]\n$1add$4$5$8, $8, $9/g;
> >
> >You're removing the condition.
>
> Oh, actually it's just the comment that is off - the regexp does the
> right thing. $4 should be the condition subexpression, and that's
> suffixed after the add instruction. Will fix anyway.
I missed the braces holding the whole load/store instruction.
> They're quite open to patches, but they are actually already using
> unified syntax.
>
> I copied this regexp over straight from libvpx (which doesn't use
> the unified syntax) - in openh264 none of these occurrances use
> condition codes at all (nor do they use the bhd suffixes either,
> it's all plain str/ldr instructions). For the record, you can see
> the full set of conversions they use in
> https://chromium.googlesource.com/webm/libvpx/+/master/build/make/thumb.pm.
>
> For openh264 I just needed this one (and a few other ones that I
> didn't run into in libvpx).
UAL syntax for ldrneb would be ldrbne which we should use. But if
openh264 doesn't use conditionals in matching instructions I would
just omit it for now.
> >This would be as function more readable considering that it might
> >need to be extended. Missing are condition codes, the sign
> >extending byte/half-word loads/stores and '!'
>
> You mean moving all of these thumb fixups to a separate function, or
> how should I make it more readable?
The ldr|str regexp itself, '$1$2$5$6,$7 [$8]' is not readable, variable
names could help.
Maybe not capturing whitespace and commas and handling ldrd/strd in its
own regexp would be enough.
> I don't think we need to handle the '!' variants since those are
> allowed as such in thumb anyway, or am I missing something? It's
> only the case with post-incrementing with a register that needs to
> be handled.
err, yes. what was I thinking?
> >>+
> >>+ # Convert "mov pc, lr" into "bx lr", since the former only works
> >>+ # for switching from arm to thumb (and only in armv7), but not
> >>+ # from thumb to arm.
> >>+ s/mov(\s*)pc\s*,\s*lr/bx$1lr/g;
> >>+
> >>+ # Convert stmdb/ldmia with only one register into a plain str/ldr
> >>with post-increment/decrement
> >>+ $line =~ s/^(\s*)stmdb(\s+)sp!\s*,\s*\{([^,-]+)\}/$1str$2$3, [sp,
> >>#-4]!/g;
> >>+ $line =~ s/^(\s*)ldmia(\s+)sp!\s*,\s*\{([^,-]+)\}/$1ldr$2$3, [sp],
> >>#4/g;
> >>+
> >>+ $line =~ s/\.arm/.thumb/x;
> >>+ }
> >
> >does openh264 use no conditional instructions or does armasm insert the
> >appropriate 'it' instructions automatically?
>
> armasm adds the appropriate 'it' instructions automatically (and
> warns about it). For the --enable-thumb case in libvpx (enabling the
> same conversions but building with normal gas for linux, where I
> wrote most of this logic originally, as a stepping stone before
> trying to bring all of it into armasm) it requires building with
> -mimplicit-it=always though.
Forgot about those, I was asking because I was wondering why it wasn't
added in the ldrne case above but not worth making the regexp even more
complicated.
Janne
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel