10b57cec5SDimitry Andric//===----------------------Hexagon builtin routine ------------------------===// 20b57cec5SDimitry Andric// 30b57cec5SDimitry Andric// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 40b57cec5SDimitry Andric// See https://llvm.org/LICENSE.txt for license information. 50b57cec5SDimitry Andric// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 60b57cec5SDimitry Andric// 70b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 80b57cec5SDimitry Andric 90b57cec5SDimitry Andric 100b57cec5SDimitry Andric 110b57cec5SDimitry Andric .macro FUNCTION_BEGIN name 120b57cec5SDimitry Andric .text 130b57cec5SDimitry Andric .p2align 5 140b57cec5SDimitry Andric .globl \name 150b57cec5SDimitry Andric .type \name, @function 160b57cec5SDimitry Andric\name: 170b57cec5SDimitry Andric .endm 180b57cec5SDimitry Andric 190b57cec5SDimitry Andric .macro FUNCTION_END name 200b57cec5SDimitry Andric .size \name, . - \name 210b57cec5SDimitry Andric .endm 220b57cec5SDimitry Andric 230b57cec5SDimitry Andric 240b57cec5SDimitry AndricFUNCTION_BEGIN __hexagon_modsi3 250b57cec5SDimitry Andric { 260b57cec5SDimitry Andric p2 = cmp.ge(r0,#0) 270b57cec5SDimitry Andric r2 = abs(r0) 280b57cec5SDimitry Andric r1 = abs(r1) 290b57cec5SDimitry Andric } 300b57cec5SDimitry Andric { 310b57cec5SDimitry Andric r3 = cl0(r2) 320b57cec5SDimitry Andric r4 = cl0(r1) 330b57cec5SDimitry Andric p0 = cmp.gtu(r1,r2) 340b57cec5SDimitry Andric } 350b57cec5SDimitry Andric { 360b57cec5SDimitry Andric r3 = sub(r4,r3) 370b57cec5SDimitry Andric if (p0) jumpr r31 380b57cec5SDimitry Andric } 390b57cec5SDimitry Andric { 400b57cec5SDimitry Andric p1 = cmp.eq(r3,#0) 410b57cec5SDimitry Andric loop0(1f,r3) 420b57cec5SDimitry Andric r0 = r2 430b57cec5SDimitry Andric r2 = lsl(r1,r3) 440b57cec5SDimitry Andric } 450b57cec5SDimitry Andric .falign 460b57cec5SDimitry Andric1: 470b57cec5SDimitry Andric { 480b57cec5SDimitry Andric p0 = cmp.gtu(r2,r0) 490b57cec5SDimitry Andric if (!p0.new) r0 = sub(r0,r2) 500b57cec5SDimitry Andric r2 = lsr(r2,#1) 510b57cec5SDimitry Andric if (p1) r1 = #0 520b57cec5SDimitry Andric }:endloop0 530b57cec5SDimitry Andric { 540b57cec5SDimitry Andric p0 = cmp.gtu(r2,r0) 550b57cec5SDimitry Andric if (!p0.new) r0 = sub(r0,r1) 560b57cec5SDimitry Andric if (p2) jumpr r31 570b57cec5SDimitry Andric } 580b57cec5SDimitry Andric { 590b57cec5SDimitry Andric r0 = neg(r0) 600b57cec5SDimitry Andric jumpr r31 610b57cec5SDimitry Andric } 620b57cec5SDimitry AndricFUNCTION_END __hexagon_modsi3 630b57cec5SDimitry Andric 640b57cec5SDimitry Andric .globl __qdsp_modsi3 650b57cec5SDimitry Andric .set __qdsp_modsi3, __hexagon_modsi3 66