1#------------------------------------------------------------------------------ 2# 3# Replacement for Math64.c that is coded to use older GCC intrinsics. 4# Doing this reduces the number of intrinsics that are required when 5# you port to a new version of gcc. 6# 7# Need to split this into multple files to size optimize the image. 8# 9# Copyright (c) 2009 - 2010, Apple Inc. All rights reserved.<BR> 10# SPDX-License-Identifier: BSD-2-Clause-Patent 11# 12#------------------------------------------------------------------------------ 13 14 .text 15 .align 2 16 GCC_ASM_EXPORT(InternalMathLShiftU64) 17 18ASM_PFX(InternalMathLShiftU64): 19 stmfd sp!, {r4, r5, r6} 20 mov r6, r1 21 rsb ip, r2, #32 22 mov r4, r6, asl r2 23 subs r1, r2, #32 24 orr r4, r4, r0, lsr ip 25 mov r3, r0, asl r2 26 movpl r4, r0, asl r1 27 mov r5, r0 28 mov r0, r3 29 mov r1, r4 30 ldmfd sp!, {r4, r5, r6} 31 bx lr 32 33 .align 2 34 GCC_ASM_EXPORT(InternalMathRShiftU64) 35 36ASM_PFX(InternalMathRShiftU64): 37 stmfd sp!, {r4, r5, r6} 38 mov r5, r0 39 rsb ip, r2, #32 40 mov r3, r5, lsr r2 41 subs r0, r2, #32 42 orr r3, r3, r1, asl ip 43 mov r4, r1, lsr r2 44 movpl r3, r1, lsr r0 45 mov r6, r1 46 mov r0, r3 47 mov r1, r4 48 ldmfd sp!, {r4, r5, r6} 49 bx lr 50 51 .align 2 52 GCC_ASM_EXPORT(InternalMathARShiftU64) 53 54ASM_PFX(InternalMathARShiftU64): 55 stmfd sp!, {r4, r5, r6} 56 mov r5, r0 57 rsb ip, r2, #32 58 mov r3, r5, lsr r2 59 subs r0, r2, #32 60 orr r3, r3, r1, asl ip 61 mov r4, r1, asr r2 62 movpl r3, r1, asr r0 63 mov r6, r1 64 mov r0, r3 65 mov r1, r4 66 ldmfd sp!, {r4, r5, r6} 67 bx lr 68 69 .align 2 70 GCC_ASM_EXPORT(InternalMathLRotU64) 71 72ASM_PFX(InternalMathLRotU64): 73 stmfd sp!, {r4, r5, r6, r7, lr} 74 add r7, sp, #12 75 mov r6, r1 76 rsb ip, r2, #32 77 mov r4, r6, asl r2 78 rsb lr, r2, #64 79 subs r1, r2, #32 80 orr r4, r4, r0, lsr ip 81 mov r3, r0, asl r2 82 movpl r4, r0, asl r1 83 sub ip, r2, #32 84 mov r5, r0 85 mov r0, r0, lsr lr 86 rsbs r2, r2, #32 87 orr r0, r0, r6, asl ip 88 mov r1, r6, lsr lr 89 movpl r0, r6, lsr r2 90 orr r1, r1, r4 91 orr r0, r0, r3 92 ldmfd sp!, {r4, r5, r6, r7, pc} 93 94 95 .align 2 96 GCC_ASM_EXPORT(InternalMathRRotU64) 97 98ASM_PFX(InternalMathRRotU64): 99 stmfd sp!, {r4, r5, r6, r7, lr} 100 add r7, sp, #12 101 mov r5, r0 102 rsb ip, r2, #32 103 mov r3, r5, lsr r2 104 rsb lr, r2, #64 105 subs r0, r2, #32 106 orr r3, r3, r1, asl ip 107 mov r4, r1, lsr r2 108 movpl r3, r1, lsr r0 109 sub ip, r2, #32 110 mov r6, r1 111 mov r1, r1, asl lr 112 rsbs r2, r2, #32 113 orr r1, r1, r5, lsr ip 114 mov r0, r5, asl lr 115 movpl r1, r5, asl r2 116 orr r0, r0, r3 117 orr r1, r1, r4 118 ldmfd sp!, {r4, r5, r6, r7, pc} 119 120 .align 2 121 GCC_ASM_EXPORT(InternalMathMultU64x32) 122 123ASM_PFX(InternalMathMultU64x32): 124 stmfd sp!, {r7, lr} 125 add r7, sp, #0 126 mov r3, #0 127 mov ip, r0 128 mov lr, r1 129 umull r0, r1, ip, r2 130 mla r1, lr, r2, r1 131 mla r1, ip, r3, r1 132 ldmfd sp!, {r7, pc} 133 134 .align 2 135 GCC_ASM_EXPORT(InternalMathMultU64x64) 136 137ASM_PFX(InternalMathMultU64x64): 138 stmfd sp!, {r7, lr} 139 add r7, sp, #0 140 mov ip, r0 141 mov lr, r1 142 umull r0, r1, ip, r2 143 mla r1, lr, r2, r1 144 mla r1, ip, r3, r1 145 ldmfd sp!, {r7, pc} 146 147 .align 2 148 GCC_ASM_EXPORT(InternalMathDivU64x32) 149 150ASM_PFX(InternalMathDivU64x32): 151 stmfd sp!, {r7, lr} 152 add r7, sp, #0 153 mov r3, #0 154 bl ASM_PFX(__udivdi3) 155 ldmfd sp!, {r7, pc} 156 157 158 .align 2 159 GCC_ASM_EXPORT(InternalMathModU64x32) 160 161ASM_PFX(InternalMathModU64x32): 162 stmfd sp!, {r7, lr} 163 add r7, sp, #0 164 mov r3, #0 165 bl ASM_PFX(__umoddi3) 166 ldmfd sp!, {r7, pc} 167 168 169 .align 2 170 GCC_ASM_EXPORT(InternalMathDivRemU64x32) 171 172ASM_PFX(InternalMathDivRemU64x32): 173 stmfd sp!, {r4, r5, r6, r7, lr} 174 add r7, sp, #12 175 stmfd sp!, {r10, r11} 176 subs r6, r3, #0 177 mov r10, r0 178 mov r11, r1 179 moveq r4, r2 180 moveq r5, #0 181 beq L22 182 mov r4, r2 183 mov r5, #0 184 mov r3, #0 185 bl ASM_PFX(__umoddi3) 186 str r0, [r6, #0] 187L22: 188 mov r0, r10 189 mov r1, r11 190 mov r2, r4 191 mov r3, r5 192 bl ASM_PFX(__udivdi3) 193 ldmfd sp!, {r10, r11} 194 ldmfd sp!, {r4, r5, r6, r7, pc} 195 196 197 .align 2 198 GCC_ASM_EXPORT(InternalMathDivRemU64x64) 199 200ASM_PFX(InternalMathDivRemU64x64): 201 stmfd sp!, {r4, r5, r6, r7, lr} 202 add r7, sp, #12 203 stmfd sp!, {r10, r11} 204 ldr r6, [sp, #28] 205 mov r4, r0 206 cmp r6, #0 207 mov r5, r1 208 mov r10, r2 209 mov r11, r3 210 beq L26 211 bl ASM_PFX(__umoddi3) 212 stmia r6, {r0-r1} 213L26: 214 mov r0, r4 215 mov r1, r5 216 mov r2, r10 217 mov r3, r11 218 bl ASM_PFX(__udivdi3) 219 ldmfd sp!, {r10, r11} 220 ldmfd sp!, {r4, r5, r6, r7, pc} 221 222 223 .align 2 224 GCC_ASM_EXPORT(InternalMathDivRemS64x64) 225 226ASM_PFX(InternalMathDivRemS64x64): 227 stmfd sp!, {r4, r5, r6, r7, lr} 228 add r7, sp, #12 229 stmfd sp!, {r10, r11} 230 ldr r6, [sp, #28] 231 mov r4, r0 232 cmp r6, #0 233 mov r5, r1 234 mov r10, r2 235 mov r11, r3 236 beq L30 237 bl ASM_PFX(__moddi3) 238 stmia r6, {r0-r1} 239L30: 240 mov r0, r4 241 mov r1, r5 242 mov r2, r10 243 mov r3, r11 244 bl ASM_PFX(__divdi3) 245 ldmfd sp!, {r10, r11} 246 ldmfd sp!, {r4, r5, r6, r7, pc} 247 248 249 .align 2 250 GCC_ASM_EXPORT(InternalMathSwapBytes64) 251 252ASM_PFX(InternalMathSwapBytes64): 253 stmfd sp!, {r4, r5, r7, lr} 254 mov r5, r1 255 bl ASM_PFX(SwapBytes32) 256 mov r4, r0 257 mov r0, r5 258 bl ASM_PFX(SwapBytes32) 259 mov r1, r4 260 ldmfd sp!, {r4, r5, r7, pc} 261 262 263ASM_FUNCTION_REMOVE_IF_UNREFERENCED 264