^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) /* SPDX-License-Identifier: GPL-2.0-only */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * Copyright (c) 2021, The Linux Foundation. All rights reserved.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) #include <linux/linkage.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) SYM_FUNC_START(__hexagon_divsi3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) p0 = cmp.gt(r0,#-1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) p1 = cmp.gt(r1,#-1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) r3:2 = vabsw(r1:0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) p3 = xor(p0,p1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) r4 = sub(r2,r3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) r6 = cl0(r2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) p0 = cmp.gtu(r3,r2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) r0 = mux(p3,#-1,#1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) r7 = cl0(r3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) p1 = cmp.gtu(r3,r4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) r0 = mux(p0,#0,r0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) p0 = or(p0,p1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) if (p0.new) jumpr:nt r31
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) r6 = sub(r7,r6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) r7 = r6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) r5:4 = combine(#1,r3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) r6 = add(#1,lsr(r6,#1))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) p0 = cmp.gtu(r6,#4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) r5:4 = vaslw(r5:4,r7)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) if (!p0) r6 = #3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) loop0(1f,r6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) r7:6 = vlsrw(r5:4,#1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) r1:0 = #0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) .falign
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) 1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) r5:4 = vlsrw(r5:4,#2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) if (!p0.new) r0 = add(r0,r5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) if (!p0.new) r2 = sub(r2,r4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) p0 = cmp.gtu(r4,r2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) r7:6 = vlsrw(r7:6,#2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) if (!p0.new) r0 = add(r0,r7)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) if (!p0.new) r2 = sub(r2,r6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) p0 = cmp.gtu(r6,r2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) }:endloop0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) if (!p0) r0 = add(r0,r7)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) if (p3) r0 = sub(r1,r0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) jumpr r31
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) SYM_FUNC_END(__hexagon_divsi3)