On 1 December 2015 at 10:51, Ard Biesheuvel <[email protected]> wrote:
> The RVCT compiler may emit calls to the various __aeabi_c?cmp??
> functions, which return their results via the CPU condition flags
> C and Z. According to ARM doc IHI 0043D 'Run-time ABI for the ARM
> architecture':
>
>     The 3-way comparison functions c*cmple, c*cmpeq and c*rcmple return
>     their results in the CPSR Z and C flags. C is clear only if the operands
>     are ordered and the first operand is less than the second. Z is set only
>     when the operands are ordered and equal.
>
> Add implementations for the double and float variants of the above.
>
> Contributed-under: TianoCore Contribution Agreement 1.0
> Signed-off-by: Ard Biesheuvel <[email protected]>
> ---
> v2: - correctly preserve r0 - r3 across the entire call
>     - use ALU instructions rather than direct CPSR manipulation to set the
>       C and Z condition flags
>

@Leif: any objections?

>  ArmPkg/Library/ArmSoftFloatLib/Arm/__aeabi_cdcmp.asm | 46 
> ++++++++++++++++++++
>  ArmPkg/Library/ArmSoftFloatLib/Arm/__aeabi_cfcmp.asm | 42 ++++++++++++++++++
>  ArmPkg/Library/ArmSoftFloatLib/ArmSoftFloatLib.inf   |  3 ++
>  3 files changed, 91 insertions(+)
>
> diff --git a/ArmPkg/Library/ArmSoftFloatLib/Arm/__aeabi_cdcmp.asm 
> b/ArmPkg/Library/ArmSoftFloatLib/Arm/__aeabi_cdcmp.asm
> new file mode 100644
> index 000000000000..cb4bbdd37460
> --- /dev/null
> +++ b/ArmPkg/Library/ArmSoftFloatLib/Arm/__aeabi_cdcmp.asm
> @@ -0,0 +1,46 @@
> +//------------------------------------------------------------------------------
> +//
> +// Copyright (c) 2015, Linaro Limited. All rights reserved.
> +//
> +// This program and the accompanying materials
> +// are licensed and made available under the terms and conditions of the BSD 
> License
> +// which accompanies this distribution.  The full text of the license may be 
> found at
> +// http://opensource.org/licenses/bsd-license.php
> +//
> +// THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> +// WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR 
> IMPLIED.
> +//
> +//------------------------------------------------------------------------------
> +
> +    EXPORT      __aeabi_cdrcmple
> +    EXPORT      __aeabi_cdcmpeq
> +    EXPORT      __aeabi_cdcmple
> +    IMPORT      float64_eq
> +    IMPORT      float64_lt
> +
> +    AREA        __aeabi_cdcmp, CODE, READONLY
> +
> +__aeabi_cdrcmple
> +    MOV         IP, R0
> +    MOV         R0, R2
> +    MOV         R2, IP
> +
> +    MOV         IP, R1
> +    MOV         R1, R3
> +    MOV         R3, IP
> +
> +__aeabi_cdcmpeq
> +__aeabi_cdcmple
> +    PUSH        {R0 - R3, LR}
> +    BL          float64_eq
> +    SUB         IP, R0, #1
> +    CMP         IP, #0                  // sets C and Z if R0 == 1
> +    POPEQ       {R0 - R3, PC}
> +
> +    LDM         SP, {R0 - R3}
> +    BL          float64_lt
> +    SUB         IP, R0, #1
> +    CMP         IP, #1                  // sets C if R0 == 0
> +    POP         {R0 - R3, PC}
> +
> +    END
> diff --git a/ArmPkg/Library/ArmSoftFloatLib/Arm/__aeabi_cfcmp.asm 
> b/ArmPkg/Library/ArmSoftFloatLib/Arm/__aeabi_cfcmp.asm
> new file mode 100644
> index 000000000000..5e9f37c14f8c
> --- /dev/null
> +++ b/ArmPkg/Library/ArmSoftFloatLib/Arm/__aeabi_cfcmp.asm
> @@ -0,0 +1,42 @@
> +//------------------------------------------------------------------------------
> +//
> +// Copyright (c) 2015, Linaro Limited. All rights reserved.
> +//
> +// This program and the accompanying materials
> +// are licensed and made available under the terms and conditions of the BSD 
> License
> +// which accompanies this distribution.  The full text of the license may be 
> found at
> +// http://opensource.org/licenses/bsd-license.php
> +//
> +// THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> +// WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR 
> IMPLIED.
> +//
> +//------------------------------------------------------------------------------
> +
> +    EXPORT      __aeabi_cfrcmple
> +    EXPORT      __aeabi_cfcmpeq
> +    EXPORT      __aeabi_cfcmple
> +    IMPORT      float32_eq
> +    IMPORT      float32_lt
> +
> +    AREA        __aeabi_cfcmp, CODE, READONLY
> +
> +__aeabi_cfrcmple
> +    MOV         IP, R0
> +    MOV         R0, R1
> +    MOV         R1, IP
> +
> +__aeabi_cfcmpeq
> +__aeabi_cfcmple
> +    PUSH        {R0 - R3, LR}
> +    BL          float32_eq
> +    SUB         IP, R0, #1
> +    CMP         IP, #0                  // sets C and Z if R0 == 1
> +    POPEQ       {R0 - R3, PC}
> +
> +    LDM         SP, {R0 - R1}
> +    BL          float32_lt
> +    SUB         IP, R0, #1
> +    CMP         IP, #1                  // sets C if R0 == 0
> +    POP         {R0 - R3, PC}
> +
> +    END
> diff --git a/ArmPkg/Library/ArmSoftFloatLib/ArmSoftFloatLib.inf 
> b/ArmPkg/Library/ArmSoftFloatLib/ArmSoftFloatLib.inf
> index 39c74bf1a3c2..3d3445197f49 100644
> --- a/ArmPkg/Library/ArmSoftFloatLib/ArmSoftFloatLib.inf
> +++ b/ArmPkg/Library/ArmSoftFloatLib/ArmSoftFloatLib.inf
> @@ -41,6 +41,9 @@ [Sources]
>    Arm/__aeabi_dcmpun.c
>    Arm/__aeabi_fcmpun.c
>
> +  Arm/__aeabi_cdcmp.asm   | RVCT
> +  Arm/__aeabi_cfcmp.asm   | RVCT
> +
>  [Packages]
>    MdePkg/MdePkg.dec
>
> --
> 1.9.1
>
_______________________________________________
edk2-devel mailing list
[email protected]
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to