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 .macro FUNCTION_BEGIN name 110b57cec5SDimitry Andric .text 120b57cec5SDimitry Andric .p2align 5 130b57cec5SDimitry Andric .globl \name 140b57cec5SDimitry Andric .type \name, @function 150b57cec5SDimitry Andric\name: 160b57cec5SDimitry Andric .endm 170b57cec5SDimitry Andric 180b57cec5SDimitry Andric .macro FUNCTION_END name 190b57cec5SDimitry Andric .size \name, . - \name 200b57cec5SDimitry Andric .endm 210b57cec5SDimitry Andric 220b57cec5SDimitry Andric 230b57cec5SDimitry AndricFUNCTION_BEGIN __hexagon_udivmodsi4 240b57cec5SDimitry Andric { 250b57cec5SDimitry Andric r2 = cl0(r0) 260b57cec5SDimitry Andric r3 = cl0(r1) 270b57cec5SDimitry Andric r5:4 = combine(#1,#0) 280b57cec5SDimitry Andric p0 = cmp.gtu(r1,r0) 290b57cec5SDimitry Andric } 300b57cec5SDimitry Andric { 310b57cec5SDimitry Andric r6 = sub(r3,r2) 320b57cec5SDimitry Andric r4 = r1 330b57cec5SDimitry Andric r1:0 = combine(r0,r4) 340b57cec5SDimitry Andric if (p0) jumpr r31 350b57cec5SDimitry Andric } 360b57cec5SDimitry Andric { 370b57cec5SDimitry Andric r3:2 = vlslw(r5:4,r6) 380b57cec5SDimitry Andric loop0(1f,r6) 390b57cec5SDimitry Andric p0 = cmp.eq(r6,#0) 400b57cec5SDimitry Andric if (p0.new) r4 = #0 410b57cec5SDimitry Andric } 420b57cec5SDimitry Andric .falign 430b57cec5SDimitry Andric1: 440b57cec5SDimitry Andric { 450b57cec5SDimitry Andric p0 = cmp.gtu(r2,r1) 460b57cec5SDimitry Andric if (!p0.new) r1 = sub(r1,r2) 470b57cec5SDimitry Andric if (!p0.new) r0 = add(r0,r3) 480b57cec5SDimitry Andric r3:2 = vlsrw(r3:2,#1) 490b57cec5SDimitry Andric }:endloop0 500b57cec5SDimitry Andric { 510b57cec5SDimitry Andric p0 = cmp.gtu(r2,r1) 520b57cec5SDimitry Andric if (!p0.new) r1 = sub(r1,r4) 530b57cec5SDimitry Andric if (!p0.new) r0 = add(r0,r3) 540b57cec5SDimitry Andric jumpr r31 550b57cec5SDimitry Andric } 560b57cec5SDimitry AndricFUNCTION_END __hexagon_udivmodsi4 570b57cec5SDimitry Andric 580b57cec5SDimitry Andric .globl __qdsp_udivmodsi4 590b57cec5SDimitry Andric .set __qdsp_udivmodsi4, __hexagon_udivmodsi4 60