mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-02-01 05:01:59 +01:00
5d4c0a60e2
Other opcodes shouldn't be CSE'd until we can be sure debug info quality won't be degraded. This change also improves the IRTranslator so that in most places, but not all, it creates constants using the MIRBuilder directly instead of first creating a new destination vreg and then creating a constant. By doing this, the buildConstant() method can just return the vreg of an existing G_CONSTANT instead of having to create a COPY from it. I measured a 0.2% improvement in compile time and a 0.9% improvement in code size at -O0 ARM64. Compile time: Program base cse diff test-suite...ark/tramp3d-v4/tramp3d-v4.test 9.04 9.12 0.8% test-suite...Mark/mafft/pairlocalalign.test 2.68 2.66 -0.7% test-suite...-typeset/consumer-typeset.test 5.53 5.51 -0.4% test-suite :: CTMark/lencod/lencod.test 5.30 5.28 -0.3% test-suite :: CTMark/Bullet/bullet.test 25.82 25.76 -0.2% test-suite...:: CTMark/ClamAV/clamscan.test 6.92 6.90 -0.2% test-suite...TMark/7zip/7zip-benchmark.test 34.24 34.17 -0.2% test-suite :: CTMark/SPASS/SPASS.test 6.25 6.24 -0.1% test-suite...:: CTMark/sqlite3/sqlite3.test 1.66 1.66 -0.1% test-suite :: CTMark/kimwitu++/kc.test 13.61 13.60 -0.0% Geomean difference -0.2% Code size: Program base cse diff test-suite...-typeset/consumer-typeset.test 1315632 1266480 -3.7% test-suite...:: CTMark/ClamAV/clamscan.test 1313892 1297508 -1.2% test-suite :: CTMark/lencod/lencod.test 1439504 1423112 -1.1% test-suite...TMark/7zip/7zip-benchmark.test 2936980 2904172 -1.1% test-suite :: CTMark/Bullet/bullet.test 3478276 3445460 -0.9% test-suite...ark/tramp3d-v4/tramp3d-v4.test 8082868 8033492 -0.6% test-suite :: CTMark/kimwitu++/kc.test 3870380 3853972 -0.4% test-suite :: CTMark/SPASS/SPASS.test 1434904 1434896 -0.0% test-suite...Mark/mafft/pairlocalalign.test 764528 764528 0.0% test-suite...:: CTMark/sqlite3/sqlite3.test 782092 782092 0.0% Geomean difference -0.9% Differential Revision: https://reviews.llvm.org/D60580 llvm-svn: 358369
618 lines
23 KiB
YAML
618 lines
23 KiB
YAML
# RUN: llc -O0 -mtriple arm-linux-gnueabi -mattr=+hwdiv-arm -run-pass=legalizer %s -o - | FileCheck %s -check-prefixes=CHECK,HWDIV
|
|
# RUN: llc -O0 -mtriple arm-linux-gnueabi -mattr=-hwdiv-arm -run-pass=legalizer %s -o - | FileCheck %s -check-prefixes=CHECK,SOFT,SOFT-AEABI,ARM-AEABI
|
|
# RUN: llc -O0 -mtriple arm-linux-gnu -mattr=+hwdiv-arm -run-pass=legalizer %s -o - | FileCheck %s -check-prefixes=CHECK,HWDIV
|
|
# RUN: llc -O0 -mtriple arm-linux-gnu -mattr=-hwdiv-arm -run-pass=legalizer %s -o - | FileCheck %s -check-prefixes=CHECK,SOFT,SOFT-DEFAULT,ARM-DEFAULT
|
|
# RUN: llc -O0 -mtriple thumb-linux-gnueabi -mattr=+v6t2,+hwdiv -run-pass=legalizer %s -o - | FileCheck %s -check-prefixes=CHECK,HWDIV
|
|
# RUN: llc -O0 -mtriple thumb-linux-gnueabi -mattr=+v6t2,-hwdiv -run-pass=legalizer %s -o - | FileCheck %s -check-prefixes=CHECK,SOFT,SOFT-AEABI,THUMB-AEABI
|
|
# RUN: llc -O0 -mtriple thumb-linux-gnu -mattr=+v6t2,+hwdiv -run-pass=legalizer %s -o - | FileCheck %s -check-prefixes=CHECK,HWDIV
|
|
# RUN: llc -O0 -mtriple thumb-linux-gnu -mattr=+v6t2,-hwdiv -run-pass=legalizer %s -o - | FileCheck %s -check-prefixes=CHECK,SOFT,SOFT-DEFAULT,THUMB-DEFAULT
|
|
--- |
|
|
define void @test_sdiv_i32() { ret void }
|
|
define void @test_udiv_i32() { ret void }
|
|
|
|
define void @test_sdiv_i16() { ret void }
|
|
define void @test_udiv_i16() { ret void }
|
|
|
|
define void @test_sdiv_i8() { ret void }
|
|
define void @test_udiv_i8() { ret void }
|
|
|
|
define void @test_srem_i32() { ret void }
|
|
define void @test_urem_i32() { ret void }
|
|
|
|
define void @test_srem_i16() { ret void }
|
|
define void @test_urem_i16() { ret void }
|
|
|
|
define void @test_srem_i8() { ret void }
|
|
define void @test_urem_i8() { ret void }
|
|
...
|
|
---
|
|
name: test_sdiv_i32
|
|
# CHECK-LABEL: name: test_sdiv_i32
|
|
legalized: false
|
|
# CHECK: legalized: true
|
|
regBankSelected: false
|
|
selected: false
|
|
tracksRegLiveness: true
|
|
registers:
|
|
- { id: 0, class: _ }
|
|
- { id: 1, class: _ }
|
|
- { id: 2, class: _ }
|
|
body: |
|
|
bb.0:
|
|
liveins: $r0, $r1
|
|
|
|
; CHECK-DAG: [[X:%[0-9]+]]:_(s32) = COPY $r0
|
|
; CHECK-DAG: [[Y:%[0-9]+]]:_(s32) = COPY $r1
|
|
%0(s32) = COPY $r0
|
|
%1(s32) = COPY $r1
|
|
; HWDIV: [[R:%[0-9]+]]:_(s32) = G_SDIV [[X]], [[Y]]
|
|
; SOFT-NOT: G_SDIV
|
|
; SOFT: ADJCALLSTACKDOWN
|
|
; SOFT-DAG: $r0 = COPY [[X]]
|
|
; SOFT-DAG: $r1 = COPY [[Y]]
|
|
; ARM-AEABI: BL &__aeabi_idiv, {{.*}}, implicit $r0, implicit $r1, implicit-def $r0
|
|
; THUMB-AEABI: tBL 14, $noreg, &__aeabi_idiv, {{.*}}, implicit $r0, implicit $r1, implicit-def $r0
|
|
; ARM-DEFAULT: BL &__divsi3, {{.*}}, implicit $r0, implicit $r1, implicit-def $r0
|
|
; THUMB-DEFAULT: tBL 14, $noreg, &__divsi3, {{.*}}, implicit $r0, implicit $r1, implicit-def $r0
|
|
; SOFT: [[R:%[0-9]+]]:_(s32) = COPY $r0
|
|
; SOFT: ADJCALLSTACKUP
|
|
; SOFT-NOT: G_SDIV
|
|
%2(s32) = G_SDIV %0, %1
|
|
; CHECK: $r0 = COPY [[R]]
|
|
$r0 = COPY %2(s32)
|
|
BX_RET 14, $noreg, implicit $r0
|
|
...
|
|
---
|
|
name: test_udiv_i32
|
|
# CHECK-LABEL: name: test_udiv_i32
|
|
legalized: false
|
|
# CHECK: legalized: true
|
|
regBankSelected: false
|
|
selected: false
|
|
tracksRegLiveness: true
|
|
registers:
|
|
- { id: 0, class: _ }
|
|
- { id: 1, class: _ }
|
|
- { id: 2, class: _ }
|
|
body: |
|
|
bb.0:
|
|
liveins: $r0, $r1
|
|
|
|
; CHECK-DAG: [[X:%[0-9]+]]:_(s32) = COPY $r0
|
|
; CHECK-DAG: [[Y:%[0-9]+]]:_(s32) = COPY $r1
|
|
%0(s32) = COPY $r0
|
|
%1(s32) = COPY $r1
|
|
; HWDIV: [[R:%[0-9]+]]:_(s32) = G_UDIV [[X]], [[Y]]
|
|
; SOFT-NOT: G_UDIV
|
|
; SOFT: ADJCALLSTACKDOWN
|
|
; SOFT-DAG: $r0 = COPY [[X]]
|
|
; SOFT-DAG: $r1 = COPY [[Y]]
|
|
; ARM-AEABI: BL &__aeabi_uidiv, {{.*}}, implicit $r0, implicit $r1, implicit-def $r0
|
|
; THUMB-AEABI: tBL 14, $noreg, &__aeabi_uidiv, {{.*}}, implicit $r0, implicit $r1, implicit-def $r0
|
|
; ARM-DEFAULT: BL &__udivsi3, {{.*}}, implicit $r0, implicit $r1, implicit-def $r0
|
|
; THUMB-DEFAULT: tBL 14, $noreg, &__udivsi3, {{.*}}, implicit $r0, implicit $r1, implicit-def $r0
|
|
; SOFT: [[R:%[0-9]+]]:_(s32) = COPY $r0
|
|
; SOFT: ADJCALLSTACKUP
|
|
; SOFT-NOT: G_UDIV
|
|
%2(s32) = G_UDIV %0, %1
|
|
; CHECK: $r0 = COPY [[R]]
|
|
$r0 = COPY %2(s32)
|
|
BX_RET 14, $noreg, implicit $r0
|
|
...
|
|
---
|
|
name: test_sdiv_i16
|
|
# CHECK-LABEL: name: test_sdiv_i16
|
|
legalized: false
|
|
# CHECK: legalized: true
|
|
regBankSelected: false
|
|
selected: false
|
|
tracksRegLiveness: true
|
|
registers:
|
|
- { id: 0, class: _ }
|
|
- { id: 1, class: _ }
|
|
- { id: 2, class: _ }
|
|
- { id: 3, class: _ }
|
|
- { id: 4, class: _ }
|
|
- { id: 5, class: _ }
|
|
body: |
|
|
bb.0:
|
|
liveins: $r0, $r1
|
|
|
|
; CHECK-DAG: [[R0:%[0-9]+]]:_(s32) = COPY $r0
|
|
; CHECK-DAG: [[R1:%[0-9]+]]:_(s32) = COPY $r1
|
|
; The G_TRUNC will combine with the extensions introduced by the legalizer,
|
|
; leading to the following complicated sequences.
|
|
; CHECK: [[BITS:%[0-9]+]]:_(s32) = G_CONSTANT i32 16
|
|
; CHECK: [[X:%[0-9]+]]:_(s32) = COPY [[R0]]
|
|
; CHECK: [[SHIFTEDX:%[0-9]+]]:_(s32) = G_SHL [[X]], [[BITS]]
|
|
; CHECK: [[X32:%[0-9]+]]:_(s32) = G_ASHR [[SHIFTEDX]], [[BITS]]
|
|
; CHECK: [[Y:%[0-9]+]]:_(s32) = COPY [[R1]]
|
|
; CHECK: [[SHIFTEDY:%[0-9]+]]:_(s32) = G_SHL [[Y]], [[BITS]]
|
|
; CHECK: [[Y32:%[0-9]+]]:_(s32) = G_ASHR [[SHIFTEDY]], [[BITS]]
|
|
%0(s32) = COPY $r0
|
|
%1(s16) = G_TRUNC %0(s32)
|
|
%2(s32) = COPY $r1
|
|
%3(s16) = G_TRUNC %2(s32)
|
|
; HWDIV: [[R32:%[0-9]+]]:_(s32) = G_SDIV [[X32]], [[Y32]]
|
|
; SOFT-NOT: G_SDIV
|
|
; SOFT: ADJCALLSTACKDOWN
|
|
; SOFT-DAG: $r0 = COPY [[X32]]
|
|
; SOFT-DAG: $r1 = COPY [[Y32]]
|
|
; ARM-AEABI: BL &__aeabi_idiv, {{.*}}, implicit $r0, implicit $r1, implicit-def $r0
|
|
; THUMB-AEABI: tBL 14, $noreg, &__aeabi_idiv, {{.*}}, implicit $r0, implicit $r1, implicit-def $r0
|
|
; ARM-DEFAULT: BL &__divsi3, {{.*}}, implicit $r0, implicit $r1, implicit-def $r0
|
|
; THUMB-DEFAULT: tBL 14, $noreg, &__divsi3, {{.*}}, implicit $r0, implicit $r1, implicit-def $r0
|
|
; SOFT: [[R32:%[0-9]+]]:_(s32) = COPY $r0
|
|
; SOFT: ADJCALLSTACKUP
|
|
; SOFT-NOT: G_SDIV
|
|
; CHECK: [[R:%[0-9]+]]:_(s32) = G_ASHR
|
|
; SOFT-NOT: G_SDIV
|
|
%4(s16) = G_SDIV %1, %3
|
|
; CHECK: $r0 = COPY [[R]]
|
|
%5(s32) = G_SEXT %4(s16)
|
|
$r0 = COPY %5(s32)
|
|
BX_RET 14, $noreg, implicit $r0
|
|
...
|
|
---
|
|
name: test_udiv_i16
|
|
# CHECK-LABEL: name: test_udiv_i16
|
|
legalized: false
|
|
# CHECK: legalized: true
|
|
regBankSelected: false
|
|
selected: false
|
|
tracksRegLiveness: true
|
|
registers:
|
|
- { id: 0, class: _ }
|
|
- { id: 1, class: _ }
|
|
- { id: 2, class: _ }
|
|
- { id: 3, class: _ }
|
|
- { id: 4, class: _ }
|
|
- { id: 5, class: _ }
|
|
body: |
|
|
bb.0:
|
|
liveins: $r0, $r1
|
|
|
|
; CHECK-DAG: [[R0:%[0-9]+]]:_(s32) = COPY $r0
|
|
; CHECK-DAG: [[R1:%[0-9]+]]:_(s32) = COPY $r1
|
|
; The G_TRUNC will combine with the extensions introduced by the legalizer,
|
|
; leading to the following complicated sequences.
|
|
; CHECK: [[BITS:%[0-9]+]]:_(s32) = G_CONSTANT i32 65535
|
|
; CHECK: [[X:%[0-9]+]]:_(s32) = COPY [[R0]]
|
|
; CHECK: [[X32:%[0-9]+]]:_(s32) = G_AND [[X]], [[BITS]]
|
|
; CHECK: [[Y:%[0-9]+]]:_(s32) = COPY [[R1]]
|
|
; CHECK: [[Y32:%[0-9]+]]:_(s32) = G_AND [[Y]], [[BITS]]
|
|
%0(s32) = COPY $r0
|
|
%1(s16) = G_TRUNC %0(s32)
|
|
%2(s32) = COPY $r1
|
|
%3(s16) = G_TRUNC %2(s32)
|
|
; HWDIV: [[R32:%[0-9]+]]:_(s32) = G_UDIV [[X32]], [[Y32]]
|
|
; SOFT-NOT: G_UDIV
|
|
; SOFT: ADJCALLSTACKDOWN
|
|
; SOFT-DAG: $r0 = COPY [[X32]]
|
|
; SOFT-DAG: $r1 = COPY [[Y32]]
|
|
; ARM-AEABI: BL &__aeabi_uidiv, {{.*}}, implicit $r0, implicit $r1, implicit-def $r0
|
|
; THUMB-AEABI: tBL 14, $noreg, &__aeabi_uidiv, {{.*}}, implicit $r0, implicit $r1, implicit-def $r0
|
|
; ARM-DEFAULT: BL &__udivsi3, {{.*}}, implicit $r0, implicit $r1, implicit-def $r0
|
|
; THUMB-DEFAULT: tBL 14, $noreg, &__udivsi3, {{.*}}, implicit $r0, implicit $r1, implicit-def $r0
|
|
; SOFT: [[R32:%[0-9]+]]:_(s32) = COPY $r0
|
|
; SOFT: ADJCALLSTACKUP
|
|
; SOFT-NOT: G_UDIV
|
|
; CHECK: [[R:%[0-9]+]]:_(s32) = G_AND
|
|
; SOFT-NOT: G_UDIV
|
|
%4(s16) = G_UDIV %1, %3
|
|
; CHECK: $r0 = COPY [[R]]
|
|
%5(s32) = G_ZEXT %4(s16)
|
|
$r0 = COPY %5(s32)
|
|
BX_RET 14, $noreg, implicit $r0
|
|
...
|
|
---
|
|
name: test_sdiv_i8
|
|
# CHECK-LABEL: name: test_sdiv_i8
|
|
legalized: false
|
|
# CHECK: legalized: true
|
|
regBankSelected: false
|
|
selected: false
|
|
tracksRegLiveness: true
|
|
registers:
|
|
- { id: 0, class: _ }
|
|
- { id: 1, class: _ }
|
|
- { id: 2, class: _ }
|
|
- { id: 3, class: _ }
|
|
- { id: 4, class: _ }
|
|
- { id: 5, class: _ }
|
|
body: |
|
|
bb.0:
|
|
liveins: $r0, $r1
|
|
|
|
; CHECK-DAG: [[R0:%[0-9]+]]:_(s32) = COPY $r0
|
|
; CHECK-DAG: [[R1:%[0-9]+]]:_(s32) = COPY $r1
|
|
; The G_TRUNC will combine with the extensions introduced by the legalizer,
|
|
; leading to the following complicated sequences.
|
|
; CHECK: [[BITS:%[0-9]+]]:_(s32) = G_CONSTANT i32 24
|
|
; CHECK: [[X:%[0-9]+]]:_(s32) = COPY [[R0]]
|
|
; CHECK: [[SHIFTEDX:%[0-9]+]]:_(s32) = G_SHL [[X]], [[BITS]]
|
|
; CHECK: [[X32:%[0-9]+]]:_(s32) = G_ASHR [[SHIFTEDX]], [[BITS]]
|
|
; CHECK: [[Y:%[0-9]+]]:_(s32) = COPY [[R1]]
|
|
; CHECK: [[SHIFTEDY:%[0-9]+]]:_(s32) = G_SHL [[Y]], [[BITS]]
|
|
; CHECK: [[Y32:%[0-9]+]]:_(s32) = G_ASHR [[SHIFTEDY]], [[BITS]]
|
|
%0(s32) = COPY $r0
|
|
%1(s8) = G_TRUNC %0(s32)
|
|
%2(s32) = COPY $r1
|
|
%3(s8) = G_TRUNC %2(s32)
|
|
; HWDIV: [[R32:%[0-9]+]]:_(s32) = G_SDIV [[X32]], [[Y32]]
|
|
; SOFT-NOT: G_SDIV
|
|
; SOFT: ADJCALLSTACKDOWN
|
|
; SOFT-DAG: $r0 = COPY [[X32]]
|
|
; SOFT-DAG: $r1 = COPY [[Y32]]
|
|
; ARM-AEABI: BL &__aeabi_idiv, {{.*}}, implicit $r0, implicit $r1, implicit-def $r0
|
|
; THUMB-AEABI: tBL 14, $noreg, &__aeabi_idiv, {{.*}}, implicit $r0, implicit $r1, implicit-def $r0
|
|
; ARM-DEFAULT: BL &__divsi3, {{.*}}, implicit $r0, implicit $r1, implicit-def $r0
|
|
; THUMB-DEFAULT: tBL 14, $noreg, &__divsi3, {{.*}}, implicit $r0, implicit $r1, implicit-def $r0
|
|
; SOFT: [[R32:%[0-9]+]]:_(s32) = COPY $r0
|
|
; SOFT: ADJCALLSTACKUP
|
|
; SOFT-NOT: G_SDIV
|
|
; CHECK: [[R:%[0-9]+]]:_(s32) = G_ASHR
|
|
; SOFT-NOT: G_SDIV
|
|
%4(s8) = G_SDIV %1, %3
|
|
; CHECK: $r0 = COPY [[R]]
|
|
%5(s32) = G_SEXT %4(s8)
|
|
$r0 = COPY %5(s32)
|
|
BX_RET 14, $noreg, implicit $r0
|
|
...
|
|
---
|
|
name: test_udiv_i8
|
|
# CHECK-LABEL: name: test_udiv_i8
|
|
legalized: false
|
|
# CHECK: legalized: true
|
|
regBankSelected: false
|
|
selected: false
|
|
tracksRegLiveness: true
|
|
registers:
|
|
- { id: 0, class: _ }
|
|
- { id: 1, class: _ }
|
|
- { id: 2, class: _ }
|
|
- { id: 3, class: _ }
|
|
- { id: 4, class: _ }
|
|
- { id: 5, class: _ }
|
|
body: |
|
|
bb.0:
|
|
liveins: $r0, $r1
|
|
|
|
; CHECK-DAG: [[X:%[0-9]+]]:_(s32) = COPY $r0
|
|
; CHECK-DAG: [[Y:%[0-9]+]]:_(s32) = COPY $r1
|
|
; The G_TRUNC will combine with the extensions introduced by the legalizer,
|
|
; leading to the following complicated sequences.
|
|
; CHECK: [[BITS:%[0-9]+]]:_(s32) = G_CONSTANT i32 255
|
|
; CHECK: [[X:%[0-9]+]]:_(s32) = COPY [[R0]]
|
|
; CHECK: [[X32:%[0-9]+]]:_(s32) = G_AND [[X]], [[BITS]]
|
|
; CHECK: [[Y:%[0-9]+]]:_(s32) = COPY [[R1]]
|
|
; CHECK: [[Y32:%[0-9]+]]:_(s32) = G_AND [[Y]], [[BITS]]
|
|
%0(s32) = COPY $r0
|
|
%1(s8) = G_TRUNC %0(s32)
|
|
%2(s32) = COPY $r1
|
|
%3(s8) = G_TRUNC %2(s32)
|
|
; HWDIV: [[R32:%[0-9]+]]:_(s32) = G_UDIV [[X32]], [[Y32]]
|
|
; SOFT-NOT: G_UDIV
|
|
; SOFT: ADJCALLSTACKDOWN
|
|
; SOFT-DAG: $r0 = COPY [[X32]]
|
|
; SOFT-DAG: $r1 = COPY [[Y32]]
|
|
; ARM-AEABI: BL &__aeabi_uidiv, {{.*}}, implicit $r0, implicit $r1, implicit-def $r0
|
|
; THUMB-AEABI: tBL 14, $noreg, &__aeabi_uidiv, {{.*}}, implicit $r0, implicit $r1, implicit-def $r0
|
|
; ARM-DEFAULT: BL &__udivsi3, {{.*}}, implicit $r0, implicit $r1, implicit-def $r0
|
|
; THUMB-DEFAULT: tBL 14, $noreg, &__udivsi3, {{.*}}, implicit $r0, implicit $r1, implicit-def $r0
|
|
; SOFT: [[R32:%[0-9]+]]:_(s32) = COPY $r0
|
|
; SOFT: ADJCALLSTACKUP
|
|
; SOFT-NOT: G_UDIV
|
|
; CHECK: [[R:%[0-9]+]]:_(s32) = G_AND
|
|
; SOFT-NOT: G_UDIV
|
|
%4(s8) = G_UDIV %1, %3
|
|
; CHECK: $r0 = COPY [[R]]
|
|
%5(s32) = G_ZEXT %4(s8)
|
|
$r0 = COPY %5(s32)
|
|
BX_RET 14, $noreg, implicit $r0
|
|
...
|
|
---
|
|
name: test_srem_i32
|
|
# CHECK-LABEL: name: test_srem_i32
|
|
legalized: false
|
|
# CHECK: legalized: true
|
|
regBankSelected: false
|
|
selected: false
|
|
tracksRegLiveness: true
|
|
registers:
|
|
- { id: 0, class: _ }
|
|
- { id: 1, class: _ }
|
|
- { id: 2, class: _ }
|
|
body: |
|
|
bb.0:
|
|
liveins: $r0, $r1
|
|
|
|
; CHECK-DAG: [[X:%[0-9]+]]:_(s32) = COPY $r0
|
|
; CHECK-DAG: [[Y:%[0-9]+]]:_(s32) = COPY $r1
|
|
%0(s32) = COPY $r0
|
|
%1(s32) = COPY $r1
|
|
; HWDIV: [[Q:%[0-9]+]]:_(s32) = G_SDIV [[X]], [[Y]]
|
|
; HWDIV: [[P:%[0-9]+]]:_(s32) = G_MUL [[Q]], [[Y]]
|
|
; HWDIV: [[R:%[0-9]+]]:_(s32) = G_SUB [[X]], [[P]]
|
|
; SOFT-NOT: G_SREM
|
|
; SOFT: ADJCALLSTACKDOWN
|
|
; SOFT-DAG: $r0 = COPY [[X]]
|
|
; SOFT-DAG: $r1 = COPY [[Y]]
|
|
; ARM-AEABI: BL &__aeabi_idivmod, {{.*}}, implicit $r0, implicit $r1, implicit-def $r0, implicit-def $r1
|
|
; THUMB-AEABI: tBL 14, $noreg, &__aeabi_idivmod, {{.*}}, implicit $r0, implicit $r1, implicit-def $r0, implicit-def $r1
|
|
; SOFT-AEABI: [[R:%[0-9]+]]:_(s32) = COPY $r1
|
|
; ARM-DEFAULT: BL &__modsi3, {{.*}}, implicit $r0, implicit $r1, implicit-def $r0
|
|
; THUMB-DEFAULT: tBL 14, $noreg, &__modsi3, {{.*}}, implicit $r0, implicit $r1, implicit-def $r0
|
|
; SOFT-DEFAULT: [[R:%[0-9]+]]:_(s32) = COPY $r0
|
|
; SOFT: ADJCALLSTACKUP
|
|
; SOFT-NOT: G_SREM
|
|
%2(s32) = G_SREM %0, %1
|
|
; CHECK: $r0 = COPY [[R]]
|
|
$r0 = COPY %2(s32)
|
|
BX_RET 14, $noreg, implicit $r0
|
|
...
|
|
---
|
|
name: test_urem_i32
|
|
# CHECK-LABEL: name: test_urem_i32
|
|
legalized: false
|
|
# CHECK: legalized: true
|
|
regBankSelected: false
|
|
selected: false
|
|
tracksRegLiveness: true
|
|
registers:
|
|
- { id: 0, class: _ }
|
|
- { id: 1, class: _ }
|
|
- { id: 2, class: _ }
|
|
body: |
|
|
bb.0:
|
|
liveins: $r0, $r1
|
|
|
|
; CHECK-DAG: [[X:%[0-9]+]]:_(s32) = COPY $r0
|
|
; CHECK-DAG: [[Y:%[0-9]+]]:_(s32) = COPY $r1
|
|
%0(s32) = COPY $r0
|
|
%1(s32) = COPY $r1
|
|
; HWDIV: [[Q:%[0-9]+]]:_(s32) = G_UDIV [[X]], [[Y]]
|
|
; HWDIV: [[P:%[0-9]+]]:_(s32) = G_MUL [[Q]], [[Y]]
|
|
; HWDIV: [[R:%[0-9]+]]:_(s32) = G_SUB [[X]], [[P]]
|
|
; SOFT-NOT: G_UREM
|
|
; SOFT: ADJCALLSTACKDOWN
|
|
; SOFT-DAG: $r0 = COPY [[X]]
|
|
; SOFT-DAG: $r1 = COPY [[Y]]
|
|
; ARM-AEABI: BL &__aeabi_uidivmod, {{.*}}, implicit $r0, implicit $r1, implicit-def $r0, implicit-def $r1
|
|
; THUMB-AEABI: tBL 14, $noreg, &__aeabi_uidivmod, {{.*}}, implicit $r0, implicit $r1, implicit-def $r0, implicit-def $r1
|
|
; SOFT-AEABI: [[R:%[0-9]+]]:_(s32) = COPY $r1
|
|
; ARM-DEFAULT: BL &__umodsi3, {{.*}}, implicit $r0, implicit $r1, implicit-def $r0
|
|
; THUMB-DEFAULT: tBL 14, $noreg, &__umodsi3, {{.*}}, implicit $r0, implicit $r1, implicit-def $r0
|
|
; SOFT-DEFAULT: [[R:%[0-9]+]]:_(s32) = COPY $r0
|
|
; SOFT: ADJCALLSTACKUP
|
|
; SOFT-NOT: G_UREM
|
|
%2(s32) = G_UREM %0, %1
|
|
; CHECK: $r0 = COPY [[R]]
|
|
$r0 = COPY %2(s32)
|
|
BX_RET 14, $noreg, implicit $r0
|
|
...
|
|
---
|
|
name: test_srem_i16
|
|
# CHECK-LABEL: name: test_srem_i16
|
|
legalized: false
|
|
# CHECK: legalized: true
|
|
regBankSelected: false
|
|
selected: false
|
|
tracksRegLiveness: true
|
|
registers:
|
|
- { id: 0, class: _ }
|
|
- { id: 1, class: _ }
|
|
- { id: 2, class: _ }
|
|
- { id: 3, class: _ }
|
|
- { id: 4, class: _ }
|
|
- { id: 5, class: _ }
|
|
body: |
|
|
bb.0:
|
|
liveins: $r0, $r1
|
|
|
|
; CHECK-DAG: [[R0:%[0-9]+]]:_(s32) = COPY $r0
|
|
; CHECK-DAG: [[R1:%[0-9]+]]:_(s32) = COPY $r1
|
|
; The G_TRUNC will combine with the extensions introduced by the legalizer,
|
|
; leading to the following complicated sequences.
|
|
; CHECK: [[BITS:%[0-9]+]]:_(s32) = G_CONSTANT i32 16
|
|
; CHECK: [[X:%[0-9]+]]:_(s32) = COPY [[R0]]
|
|
; CHECK: [[SHIFTEDX:%[0-9]+]]:_(s32) = G_SHL [[X]], [[BITS]]
|
|
; CHECK: [[X32:%[0-9]+]]:_(s32) = G_ASHR [[SHIFTEDX]], [[BITS]]
|
|
; CHECK: [[Y:%[0-9]+]]:_(s32) = COPY [[R1]]
|
|
; CHECK: [[SHIFTEDY:%[0-9]+]]:_(s32) = G_SHL [[Y]], [[BITS]]
|
|
; CHECK: [[Y32:%[0-9]+]]:_(s32) = G_ASHR [[SHIFTEDY]], [[BITS]]
|
|
%0(s32) = COPY $r0
|
|
%1(s16) = G_TRUNC %0(s32)
|
|
%2(s32) = COPY $r1
|
|
%3(s16) = G_TRUNC %2(s32)
|
|
; HWDIV: [[Q32:%[0-9]+]]:_(s32) = G_SDIV [[X32]], [[Y32]]
|
|
; HWDIV: [[P32:%[0-9]+]]:_(s32) = G_MUL [[Q32]], [[Y32]]
|
|
; HWDIV: [[R32:%[0-9]+]]:_(s32) = G_SUB [[X32]], [[P32]]
|
|
; SOFT-NOT: G_SREM
|
|
; SOFT: ADJCALLSTACKDOWN
|
|
; SOFT-DAG: $r0 = COPY [[X32]]
|
|
; SOFT-DAG: $r1 = COPY [[Y32]]
|
|
; ARM-AEABI: BL &__aeabi_idivmod, {{.*}}, implicit $r0, implicit $r1, implicit-def $r0
|
|
; THUMB-AEABI: tBL 14, $noreg, &__aeabi_idivmod, {{.*}}, implicit $r0, implicit $r1, implicit-def $r0
|
|
; SOFT-AEABI: [[R32:%[0-9]+]]:_(s32) = COPY $r1
|
|
; ARM-DEFAULT: BL &__modsi3, {{.*}}, implicit $r0, implicit $r1, implicit-def $r0
|
|
; THUMB-DEFAULT: tBL 14, $noreg, &__modsi3, {{.*}}, implicit $r0, implicit $r1, implicit-def $r0
|
|
; SOFT-DEFAULT: [[R32:%[0-9]+]]:_(s32) = COPY $r0
|
|
; SOFT: ADJCALLSTACKUP
|
|
; SOFT-NOT: G_SREM
|
|
; CHECK: [[R:%[0-9]+]]:_(s32) = G_ASHR
|
|
; SOFT-NOT: G_SREM
|
|
%4(s16) = G_SREM %1, %3
|
|
; CHECK: $r0 = COPY [[R]]
|
|
%5(s32) = G_SEXT %4(s16)
|
|
$r0 = COPY %5(s32)
|
|
BX_RET 14, $noreg, implicit $r0
|
|
...
|
|
---
|
|
name: test_urem_i16
|
|
# CHECK-LABEL: name: test_urem_i16
|
|
legalized: false
|
|
# CHECK: legalized: true
|
|
regBankSelected: false
|
|
selected: false
|
|
tracksRegLiveness: true
|
|
registers:
|
|
- { id: 0, class: _ }
|
|
- { id: 1, class: _ }
|
|
- { id: 2, class: _ }
|
|
- { id: 3, class: _ }
|
|
- { id: 4, class: _ }
|
|
- { id: 5, class: _ }
|
|
body: |
|
|
bb.0:
|
|
liveins: $r0, $r1
|
|
|
|
; CHECK-DAG: [[R0:%[0-9]+]]:_(s32) = COPY $r0
|
|
; CHECK-DAG: [[R1:%[0-9]+]]:_(s32) = COPY $r1
|
|
; The G_TRUNC will combine with the extensions introduced by the legalizer,
|
|
; leading to the following complicated sequences.
|
|
; CHECK: [[BITS:%[0-9]+]]:_(s32) = G_CONSTANT i32 65535
|
|
; CHECK: [[X:%[0-9]+]]:_(s32) = COPY [[R0]]
|
|
; CHECK: [[X32:%[0-9]+]]:_(s32) = G_AND [[X]], [[BITS]]
|
|
; CHECK: [[Y:%[0-9]+]]:_(s32) = COPY [[R1]]
|
|
; CHECK: [[Y32:%[0-9]+]]:_(s32) = G_AND [[Y]], [[BITS]]
|
|
%0(s32) = COPY $r0
|
|
%1(s16) = G_TRUNC %0(s32)
|
|
%2(s32) = COPY $r1
|
|
%3(s16) = G_TRUNC %2(s32)
|
|
; HWDIV: [[Q32:%[0-9]+]]:_(s32) = G_UDIV [[X32]], [[Y32]]
|
|
; HWDIV: [[P32:%[0-9]+]]:_(s32) = G_MUL [[Q32]], [[Y32]]
|
|
; HWDIV: [[R32:%[0-9]+]]:_(s32) = G_SUB [[X32]], [[P32]]
|
|
; SOFT-NOT: G_UREM
|
|
; SOFT: ADJCALLSTACKDOWN
|
|
; SOFT-DAG: $r0 = COPY [[X32]]
|
|
; SOFT-DAG: $r1 = COPY [[Y32]]
|
|
; ARM-AEABI: BL &__aeabi_uidivmod, {{.*}}, implicit $r0, implicit $r1, implicit-def $r0
|
|
; THUMB-AEABI: tBL 14, $noreg, &__aeabi_uidivmod, {{.*}}, implicit $r0, implicit $r1, implicit-def $r0
|
|
; SOFT-AEABI: [[R32:%[0-9]+]]:_(s32) = COPY $r1
|
|
; ARM-DEFAULT: BL &__umodsi3, {{.*}}, implicit $r0, implicit $r1, implicit-def $r0
|
|
; THUMB-DEFAULT: tBL 14, $noreg, &__umodsi3, {{.*}}, implicit $r0, implicit $r1, implicit-def $r0
|
|
; SOFT-DEFAULT: [[R32:%[0-9]+]]:_(s32) = COPY $r0
|
|
; SOFT: ADJCALLSTACKUP
|
|
; SOFT-NOT: G_UREM
|
|
; CHECK: [[R:%[0-9]+]]:_(s32) = G_AND
|
|
; SOFT-NOT: G_UREM
|
|
%4(s16) = G_UREM %1, %3
|
|
; CHECK: $r0 = COPY [[R]]
|
|
%5(s32) = G_ZEXT %4(s16)
|
|
$r0 = COPY %5(s32)
|
|
BX_RET 14, $noreg, implicit $r0
|
|
...
|
|
---
|
|
name: test_srem_i8
|
|
# CHECK-LABEL: name: test_srem_i8
|
|
legalized: false
|
|
# CHECK: legalized: true
|
|
regBankSelected: false
|
|
selected: false
|
|
tracksRegLiveness: true
|
|
registers:
|
|
- { id: 0, class: _ }
|
|
- { id: 1, class: _ }
|
|
- { id: 2, class: _ }
|
|
- { id: 3, class: _ }
|
|
- { id: 4, class: _ }
|
|
- { id: 5, class: _ }
|
|
body: |
|
|
bb.0:
|
|
liveins: $r0, $r1
|
|
|
|
; CHECK-DAG: [[R0:%[0-9]+]]:_(s32) = COPY $r0
|
|
; CHECK-DAG: [[R1:%[0-9]+]]:_(s32) = COPY $r1
|
|
; The G_TRUNC will combine with the extensions introduced by the legalizer,
|
|
; leading to the following complicated sequences.
|
|
; CHECK: [[BITS:%[0-9]+]]:_(s32) = G_CONSTANT i32 24
|
|
; CHECK: [[X:%[0-9]+]]:_(s32) = COPY [[R0]]
|
|
; CHECK: [[SHIFTEDX:%[0-9]+]]:_(s32) = G_SHL [[X]], [[BITS]]
|
|
; CHECK: [[X32:%[0-9]+]]:_(s32) = G_ASHR [[SHIFTEDX]], [[BITS]]
|
|
; CHECK: [[Y:%[0-9]+]]:_(s32) = COPY [[R1]]
|
|
; CHECK: [[SHIFTEDY:%[0-9]+]]:_(s32) = G_SHL [[Y]], [[BITS]]
|
|
; CHECK: [[Y32:%[0-9]+]]:_(s32) = G_ASHR [[SHIFTEDY]], [[BITS]]
|
|
%0(s32) = COPY $r0
|
|
%1(s8) = G_TRUNC %0(s32)
|
|
%2(s32) = COPY $r1
|
|
%3(s8) = G_TRUNC %2(s32)
|
|
; HWDIV: [[Q32:%[0-9]+]]:_(s32) = G_SDIV [[X32]], [[Y32]]
|
|
; HWDIV: [[P32:%[0-9]+]]:_(s32) = G_MUL [[Q32]], [[Y32]]
|
|
; HWDIV: [[R32:%[0-9]+]]:_(s32) = G_SUB [[X32]], [[P32]]
|
|
; SOFT-NOT: G_SREM
|
|
; SOFT: ADJCALLSTACKDOWN
|
|
; SOFT-DAG: $r0 = COPY [[X32]]
|
|
; SOFT-DAG: $r1 = COPY [[Y32]]
|
|
; ARM-AEABI: BL &__aeabi_idivmod, {{.*}}, implicit $r0, implicit $r1, implicit-def $r0
|
|
; THUMB-AEABI: tBL 14, $noreg, &__aeabi_idivmod, {{.*}}, implicit $r0, implicit $r1, implicit-def $r0
|
|
; SOFT-AEABI: [[R32:%[0-9]+]]:_(s32) = COPY $r1
|
|
; ARM-DEFAULT: BL &__modsi3, {{.*}}, implicit $r0, implicit $r1, implicit-def $r0
|
|
; THUMB-DEFAULT: tBL 14, $noreg, &__modsi3, {{.*}}, implicit $r0, implicit $r1, implicit-def $r0
|
|
; SOFT-DEFAULT: [[R32:%[0-9]+]]:_(s32) = COPY $r0
|
|
; SOFT: ADJCALLSTACKUP
|
|
; SOFT-NOT: G_SREM
|
|
; CHECK: [[R:%[0-9]+]]:_(s32) = G_ASHR
|
|
; SOFT-NOT: G_SREM
|
|
%4(s8) = G_SREM %1, %3
|
|
; CHECK: $r0 = COPY [[R]]
|
|
%5(s32) = G_SEXT %4(s8)
|
|
$r0 = COPY %5(s32)
|
|
BX_RET 14, $noreg, implicit $r0
|
|
...
|
|
---
|
|
name: test_urem_i8
|
|
# CHECK-LABEL: name: test_urem_i8
|
|
legalized: false
|
|
# CHECK: legalized: true
|
|
regBankSelected: false
|
|
selected: false
|
|
tracksRegLiveness: true
|
|
registers:
|
|
- { id: 0, class: _ }
|
|
- { id: 1, class: _ }
|
|
- { id: 2, class: _ }
|
|
- { id: 3, class: _ }
|
|
- { id: 4, class: _ }
|
|
- { id: 5, class: _ }
|
|
body: |
|
|
bb.0:
|
|
liveins: $r0, $r1
|
|
|
|
; CHECK-DAG: [[R0:%[0-9]+]]:_(s32) = COPY $r0
|
|
; CHECK-DAG: [[R1:%[0-9]+]]:_(s32) = COPY $r1
|
|
; The G_TRUNC will combine with the extensions introduced by the legalizer,
|
|
; leading to the following complicated sequences.
|
|
; CHECK: [[BITS:%[0-9]+]]:_(s32) = G_CONSTANT i32 255
|
|
; CHECK: [[X:%[0-9]+]]:_(s32) = COPY [[R0]]
|
|
; CHECK: [[X32:%[0-9]+]]:_(s32) = G_AND [[X]], [[BITS]]
|
|
; CHECK: [[Y:%[0-9]+]]:_(s32) = COPY [[R1]]
|
|
; CHECK: [[Y32:%[0-9]+]]:_(s32) = G_AND [[Y]], [[BITS]]
|
|
%0(s32) = COPY $r0
|
|
%1(s8) = G_TRUNC %0(s32)
|
|
%2(s32) = COPY $r1
|
|
%3(s8) = G_TRUNC %2(s32)
|
|
; HWDIV: [[Q32:%[0-9]+]]:_(s32) = G_UDIV [[X32]], [[Y32]]
|
|
; HWDIV: [[P32:%[0-9]+]]:_(s32) = G_MUL [[Q32]], [[Y32]]
|
|
; HWDIV: [[R32:%[0-9]+]]:_(s32) = G_SUB [[X32]], [[P32]]
|
|
; SOFT-NOT: G_UREM
|
|
; SOFT: ADJCALLSTACKDOWN
|
|
; SOFT-DAG: $r0 = COPY [[X32]]
|
|
; SOFT-DAG: $r1 = COPY [[Y32]]
|
|
; ARM-AEABI: BL &__aeabi_uidivmod, {{.*}}, implicit $r0, implicit $r1, implicit-def $r0
|
|
; THUMB-AEABI: tBL 14, $noreg, &__aeabi_uidivmod, {{.*}}, implicit $r0, implicit $r1, implicit-def $r0
|
|
; SOFT-AEABI: [[R32:%[0-9]+]]:_(s32) = COPY $r1
|
|
; ARM-DEFAULT: BL &__umodsi3, {{.*}}, implicit $r0, implicit $r1, implicit-def $r0
|
|
; THUMB-DEFAULT: tBL 14, $noreg, &__umodsi3, {{.*}}, implicit $r0, implicit $r1, implicit-def $r0
|
|
; SOFT-DEFAULT: [[R32:%[0-9]+]]:_(s32) = COPY $r0
|
|
; SOFT: ADJCALLSTACKUP
|
|
; SOFT-NOT: G_UREM
|
|
; CHECK: [[R:%[0-9]+]]:_(s32) = G_AND
|
|
; SOFT-NOT: G_UREM
|
|
%4(s8) = G_UREM %1, %3
|
|
; CHECK: $r0 = COPY [[R]]
|
|
%5(s32) = G_ZEXT %4(s8)
|
|
$r0 = COPY %5(s32)
|
|
BX_RET 14, $noreg, implicit $r0
|
|
...
|