1# NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2# RUN: llc %s -mtriple=m68k -start-after=prologepilog -O0 -filetype=asm -o - \ 3# RUN: | FileCheck %s 4 5#------------------------------------------------------------------------------ 6# CollapseMOVEM pass finds sequences of MOVEM instructions and collapse them 7# into a single instruciton with merged masks. This only works with stack data 8#------------------------------------------------------------------------------ 9 10--- # CollapseMOVEM_RM 11# 12# CHECK-LABEL: CollapseMOVEM_RM 13# CHECK: movem.l (0,%sp), %d0-%d2/%d7/%a1-%a3/%a5 14name: CollapseMOVEM_RM 15body: | 16 bb.0: 17 MOVM32mp 1, 0, $sp 18 MOVM32mp 2, 4, $sp 19 MOVM32mp 4, 8, $sp 20 MOVM32mp 128, 12, $sp 21 MOVM32mp 512, 16, $sp 22 MOVM32mp 1024, 20, $sp 23 MOVM32mp 2048, 24, $sp 24 MOVM32mp 8192, 28, $sp 25 26... 27# 28# CHECK-LABEL: CollapseMOVEM_RM_Reversed 29# CHECK: movem.l (0,%sp), %d0-%d2/%d7/%a1-%a3/%a5 30name: CollapseMOVEM_RM_Reversed 31body: | 32 bb.0: 33 MOVM32mp 8192, 28, $sp 34 MOVM32mp 2048, 24, $sp 35 MOVM32mp 1024, 20, $sp 36 MOVM32mp 512, 16, $sp 37 MOVM32mp 128, 12, $sp 38 MOVM32mp 4, 8, $sp 39 MOVM32mp 2, 4, $sp 40 MOVM32mp 1, 0, $sp 41 42... 43# This async reg/mem order is impossible to store with MOVEM 44# CHECK-LABEL: CollapseMOVEM_RM_ReversedStoreOrder 45# CHECK: movem.l (0,%sp), %a5 46# CHECK: movem.l (4,%sp), %a3 47# CHECK: movem.l (8,%sp), %a2 48# CHECK: movem.l (12,%sp), %a1 49# CHECK: movem.l (16,%sp), %d7 50# CHECK: movem.l (20,%sp), %d2 51# CHECK: movem.l (24,%sp), %d1 52# CHECK: movem.l (28,%sp), %d0 53name: CollapseMOVEM_RM_ReversedStoreOrder 54body: | 55 bb.0: 56 MOVM32mp 8192, 0, $sp 57 MOVM32mp 2048, 4, $sp 58 MOVM32mp 1024, 8, $sp 59 MOVM32mp 512, 12, $sp 60 MOVM32mp 128, 16, $sp 61 MOVM32mp 4, 20, $sp 62 MOVM32mp 2, 24, $sp 63 MOVM32mp 1, 28, $sp 64 65... 66--- # CollapseMOVEM_MR 67# 68# CHECK-LABEL: CollapseMOVEM_MR 69# CHECK: movem.l %d0-%d2/%d7/%a1-%a3/%a5, (0,%sp) 70name: CollapseMOVEM_MR 71body: | 72 bb.0: 73 MOVM32pm 0, $sp, 1 74 MOVM32pm 4, $sp, 2 75 MOVM32pm 8, $sp, 4 76 MOVM32pm 12, $sp, 128 77 MOVM32pm 16, $sp, 512 78 MOVM32pm 20, $sp, 1024 79 MOVM32pm 24, $sp, 2048 80 MOVM32pm 28, $sp, 8192 81 82... 83--- # CollapseMOVEM_Mixed 84# 85# CHECK-LABEL: CollapseMOVEM_Mixed 86# CHECK: movem.l %d0-%d1, (0,%sp) 87# CHECK: movem.l (8,%sp), %d2/%d7 88# CHECK: movem.l %a1-%a2, (16,%sp) 89# CHECK: movem.l (24,%sp), %a3 90# CHECK: movem.l %a5, (28,%sp) 91name: CollapseMOVEM_Mixed 92body: | 93 bb.0: 94 MOVM32pm 0, $sp, 1 95 MOVM32pm 4, $sp, 2 96 MOVM32mp 4, 8, $sp 97 MOVM32mp 128, 12, $sp 98 MOVM32pm 16, $sp, 512 99 MOVM32pm 20, $sp, 1024 100 MOVM32mp 2048, 24, $sp 101 MOVM32pm 28, $sp, 8192 102 103... 104--- # CollapseMOVEM_Zero 105# 106# CHECK-LABEL: CollapseMOVEM_Zero 107# CHECK: movem.l %d0-%d4, (-8,%sp) 108name: CollapseMOVEM_Zero 109body: | 110 bb.0: 111 MOVM32pm -8, $sp, 1 112 MOVM32pm -4, $sp, 2 113 MOVM32pm 0, $sp, 4 114 MOVM32pm 4, $sp, 8 115 MOVM32pm 8, $sp, 16 116 117... 118# 119# CHECK-LABEL: CollapseMOVEM_Zero_Mixed 120# CHECK: movem.l %d3, (4,%sp) 121# CHECK: movem.l %d0-%d2, (-8,%sp) 122# CHECK: movem.l %d4, (8,%sp) 123name: CollapseMOVEM_Zero_Mixed 124body: | 125 bb.0: 126 MOVM32pm 4, $sp, 8 127 MOVM32pm -4, $sp, 2 128 MOVM32pm -8, $sp, 1 129 MOVM32pm 0, $sp, 4 130 MOVM32pm 8, $sp, 16 131 132... 133--- # CollapseMOVEM_Zero_Reversed 134# 135# CHECK-LABEL: CollapseMOVEM_Zero_Reversed 136# CHECK: movem.l %d0-%d4, (-8,%sp) 137name: CollapseMOVEM_Zero_Reversed 138body: | 139 bb.0: 140 MOVM32pm 8, $sp, 16 141 MOVM32pm 4, $sp, 8 142 MOVM32pm 0, $sp, 4 143 MOVM32pm -4, $sp, 2 144 MOVM32pm -8, $sp, 1 145 146... 147# 148# CHECK-LABEL: CollapseMOVEM_Zero_ReversedStoreOrder 149# CHECK: movem.l %d0, (8,%sp) 150# CHECK: movem.l %d1, (4,%sp) 151# CHECK: movem.l %d2, (0,%sp) 152# CHECK: movem.l %d3, (-4,%sp) 153# CHECK: movem.l %d4, (-8,%sp) 154name: CollapseMOVEM_Zero_ReversedStoreOrder 155body: | 156 bb.0: 157 MOVM32pm 8, $sp, 1 158 MOVM32pm 4, $sp, 2 159 MOVM32pm 0, $sp, 4 160 MOVM32pm -4, $sp, 8 161 MOVM32pm -8, $sp, 16 162 163... 164