1*3cab2bb3Spatrick//===----------------------Hexagon builtin routine ------------------------===// 2*3cab2bb3Spatrick// 3*3cab2bb3Spatrick// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*3cab2bb3Spatrick// See https://llvm.org/LICENSE.txt for license information. 5*3cab2bb3Spatrick// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*3cab2bb3Spatrick// 7*3cab2bb3Spatrick//===----------------------------------------------------------------------===// 8*3cab2bb3Spatrick 9*3cab2bb3Spatrick 10*3cab2bb3Spatrick 11*3cab2bb3Spatrick .macro FUNCTION_BEGIN name 12*3cab2bb3Spatrick .text 13*3cab2bb3Spatrick .p2align 5 14*3cab2bb3Spatrick .globl \name 15*3cab2bb3Spatrick .type \name, @function 16*3cab2bb3Spatrick\name: 17*3cab2bb3Spatrick .endm 18*3cab2bb3Spatrick 19*3cab2bb3Spatrick .macro FUNCTION_END name 20*3cab2bb3Spatrick .size \name, . - \name 21*3cab2bb3Spatrick .endm 22*3cab2bb3Spatrick 23*3cab2bb3Spatrick 24*3cab2bb3SpatrickFUNCTION_BEGIN __hexagon_divsi3 25*3cab2bb3Spatrick { 26*3cab2bb3Spatrick p0 = cmp.ge(r0,#0) 27*3cab2bb3Spatrick p1 = cmp.ge(r1,#0) 28*3cab2bb3Spatrick r1 = abs(r0) 29*3cab2bb3Spatrick r2 = abs(r1) 30*3cab2bb3Spatrick } 31*3cab2bb3Spatrick { 32*3cab2bb3Spatrick r3 = cl0(r1) 33*3cab2bb3Spatrick r4 = cl0(r2) 34*3cab2bb3Spatrick r5 = sub(r1,r2) 35*3cab2bb3Spatrick p2 = cmp.gtu(r2,r1) 36*3cab2bb3Spatrick } 37*3cab2bb3Spatrick#if (__HEXAGON_ARCH__ == 60) 38*3cab2bb3Spatrick { 39*3cab2bb3Spatrick r0 = #0 40*3cab2bb3Spatrick p1 = xor(p0,p1) 41*3cab2bb3Spatrick p0 = cmp.gtu(r2,r5) 42*3cab2bb3Spatrick } 43*3cab2bb3Spatrick if (p2) jumpr r31 44*3cab2bb3Spatrick#else 45*3cab2bb3Spatrick { 46*3cab2bb3Spatrick r0 = #0 47*3cab2bb3Spatrick p1 = xor(p0,p1) 48*3cab2bb3Spatrick p0 = cmp.gtu(r2,r5) 49*3cab2bb3Spatrick if (p2) jumpr r31 50*3cab2bb3Spatrick } 51*3cab2bb3Spatrick#endif 52*3cab2bb3Spatrick { 53*3cab2bb3Spatrick r0 = mux(p1,#-1,#1) 54*3cab2bb3Spatrick if (p0) jumpr r31 55*3cab2bb3Spatrick r4 = sub(r4,r3) 56*3cab2bb3Spatrick r3 = #1 57*3cab2bb3Spatrick } 58*3cab2bb3Spatrick { 59*3cab2bb3Spatrick r0 = #0 60*3cab2bb3Spatrick r3:2 = vlslw(r3:2,r4) 61*3cab2bb3Spatrick loop0(1f,r4) 62*3cab2bb3Spatrick } 63*3cab2bb3Spatrick .falign 64*3cab2bb3Spatrick1: 65*3cab2bb3Spatrick { 66*3cab2bb3Spatrick p0 = cmp.gtu(r2,r1) 67*3cab2bb3Spatrick if (!p0.new) r1 = sub(r1,r2) 68*3cab2bb3Spatrick if (!p0.new) r0 = add(r0,r3) 69*3cab2bb3Spatrick r3:2 = vlsrw(r3:2,#1) 70*3cab2bb3Spatrick }:endloop0 71*3cab2bb3Spatrick { 72*3cab2bb3Spatrick p0 = cmp.gtu(r2,r1) 73*3cab2bb3Spatrick if (!p0.new) r0 = add(r0,r3) 74*3cab2bb3Spatrick if (!p1) jumpr r31 75*3cab2bb3Spatrick } 76*3cab2bb3Spatrick { 77*3cab2bb3Spatrick r0 = neg(r0) 78*3cab2bb3Spatrick jumpr r31 79*3cab2bb3Spatrick } 80*3cab2bb3SpatrickFUNCTION_END __hexagon_divsi3 81*3cab2bb3Spatrick 82*3cab2bb3Spatrick .globl __qdsp_divsi3 83*3cab2bb3Spatrick .set __qdsp_divsi3, __hexagon_divsi3 84