xref: /llvm-project/llvm/test/CodeGen/ARM/divmod-hwdiv.ll (revision e2626bb7c29ea12d23e908c512ec64c2bb87abba)
1*e2626bb7SDiana Picus; The hwdiv subtarget feature should only influence thumb, not arm.
2*e2626bb7SDiana Picus; RUN: llc < %s -mtriple=arm-gnueabi -mattr=+hwdiv | FileCheck %s -check-prefixes=ALL,AEABI-NOHWDIV
3*e2626bb7SDiana Picus; RUN: llc < %s -mtriple=arm-gnueabi -mattr=-hwdiv | FileCheck %s -check-prefixes=ALL,AEABI-NOHWDIV
4*e2626bb7SDiana Picus; RUN: llc < %s -mtriple=thumbv7-gnueabi -mattr=+hwdiv | FileCheck %s -check-prefixes=ALL,THUMB-HWDIV
5*e2626bb7SDiana Picus; RUN: llc < %s -mtriple=thumbv7-gnueabi -mattr=-hwdiv | FileCheck %s -check-prefixes=ALL,AEABI-NOHWDIV
6*e2626bb7SDiana Picus
7*e2626bb7SDiana Picus; The hwdiv-arm subtarget feature should only influence arm, not thumb.
8*e2626bb7SDiana Picus; RUN: llc < %s -mtriple=arm-gnueabi -mattr=+hwdiv-arm | FileCheck %s -check-prefixes=ALL,ARM-HWDIV
9*e2626bb7SDiana Picus; RUN: llc < %s -mtriple=arm-gnueabi -mattr=-hwdiv-arm | FileCheck %s -check-prefixes=ALL,AEABI-NOHWDIV
10*e2626bb7SDiana Picus; RUN: llc < %s -mtriple=thumbv7-gnueabi -mattr=+hwdiv-arm | FileCheck %s -check-prefixes=ALL,AEABI-NOHWDIV
11*e2626bb7SDiana Picus; RUN: llc < %s -mtriple=thumbv7-gnueabi -mattr=-hwdiv-arm | FileCheck %s -check-prefixes=ALL,AEABI-NOHWDIV
12*e2626bb7SDiana Picus
13*e2626bb7SDiana Picusdefine arm_aapcscc i32 @test_i32_srem(i32 %x, i32 %y) {
14*e2626bb7SDiana Picus; ALL-LABEL: test_i32_srem:
15*e2626bb7SDiana Picus; ARM-HWDIV: sdiv [[Q:r[0-9]+]], r0, r1
16*e2626bb7SDiana Picus; ARM-HWDIV: mul [[P:r[0-9]+]], [[Q]], r1
17*e2626bb7SDiana Picus; ARM-HWDIV: sub r0, r0, [[P]]
18*e2626bb7SDiana Picus; THUMB-HWDIV: sdiv [[Q:r[0-9]+]], r0, r1
19*e2626bb7SDiana Picus; THUMB-HWDIV: mls r0, [[Q]], r1, r0
20*e2626bb7SDiana Picus; AEABI-NOHWDIV: bl __aeabi_idivmod
21*e2626bb7SDiana Picus; AEABI-NOHWDIV: mov r0, r1
22*e2626bb7SDiana Picus  %r = srem i32 %x, %y
23*e2626bb7SDiana Picus  ret i32 %r
24*e2626bb7SDiana Picus}
25*e2626bb7SDiana Picus
26*e2626bb7SDiana Picusdefine arm_aapcscc i32 @test_i32_urem(i32 %x, i32 %y) {
27*e2626bb7SDiana Picus; ALL-LABEL: test_i32_urem:
28*e2626bb7SDiana Picus; ARM-HWDIV: udiv [[Q:r[0-9]+]], r0, r1
29*e2626bb7SDiana Picus; ARM-HWDIV: mul [[P:r[0-9]+]], [[Q]], r1
30*e2626bb7SDiana Picus; ARM-HWDIV: sub r0, r0, [[P]]
31*e2626bb7SDiana Picus; THUMB-HWDIV: udiv [[Q:r[0-9]+]], r0, r1
32*e2626bb7SDiana Picus; THUMB-HWDIV: mls r0, [[Q]], r1, r0
33*e2626bb7SDiana Picus; AEABI-NOHWDIV: bl __aeabi_uidivmod
34*e2626bb7SDiana Picus; AEABI-NOHWDIV: mov r0, r1
35*e2626bb7SDiana Picus  %r = urem i32 %x, %y
36*e2626bb7SDiana Picus  ret i32 %r
37*e2626bb7SDiana Picus}
38