1 # NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
2 # RUN: llc -mtriple=x86_64-linux-gnu -run-pass=instruction-select -verify-machineinstrs %s -o - | FileCheck %s
6 source_filename = "srem.ll"
7 target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
9 define i8 @test_srem_i8(i8 %arg1, i8 %arg2) {
10 %res = srem i8 %arg1, %arg2
14 define i16 @test_srem_i16(i16 %arg1, i16 %arg2) {
15 %res = srem i16 %arg1, %arg2
19 define i32 @test_srem_i32(i32 %arg1, i32 %arg2) {
20 %res = srem i32 %arg1, %arg2
24 define i64 @test_srem_i64(i64 %arg1, i64 %arg2) {
25 %res = srem i64 %arg1, %arg2
33 exposesReturnsTwice: false
38 tracksRegLiveness: true
40 - { id: 0, class: gpr, preferred-register: '' }
41 - { id: 1, class: gpr, preferred-register: '' }
42 - { id: 2, class: gpr, preferred-register: '' }
43 - { id: 3, class: gpr, preferred-register: '' }
44 - { id: 4, class: gpr, preferred-register: '' }
47 isFrameAddressTaken: false
48 isReturnAddressTaken: false
57 maxCallFrameSize: 4294967295
58 hasOpaqueSPAdjustment: false
60 hasMustTailInVarArgFunc: false
71 ; CHECK-LABEL: name: test_srem_i8
72 ; CHECK: liveins: $edi, $esi
74 ; CHECK-NEXT: [[COPY:%[0-9]+]]:gr32 = COPY $edi
75 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:gr8 = COPY [[COPY]].sub_8bit
76 ; CHECK-NEXT: [[COPY2:%[0-9]+]]:gr32 = COPY $esi
77 ; CHECK-NEXT: [[COPY3:%[0-9]+]]:gr8 = COPY [[COPY2]].sub_8bit
78 ; CHECK-NEXT: $ax = MOVSX16rr8 [[COPY1]]
79 ; CHECK-NEXT: IDIV8r [[COPY3]], implicit-def $al, implicit-def $ah, implicit-def $eflags, implicit $ax
80 ; CHECK-NEXT: [[COPY4:%[0-9]+]]:gr16 = COPY $ax
81 ; CHECK-NEXT: [[SHR16ri:%[0-9]+]]:gr16 = SHR16ri [[COPY4]], 8, implicit-def $eflags
82 ; CHECK-NEXT: [[SUBREG_TO_REG:%[0-9]+]]:gr8 = SUBREG_TO_REG 0, [[SHR16ri]], %subreg.sub_8bit
83 ; CHECK-NEXT: $al = COPY [[SUBREG_TO_REG]]
84 ; CHECK-NEXT: RET 0, implicit $al
85 %2:gpr(s32) = COPY $edi
86 %0:gpr(s8) = G_TRUNC %2(s32)
87 %3:gpr(s32) = COPY $esi
88 %1:gpr(s8) = G_TRUNC %3(s32)
89 %4:gpr(s8) = G_SREM %0, %1
97 exposesReturnsTwice: false
102 tracksRegLiveness: true
104 - { id: 0, class: gpr, preferred-register: '' }
105 - { id: 1, class: gpr, preferred-register: '' }
106 - { id: 2, class: gpr, preferred-register: '' }
107 - { id: 3, class: gpr, preferred-register: '' }
108 - { id: 4, class: gpr, preferred-register: '' }
111 isFrameAddressTaken: false
112 isReturnAddressTaken: false
121 maxCallFrameSize: 4294967295
122 hasOpaqueSPAdjustment: false
124 hasMustTailInVarArgFunc: false
135 ; CHECK-LABEL: name: test_srem_i16
136 ; CHECK: liveins: $edi, $esi
138 ; CHECK-NEXT: [[COPY:%[0-9]+]]:gr32 = COPY $edi
139 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:gr16 = COPY [[COPY]].sub_16bit
140 ; CHECK-NEXT: [[COPY2:%[0-9]+]]:gr32 = COPY $esi
141 ; CHECK-NEXT: [[COPY3:%[0-9]+]]:gr16 = COPY [[COPY2]].sub_16bit
142 ; CHECK-NEXT: $ax = COPY [[COPY1]]
143 ; CHECK-NEXT: CWD implicit-def $ax, implicit-def $dx, implicit $ax
144 ; CHECK-NEXT: IDIV16r [[COPY3]], implicit-def $ax, implicit-def $dx, implicit-def $eflags, implicit $ax, implicit $dx
145 ; CHECK-NEXT: [[COPY4:%[0-9]+]]:gr16 = COPY $dx
146 ; CHECK-NEXT: $ax = COPY [[COPY4]]
147 ; CHECK-NEXT: RET 0, implicit $ax
148 %2:gpr(s32) = COPY $edi
149 %0:gpr(s16) = G_TRUNC %2(s32)
150 %3:gpr(s32) = COPY $esi
151 %1:gpr(s16) = G_TRUNC %3(s32)
152 %4:gpr(s16) = G_SREM %0, %1
160 exposesReturnsTwice: false
162 regBankSelected: true
165 tracksRegLiveness: true
167 - { id: 0, class: gpr, preferred-register: '' }
168 - { id: 1, class: gpr, preferred-register: '' }
169 - { id: 2, class: gpr, preferred-register: '' }
172 isFrameAddressTaken: false
173 isReturnAddressTaken: false
182 maxCallFrameSize: 4294967295
183 hasOpaqueSPAdjustment: false
185 hasMustTailInVarArgFunc: false
196 ; CHECK-LABEL: name: test_srem_i32
197 ; CHECK: liveins: $edi, $esi
199 ; CHECK-NEXT: [[COPY:%[0-9]+]]:gr32 = COPY $edi
200 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:gr32 = COPY $esi
201 ; CHECK-NEXT: $eax = COPY [[COPY]]
202 ; CHECK-NEXT: CDQ implicit-def $eax, implicit-def $edx, implicit $eax
203 ; CHECK-NEXT: IDIV32r [[COPY1]], implicit-def $eax, implicit-def $edx, implicit-def $eflags, implicit $eax, implicit $edx
204 ; CHECK-NEXT: [[COPY2:%[0-9]+]]:gr32 = COPY $edx
205 ; CHECK-NEXT: $eax = COPY [[COPY2]]
206 ; CHECK-NEXT: RET 0, implicit $eax
207 %0:gpr(s32) = COPY $edi
208 %1:gpr(s32) = COPY $esi
209 %2:gpr(s32) = G_SREM %0, %1
217 exposesReturnsTwice: false
219 regBankSelected: true
222 tracksRegLiveness: true
224 - { id: 0, class: gpr, preferred-register: '' }
225 - { id: 1, class: gpr, preferred-register: '' }
226 - { id: 2, class: gpr, preferred-register: '' }
229 isFrameAddressTaken: false
230 isReturnAddressTaken: false
239 maxCallFrameSize: 4294967295
240 hasOpaqueSPAdjustment: false
242 hasMustTailInVarArgFunc: false
253 ; CHECK-LABEL: name: test_srem_i64
254 ; CHECK: liveins: $rdi, $rsi
256 ; CHECK-NEXT: [[COPY:%[0-9]+]]:gr64 = COPY $rdi
257 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:gr64 = COPY $rsi
258 ; CHECK-NEXT: $rax = COPY [[COPY]]
259 ; CHECK-NEXT: CQO implicit-def $rax, implicit-def $rdx, implicit $rax
260 ; CHECK-NEXT: IDIV64r [[COPY1]], implicit-def $rax, implicit-def $rdx, implicit-def $eflags, implicit $rax, implicit $rdx
261 ; CHECK-NEXT: [[COPY2:%[0-9]+]]:gr64 = COPY $rdx
262 ; CHECK-NEXT: $rax = COPY [[COPY2]]
263 ; CHECK-NEXT: RET 0, implicit $rax
264 %0:gpr(s64) = COPY $rdi
265 %1:gpr(s64) = COPY $rsi
266 %2:gpr(s64) = G_SREM %0, %1