| Index: third_party/openmax_dl/dl/api/armCOMM_s.h
|
| diff --git a/third_party/openmax_dl/dl/api/armCOMM_s.h b/third_party/openmax_dl/dl/api/armCOMM_s.h
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..6b0d2be66a2f8337d79b944b393cd962e1cea427
|
| --- /dev/null
|
| +++ b/third_party/openmax_dl/dl/api/armCOMM_s.h
|
| @@ -0,0 +1,409 @@
|
| +@// -*- Mode: asm; -*-
|
| +@//
|
| +@// Copyright (c) 2013 The WebRTC project authors. All Rights Reserved.
|
| +@//
|
| +@// Use of this source code is governed by a BSD-style license
|
| +@// that can be found in the LICENSE file in the root of the source
|
| +@// tree. An additional intellectual property rights grant can be found
|
| +@// in the file PATENTS. All contributing project authors may
|
| +@// be found in the AUTHORS file in the root of the source tree.
|
| +@//
|
| +@// This file was originally licensed as follows. It has been
|
| +@// relicensed with permission from the copyright holders.
|
| +@//
|
| +
|
| +@//
|
| +@// File Name: armCOMM_s.h
|
| +@// OpenMAX DL: v1.0.2
|
| +@// Last Modified Revision: 13871
|
| +@// Last Modified Date: Fri, 09 May 2008
|
| +@//
|
| +@// (c) Copyright 2007-2008 ARM Limited. All Rights Reserved.
|
| +@//
|
| +@//
|
| +@//
|
| +@// ARM optimized OpenMAX common header file
|
| +@//
|
| +
|
| + .set _SBytes, 0 @ Number of scratch bytes on stack
|
| + .set _Workspace, 0 @ Stack offset of scratch workspace
|
| +
|
| + .set _RRegList, 0 @ R saved register list (last register number)
|
| + .set _DRegList, 0 @ D saved register list (last register number)
|
| +
|
| + @// Work out a list of R saved registers, and how much stack space is needed.
|
| + @// gas doesn't support setting a variable to a string, so we set _RRegList to
|
| + @// the register number.
|
| + .macro _M_GETRREGLIST rreg
|
| + .ifeqs "\rreg", ""
|
| + @ Nothing needs to be saved
|
| + .exitm
|
| + .endif
|
| + @ If rreg is lr or r4, save lr and r4
|
| + .ifeqs "\rreg", "lr"
|
| + .set _RRegList, 4
|
| + .exitm
|
| + .endif
|
| +
|
| + .ifeqs "\rreg", "r4"
|
| + .set _RRegList, 4
|
| + .exitm
|
| + .endif
|
| +
|
| + @ If rreg = r5 or r6, save up to register r6
|
| + .ifeqs "\rreg", "r5"
|
| + .set _RRegList, 6
|
| + .exitm
|
| + .endif
|
| + .ifeqs "\rreg", "r6"
|
| + .set _RRegList, 6
|
| + .exitm
|
| + .endif
|
| +
|
| + @ If rreg = r7 or r8, save up to register r8
|
| + .ifeqs "\rreg", "r7"
|
| + .set _RRegList, 8
|
| + .exitm
|
| + .endif
|
| + .ifeqs "\rreg", "r8"
|
| + .set _RRegList, 8
|
| + .exitm
|
| + .endif
|
| +
|
| + @ If rreg = r9 or r10, save up to register r10
|
| + .ifeqs "\rreg", "r9"
|
| + .set _RRegList, 10
|
| + .exitm
|
| + .endif
|
| + .ifeqs "\rreg", "r10"
|
| + .set _RRegList, 10
|
| + .exitm
|
| + .endif
|
| +
|
| + @ If rreg = r11 or r12, save up to register r12
|
| + .ifeqs "\rreg", "r11"
|
| + .set _RRegList, 12
|
| + .exitm
|
| + .endif
|
| + .ifeqs "\rreg", "r12"
|
| + .set _RRegList, 12
|
| + .exitm
|
| + .endif
|
| +
|
| + .warning "Unrecognized saved r register limit: \rreg"
|
| + .endm
|
| +
|
| + @ Work out list of D saved registers, like for R registers.
|
| + .macro _M_GETDREGLIST dreg
|
| + .ifeqs "\dreg", ""
|
| + .set _DRegList, 0
|
| + .exitm
|
| + .endif
|
| +
|
| + .ifeqs "\dreg", "d8"
|
| + .set _DRegList, 8
|
| + .exitm
|
| + .endif
|
| +
|
| + .ifeqs "\dreg", "d9"
|
| + .set _DRegList, 9
|
| + .exitm
|
| + .endif
|
| +
|
| + .ifeqs "\dreg", "d10"
|
| + .set _DRegList, 10
|
| + .exitm
|
| + .endif
|
| +
|
| + .ifeqs "\dreg", "d11"
|
| + .set _DRegList, 11
|
| + .exitm
|
| + .endif
|
| +
|
| + .ifeqs "\dreg", "d12"
|
| + .set _DRegList, 12
|
| + .exitm
|
| + .endif
|
| +
|
| + .ifeqs "\dreg", "d13"
|
| + .set _DRegList, 13
|
| + .exitm
|
| + .endif
|
| +
|
| + .ifeqs "\dreg", "d14"
|
| + .set _DRegList, 14
|
| + .exitm
|
| + .endif
|
| +
|
| + .ifeqs "\dreg", "d15"
|
| + .set _DRegList, 15
|
| + .exitm
|
| + .endif
|
| +
|
| + .warning "Unrecognized saved d register limit: \rreg"
|
| + .endm
|
| +
|
| +@//////////////////////////////////////////////////////////
|
| +@// Function header and footer macros
|
| +@//////////////////////////////////////////////////////////
|
| +
|
| + @ Function Header Macro
|
| + @ Generates the function prologue
|
| + @ Note that functions should all be "stack-moves-once"
|
| + @ The FNSTART and FNEND macros should be the only places
|
| + @ where the stack moves.
|
| + @
|
| + @ name = function name
|
| + @ rreg = "" don't stack any registers
|
| + @ "lr" stack "lr" only
|
| + @ "rN" stack registers "r4-rN,lr"
|
| + @ dreg = "" don't stack any D registers
|
| + @ "dN" stack registers "d8-dN"
|
| + @
|
| + @ Note: ARM Archicture procedure call standard AAPCS
|
| + @ states that r4-r11, sp, d8-d15 must be preserved by
|
| + @ a compliant function.
|
| + .macro M_START name, rreg, dreg
|
| + .set _Workspace, 0
|
| +
|
| + @ Define the function and make it external.
|
| + .global \name
|
| + .func \name
|
| + .section .text.\name,"ax",%progbits
|
| + .align 2
|
| +\name :
|
| +.fnstart
|
| + @ Save specified R registers
|
| + _M_GETRREGLIST \rreg
|
| + _M_PUSH_RREG
|
| +
|
| + @ Save specified D registers
|
| + _M_GETDREGLIST \dreg
|
| + _M_PUSH_DREG
|
| +
|
| + @ Ensure size claimed on stack is 8-byte aligned
|
| + .if (_SBytes & 7) != 0
|
| + .set _SBytes, _SBytes + (8 - (_SBytes & 7))
|
| + .endif
|
| + .if _SBytes != 0
|
| + sub sp, sp, #_SBytes
|
| + .endif
|
| + .endm
|
| +
|
| + @ Function Footer Macro
|
| + @ Generates the function epilogue
|
| + .macro M_END
|
| + @ Restore the stack pointer to its original value on function entry
|
| + .if _SBytes != 0
|
| + add sp, sp, #_SBytes
|
| + .endif
|
| + @ Restore any saved R or D registers.
|
| + _M_RET
|
| + .fnend
|
| + .endfunc
|
| + @ Reset the global stack tracking variables back to their
|
| + @ initial values.
|
| + .set _SBytes, 0
|
| + .endm
|
| +
|
| + @// Based on the value of _DRegList, push the specified set of registers
|
| + @// to the stack. Is there a better way?
|
| + .macro _M_PUSH_DREG
|
| + .if _DRegList == 8
|
| + vpush {d8}
|
| + .exitm
|
| + .endif
|
| +
|
| + .if _DRegList == 9
|
| + vpush {d8-d9}
|
| + .exitm
|
| + .endif
|
| +
|
| + .if _DRegList == 10
|
| + vpush {d8-d10}
|
| + .exitm
|
| + .endif
|
| +
|
| + .if _DRegList == 11
|
| + vpush {d8-d11}
|
| + .exitm
|
| + .endif
|
| +
|
| + .if _DRegList == 12
|
| + vpush {d8-d12}
|
| + .exitm
|
| + .endif
|
| +
|
| + .if _DRegList == 13
|
| + vpush {d8-d13}
|
| + .exitm
|
| + .endif
|
| +
|
| + .if _DRegList == 14
|
| + vpush {d8-d14}
|
| + .exitm
|
| + .endif
|
| +
|
| + .if _DRegList == 15
|
| + vpush {d8-d15}
|
| + .exitm
|
| + .endif
|
| + .endm
|
| +
|
| + @// Based on the value of _RRegList, push the specified set of registers
|
| + @// to the stack. Is there a better way?
|
| + .macro _M_PUSH_RREG
|
| + .if _RRegList == 4
|
| + stmfd sp!, {r4, lr}
|
| + .exitm
|
| + .endif
|
| +
|
| + .if _RRegList == 6
|
| + stmfd sp!, {r4-r6, lr}
|
| + .exitm
|
| + .endif
|
| +
|
| + .if _RRegList == 8
|
| + stmfd sp!, {r4-r8, lr}
|
| + .exitm
|
| + .endif
|
| +
|
| + .if _RRegList == 10
|
| + stmfd sp!, {r4-r10, lr}
|
| + .exitm
|
| + .endif
|
| +
|
| + .if _RRegList == 12
|
| + stmfd sp!, {r4-r12, lr}
|
| + .exitm
|
| + .endif
|
| + .endm
|
| +
|
| + @// The opposite of _M_PUSH_DREG
|
| + .macro _M_POP_DREG
|
| + .if _DRegList == 8
|
| + vpop {d8}
|
| + .exitm
|
| + .endif
|
| +
|
| + .if _DRegList == 9
|
| + vpop {d8-d9}
|
| + .exitm
|
| + .endif
|
| +
|
| + .if _DRegList == 10
|
| + vpop {d8-d10}
|
| + .exitm
|
| + .endif
|
| +
|
| + .if _DRegList == 11
|
| + vpop {d8-d11}
|
| + .exitm
|
| + .endif
|
| +
|
| + .if _DRegList == 12
|
| + vpop {d8-d12}
|
| + .exitm
|
| + .endif
|
| +
|
| + .if _DRegList == 13
|
| + vpop {d8-d13}
|
| + .exitm
|
| + .endif
|
| +
|
| + .if _DRegList == 14
|
| + vpop {d8-d14}
|
| + .exitm
|
| + .endif
|
| +
|
| + .if _DRegList == 15
|
| + vpop {d8-d15}
|
| + .exitm
|
| + .endif
|
| + .endm
|
| +
|
| + @// The opposite of _M_PUSH_RREG
|
| + .macro _M_POP_RREG cc
|
| + .if _RRegList == 0
|
| + bx\cc lr
|
| + .exitm
|
| + .endif
|
| + .if _RRegList == 4
|
| + ldm\cc\()fd sp!, {r4, pc}
|
| + .exitm
|
| + .endif
|
| +
|
| + .if _RRegList == 6
|
| + ldm\cc\()fd sp!, {r4-r6, pc}
|
| + .exitm
|
| + .endif
|
| +
|
| + .if _RRegList == 8
|
| + ldm\cc\()fd sp!, {r4-r8, pc}
|
| + .exitm
|
| + .endif
|
| +
|
| + .if _RRegList == 10
|
| + ldm\cc\()fd sp!, {r4-r10, pc}
|
| + .exitm
|
| + .endif
|
| +
|
| + .if _RRegList == 12
|
| + ldm\cc\()fd sp!, {r4-r12, pc}
|
| + .exitm
|
| + .endif
|
| + .endm
|
| +
|
| + @ Produce function return instructions
|
| + .macro _M_RET cc
|
| + _M_POP_DREG \cc
|
| + _M_POP_RREG \cc
|
| + .endm
|
| +
|
| + @// Allocate 4-byte aligned area of name
|
| + @// |name| and size |size| bytes.
|
| + .macro M_ALLOC4 name, size
|
| + .if (_SBytes & 3) != 0
|
| + .set _SBytes, _SBytes + (4 - (_SBytes & 3))
|
| + .endif
|
| + .set \name\()_F, _SBytes
|
| + .set _SBytes, _SBytes + \size
|
| +
|
| + .endm
|
| +
|
| + @ Load word from stack
|
| + .macro M_LDR r, a0, a1, a2, a3
|
| + _M_DATA "ldr", 4, \r, \a0, \a1, \a2, \a3
|
| + .endm
|
| +
|
| + @ Store word to stack
|
| + .macro M_STR r, a0, a1, a2, a3
|
| + _M_DATA "str", 4, \r, \a0, \a1, \a2, \a3
|
| + .endm
|
| +
|
| + @ Macro to perform a data access operation
|
| + @ Such as LDR or STR
|
| + @ The addressing mode is modified such that
|
| + @ 1. If no address is given then the name is taken
|
| + @ as a stack offset
|
| + @ 2. If the addressing mode is not available for the
|
| + @ state being assembled for (eg Thumb) then a suitable
|
| + @ addressing mode is substituted.
|
| + @
|
| + @ On Entry:
|
| + @ $i = Instruction to perform (eg "LDRB")
|
| + @ $a = Required byte alignment
|
| + @ $r = Register(s) to transfer (eg "r1")
|
| + @ $a0,$a1,$a2. Addressing mode and condition. One of:
|
| + @ label {,cc}
|
| + @ [base] {,,,cc}
|
| + @ [base, offset]{!} {,,cc}
|
| + @ [base, offset, shift]{!} {,cc}
|
| + @ [base], offset {,,cc}
|
| + @ [base], offset, shift {,cc}
|
| + @
|
| + @ WARNING: Most of the above are not supported, except the first case.
|
| + .macro _M_DATA i, a, r, a0, a1, a2, a3
|
| + .set _Offset, _Workspace + \a0\()_F
|
| + \i\a1 \r, [sp, #_Offset]
|
| + .endm
|
|
|