xref: /aosp_15_r20/external/libvpx/build/make/ads2gas_apple.pl (revision fb1b10ab9aebc7c7068eedab379b749d7e3900be)
1*fb1b10abSAndroid Build Coastguard Worker#!/usr/bin/env perl
2*fb1b10abSAndroid Build Coastguard Worker##
3*fb1b10abSAndroid Build Coastguard Worker##  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
4*fb1b10abSAndroid Build Coastguard Worker##
5*fb1b10abSAndroid Build Coastguard Worker##  Use of this source code is governed by a BSD-style license
6*fb1b10abSAndroid Build Coastguard Worker##  that can be found in the LICENSE file in the root of the source
7*fb1b10abSAndroid Build Coastguard Worker##  tree. An additional intellectual property rights grant can be found
8*fb1b10abSAndroid Build Coastguard Worker##  in the file PATENTS.  All contributing project authors may
9*fb1b10abSAndroid Build Coastguard Worker##  be found in the AUTHORS file in the root of the source tree.
10*fb1b10abSAndroid Build Coastguard Worker##
11*fb1b10abSAndroid Build Coastguard Worker
12*fb1b10abSAndroid Build Coastguard Worker
13*fb1b10abSAndroid Build Coastguard Worker# ads2gas_apple.pl
14*fb1b10abSAndroid Build Coastguard Worker# Author: Eric Fung (efung (at) acm.org)
15*fb1b10abSAndroid Build Coastguard Worker#
16*fb1b10abSAndroid Build Coastguard Worker# Convert ARM Developer Suite 1.0.1 syntax assembly source to GNU as format
17*fb1b10abSAndroid Build Coastguard Worker#
18*fb1b10abSAndroid Build Coastguard Worker# Usage: cat inputfile | perl ads2gas_apple.pl > outputfile
19*fb1b10abSAndroid Build Coastguard Worker#
20*fb1b10abSAndroid Build Coastguard Worker
21*fb1b10abSAndroid Build Coastguard Workerprint "@ This file was created from a .asm file\n";
22*fb1b10abSAndroid Build Coastguard Workerprint "@  using the ads2gas_apple.pl script.\n\n";
23*fb1b10abSAndroid Build Coastguard Workerprint ".syntax unified\n";
24*fb1b10abSAndroid Build Coastguard Worker
25*fb1b10abSAndroid Build Coastguard Workermy %macro_aliases;
26*fb1b10abSAndroid Build Coastguard Worker
27*fb1b10abSAndroid Build Coastguard Workermy @mapping_list = ("\$0", "\$1", "\$2", "\$3", "\$4", "\$5", "\$6", "\$7", "\$8", "\$9");
28*fb1b10abSAndroid Build Coastguard Worker
29*fb1b10abSAndroid Build Coastguard Workermy @incoming_array;
30*fb1b10abSAndroid Build Coastguard Worker
31*fb1b10abSAndroid Build Coastguard Worker# Perl trim function to remove whitespace from the start and end of the string
32*fb1b10abSAndroid Build Coastguard Workersub trim($)
33*fb1b10abSAndroid Build Coastguard Worker{
34*fb1b10abSAndroid Build Coastguard Worker    my $string = shift;
35*fb1b10abSAndroid Build Coastguard Worker    $string =~ s/^\s+//;
36*fb1b10abSAndroid Build Coastguard Worker    $string =~ s/\s+$//;
37*fb1b10abSAndroid Build Coastguard Worker    return $string;
38*fb1b10abSAndroid Build Coastguard Worker}
39*fb1b10abSAndroid Build Coastguard Worker
40*fb1b10abSAndroid Build Coastguard Workerwhile (<STDIN>)
41*fb1b10abSAndroid Build Coastguard Worker{
42*fb1b10abSAndroid Build Coastguard Worker    # Load and store alignment
43*fb1b10abSAndroid Build Coastguard Worker    s/@/,:/g;
44*fb1b10abSAndroid Build Coastguard Worker
45*fb1b10abSAndroid Build Coastguard Worker    # Comment character
46*fb1b10abSAndroid Build Coastguard Worker    s/;/@/;
47*fb1b10abSAndroid Build Coastguard Worker
48*fb1b10abSAndroid Build Coastguard Worker    # Convert ELSE to .else
49*fb1b10abSAndroid Build Coastguard Worker    s/\bELSE\b/.else/g;
50*fb1b10abSAndroid Build Coastguard Worker
51*fb1b10abSAndroid Build Coastguard Worker    # Convert ENDIF to .endif
52*fb1b10abSAndroid Build Coastguard Worker    s/\bENDIF\b/.endif/g;
53*fb1b10abSAndroid Build Coastguard Worker
54*fb1b10abSAndroid Build Coastguard Worker    # Convert IF to .if
55*fb1b10abSAndroid Build Coastguard Worker    if (s/\bIF\b/.if/g) {
56*fb1b10abSAndroid Build Coastguard Worker        s/=+/==/g;
57*fb1b10abSAndroid Build Coastguard Worker    }
58*fb1b10abSAndroid Build Coastguard Worker
59*fb1b10abSAndroid Build Coastguard Worker    # Convert INCLUDE to .INCLUDE "file"
60*fb1b10abSAndroid Build Coastguard Worker    s/INCLUDE\s?(.*)$/.include \"$1\"/;
61*fb1b10abSAndroid Build Coastguard Worker
62*fb1b10abSAndroid Build Coastguard Worker    # No AREA required
63*fb1b10abSAndroid Build Coastguard Worker    # But ALIGNs in AREA must be obeyed
64*fb1b10abSAndroid Build Coastguard Worker    s/^(\s*)\bAREA\b.*ALIGN=([0-9])$/$1.text\n$1.p2align $2/;
65*fb1b10abSAndroid Build Coastguard Worker    # If no ALIGN, strip the AREA and align to 4 bytes
66*fb1b10abSAndroid Build Coastguard Worker    s/^(\s*)\bAREA\b.*$/$1.text\n$1.p2align 2/;
67*fb1b10abSAndroid Build Coastguard Worker
68*fb1b10abSAndroid Build Coastguard Worker    # Make function visible to linker.
69*fb1b10abSAndroid Build Coastguard Worker    s/EXPORT\s+\|([\$\w]*)\|/.globl _$1/;
70*fb1b10abSAndroid Build Coastguard Worker
71*fb1b10abSAndroid Build Coastguard Worker    # No vertical bars on function names
72*fb1b10abSAndroid Build Coastguard Worker    s/^\|(\$?\w+)\|/$1/g;
73*fb1b10abSAndroid Build Coastguard Worker
74*fb1b10abSAndroid Build Coastguard Worker    # Labels and functions need a leading underscore and trailing colon
75*fb1b10abSAndroid Build Coastguard Worker    s/^([a-zA-Z_0-9\$]+)/_$1:/ if !/EQU/;
76*fb1b10abSAndroid Build Coastguard Worker
77*fb1b10abSAndroid Build Coastguard Worker    # Branches need to call the correct, underscored, function
78*fb1b10abSAndroid Build Coastguard Worker    s/^(\s+b[egln]?[teq]?\s+)([a-zA-Z_0-9\$]+)/$1 _$2/ if !/EQU/;
79*fb1b10abSAndroid Build Coastguard Worker
80*fb1b10abSAndroid Build Coastguard Worker    # ALIGN directive
81*fb1b10abSAndroid Build Coastguard Worker    s/\bALIGN\b/.balign/g;
82*fb1b10abSAndroid Build Coastguard Worker
83*fb1b10abSAndroid Build Coastguard Worker    # Strip ARM
84*fb1b10abSAndroid Build Coastguard Worker    s/\s+ARM//;
85*fb1b10abSAndroid Build Coastguard Worker
86*fb1b10abSAndroid Build Coastguard Worker    # Strip REQUIRE8
87*fb1b10abSAndroid Build Coastguard Worker    s/\s+REQUIRE8//;
88*fb1b10abSAndroid Build Coastguard Worker
89*fb1b10abSAndroid Build Coastguard Worker    # Strip PRESERVE8
90*fb1b10abSAndroid Build Coastguard Worker    s/\s+PRESERVE8//;
91*fb1b10abSAndroid Build Coastguard Worker
92*fb1b10abSAndroid Build Coastguard Worker    # Strip PROC and ENDPROC
93*fb1b10abSAndroid Build Coastguard Worker    s/\bPROC\b//g;
94*fb1b10abSAndroid Build Coastguard Worker    s/\bENDP\b//g;
95*fb1b10abSAndroid Build Coastguard Worker
96*fb1b10abSAndroid Build Coastguard Worker    # EQU directive
97*fb1b10abSAndroid Build Coastguard Worker    s/(\S+\s+)EQU(\s+\S+)/.equ $1, $2/;
98*fb1b10abSAndroid Build Coastguard Worker
99*fb1b10abSAndroid Build Coastguard Worker    # Begin macro definition
100*fb1b10abSAndroid Build Coastguard Worker    if (/\bMACRO\b/) {
101*fb1b10abSAndroid Build Coastguard Worker        # Process next line down, which will be the macro definition
102*fb1b10abSAndroid Build Coastguard Worker        $_ = <STDIN>;
103*fb1b10abSAndroid Build Coastguard Worker        s/^/.macro/;
104*fb1b10abSAndroid Build Coastguard Worker        s/\$//g;             # Remove $ from the variables in the declaration
105*fb1b10abSAndroid Build Coastguard Worker    }
106*fb1b10abSAndroid Build Coastguard Worker
107*fb1b10abSAndroid Build Coastguard Worker    s/\$/\\/g;               # Use \ to reference formal parameters
108*fb1b10abSAndroid Build Coastguard Worker    # End macro definition
109*fb1b10abSAndroid Build Coastguard Worker
110*fb1b10abSAndroid Build Coastguard Worker    s/\bMEND\b/.endm/;       # No need to tell it where to stop assembling
111*fb1b10abSAndroid Build Coastguard Worker    next if /^\s*END\s*$/;
112*fb1b10abSAndroid Build Coastguard Worker    s/[ \t]+$//;
113*fb1b10abSAndroid Build Coastguard Worker    print;
114*fb1b10abSAndroid Build Coastguard Worker}
115