1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2 ; RUN: llc < %s -mtriple=i686-unknown | FileCheck %s --check-prefix=X32 3 ; RUN: llc < %s -mtriple=x86_64-unknown | FileCheck %s --check-prefix=X64 4 5 define zeroext i8 @test_udivrem_zext_ah(i8 %x, i8 %y) { 6 ; X32-LABEL: test_udivrem_zext_ah: 7 ; X32: # %bb.0: 8 ; X32-NEXT: movzbl {{[0-9]+}}(%esp), %eax 9 ; X32-NEXT: # kill: def $eax killed $eax def $ax 10 ; X32-NEXT: divb {{[0-9]+}}(%esp) 11 ; X32-NEXT: movzbl %ah, %ecx 12 ; X32-NEXT: movb %al, z 13 ; X32-NEXT: movl %ecx, %eax 14 ; X32-NEXT: retl 15 ; 16 ; X64-LABEL: test_udivrem_zext_ah: 17 ; X64: # %bb.0: 18 ; X64-NEXT: movzbl %dil, %eax 19 ; X64-NEXT: # kill: def $eax killed $eax def $ax 20 ; X64-NEXT: divb %sil 21 ; X64-NEXT: movzbl %ah, %ecx 22 ; X64-NEXT: movb %al, {{.*}}(%rip) 23 ; X64-NEXT: movl %ecx, %eax 24 ; X64-NEXT: retq 25 %div = udiv i8 %x, %y 26 store i8 %div, i8* @z 27 %1 = urem i8 %x, %y 28 ret i8 %1 29 } 30 31 define zeroext i8 @test_urem_zext_ah(i8 %x, i8 %y) { 32 ; X32-LABEL: test_urem_zext_ah: 33 ; X32: # %bb.0: 34 ; X32-NEXT: movzbl {{[0-9]+}}(%esp), %eax 35 ; X32-NEXT: # kill: def $eax killed $eax def $ax 36 ; X32-NEXT: divb {{[0-9]+}}(%esp) 37 ; X32-NEXT: movzbl %ah, %eax 38 ; X32-NEXT: # kill: def $al killed $al killed $eax 39 ; X32-NEXT: retl 40 ; 41 ; X64-LABEL: test_urem_zext_ah: 42 ; X64: # %bb.0: 43 ; X64-NEXT: movzbl %dil, %eax 44 ; X64-NEXT: # kill: def $eax killed $eax def $ax 45 ; X64-NEXT: divb %sil 46 ; X64-NEXT: movzbl %ah, %eax 47 ; X64-NEXT: # kill: def $al killed $al killed $eax 48 ; X64-NEXT: retq 49 %1 = urem i8 %x, %y 50 ret i8 %1 51 } 52 53 define i8 @test_urem_noext_ah(i8 %x, i8 %y) { 54 ; X32-LABEL: test_urem_noext_ah: 55 ; X32: # %bb.0: 56 ; X32-NEXT: movb {{[0-9]+}}(%esp), %cl 57 ; X32-NEXT: movzbl {{[0-9]+}}(%esp), %eax 58 ; X32-NEXT: # kill: def $eax killed $eax def $ax 59 ; X32-NEXT: divb %cl 60 ; X32-NEXT: movzbl %ah, %eax 61 ; X32-NEXT: addb %cl, %al 62 ; X32-NEXT: # kill: def $al killed $al killed $eax 63 ; X32-NEXT: retl 64 ; 65 ; X64-LABEL: test_urem_noext_ah: 66 ; X64: # %bb.0: 67 ; X64-NEXT: movzbl %dil, %eax 68 ; X64-NEXT: # kill: def $eax killed $eax def $ax 69 ; X64-NEXT: divb %sil 70 ; X64-NEXT: movzbl %ah, %eax 71 ; X64-NEXT: addb %sil, %al 72 ; X64-NEXT: # kill: def $al killed $al killed $eax 73 ; X64-NEXT: retq 74 %1 = urem i8 %x, %y 75 %2 = add i8 %1, %y 76 ret i8 %2 77 } 78 79 define i64 @test_urem_zext64_ah(i8 %x, i8 %y) { 80 ; X32-LABEL: test_urem_zext64_ah: 81 ; X32: # %bb.0: 82 ; X32-NEXT: movzbl {{[0-9]+}}(%esp), %eax 83 ; X32-NEXT: # kill: def $eax killed $eax def $ax 84 ; X32-NEXT: divb {{[0-9]+}}(%esp) 85 ; X32-NEXT: movzbl %ah, %eax 86 ; X32-NEXT: xorl %edx, %edx 87 ; X32-NEXT: retl 88 ; 89 ; X64-LABEL: test_urem_zext64_ah: 90 ; X64: # %bb.0: 91 ; X64-NEXT: movzbl %dil, %eax 92 ; X64-NEXT: # kill: def $eax killed $eax def $ax 93 ; X64-NEXT: divb %sil 94 ; X64-NEXT: movzbl %ah, %eax 95 ; X64-NEXT: retq 96 %1 = urem i8 %x, %y 97 %2 = zext i8 %1 to i64 98 ret i64 %2 99 } 100 101 define signext i8 @test_sdivrem_sext_ah(i8 %x, i8 %y) { 102 ; X32-LABEL: test_sdivrem_sext_ah: 103 ; X32: # %bb.0: 104 ; X32-NEXT: movb {{[0-9]+}}(%esp), %al 105 ; X32-NEXT: cbtw 106 ; X32-NEXT: idivb {{[0-9]+}}(%esp) 107 ; X32-NEXT: movsbl %ah, %ecx 108 ; X32-NEXT: movb %al, z 109 ; X32-NEXT: movl %ecx, %eax 110 ; X32-NEXT: retl 111 ; 112 ; X64-LABEL: test_sdivrem_sext_ah: 113 ; X64: # %bb.0: 114 ; X64-NEXT: movl %edi, %eax 115 ; X64-NEXT: cbtw 116 ; X64-NEXT: idivb %sil 117 ; X64-NEXT: movsbl %ah, %ecx 118 ; X64-NEXT: movb %al, {{.*}}(%rip) 119 ; X64-NEXT: movl %ecx, %eax 120 ; X64-NEXT: retq 121 %div = sdiv i8 %x, %y 122 store i8 %div, i8* @z 123 %1 = srem i8 %x, %y 124 ret i8 %1 125 } 126 127 define signext i8 @test_srem_sext_ah(i8 %x, i8 %y) { 128 ; X32-LABEL: test_srem_sext_ah: 129 ; X32: # %bb.0: 130 ; X32-NEXT: movb {{[0-9]+}}(%esp), %al 131 ; X32-NEXT: cbtw 132 ; X32-NEXT: idivb {{[0-9]+}}(%esp) 133 ; X32-NEXT: movsbl %ah, %eax 134 ; X32-NEXT: # kill: def $al killed $al killed $eax 135 ; X32-NEXT: retl 136 ; 137 ; X64-LABEL: test_srem_sext_ah: 138 ; X64: # %bb.0: 139 ; X64-NEXT: movl %edi, %eax 140 ; X64-NEXT: cbtw 141 ; X64-NEXT: idivb %sil 142 ; X64-NEXT: movsbl %ah, %eax 143 ; X64-NEXT: # kill: def $al killed $al killed $eax 144 ; X64-NEXT: retq 145 %1 = srem i8 %x, %y 146 ret i8 %1 147 } 148 149 define i8 @test_srem_noext_ah(i8 %x, i8 %y) { 150 ; X32-LABEL: test_srem_noext_ah: 151 ; X32: # %bb.0: 152 ; X32-NEXT: movb {{[0-9]+}}(%esp), %al 153 ; X32-NEXT: movb {{[0-9]+}}(%esp), %cl 154 ; X32-NEXT: cbtw 155 ; X32-NEXT: idivb %cl 156 ; X32-NEXT: movsbl %ah, %eax 157 ; X32-NEXT: addb %cl, %al 158 ; X32-NEXT: # kill: def $al killed $al killed $eax 159 ; X32-NEXT: retl 160 ; 161 ; X64-LABEL: test_srem_noext_ah: 162 ; X64: # %bb.0: 163 ; X64-NEXT: movl %edi, %eax 164 ; X64-NEXT: cbtw 165 ; X64-NEXT: idivb %sil 166 ; X64-NEXT: movsbl %ah, %eax 167 ; X64-NEXT: addb %sil, %al 168 ; X64-NEXT: # kill: def $al killed $al killed $eax 169 ; X64-NEXT: retq 170 %1 = srem i8 %x, %y 171 %2 = add i8 %1, %y 172 ret i8 %2 173 } 174 175 define i64 @test_srem_sext64_ah(i8 %x, i8 %y) { 176 ; X32-LABEL: test_srem_sext64_ah: 177 ; X32: # %bb.0: 178 ; X32-NEXT: movb {{[0-9]+}}(%esp), %al 179 ; X32-NEXT: cbtw 180 ; X32-NEXT: idivb {{[0-9]+}}(%esp) 181 ; X32-NEXT: movsbl %ah, %eax 182 ; X32-NEXT: movl %eax, %edx 183 ; X32-NEXT: sarl $31, %edx 184 ; X32-NEXT: retl 185 ; 186 ; X64-LABEL: test_srem_sext64_ah: 187 ; X64: # %bb.0: 188 ; X64-NEXT: movl %edi, %eax 189 ; X64-NEXT: cbtw 190 ; X64-NEXT: idivb %sil 191 ; X64-NEXT: movsbl %ah, %eax 192 ; X64-NEXT: cltq 193 ; X64-NEXT: retq 194 %1 = srem i8 %x, %y 195 %2 = sext i8 %1 to i64 196 ret i64 %2 197 } 198 199 define i64 @pr25754(i8 %a, i8 %c) { 200 ; X32-LABEL: pr25754: 201 ; X32: # %bb.0: 202 ; X32-NEXT: movzbl {{[0-9]+}}(%esp), %eax 203 ; X32-NEXT: # kill: def $eax killed $eax def $ax 204 ; X32-NEXT: divb {{[0-9]+}}(%esp) 205 ; X32-NEXT: movzbl %ah, %ecx 206 ; X32-NEXT: movzbl %al, %eax 207 ; X32-NEXT: addl %ecx, %eax 208 ; X32-NEXT: xorl %edx, %edx 209 ; X32-NEXT: retl 210 ; 211 ; X64-LABEL: pr25754: 212 ; X64: # %bb.0: 213 ; X64-NEXT: movzbl %dil, %eax 214 ; X64-NEXT: # kill: def $eax killed $eax def $ax 215 ; X64-NEXT: divb %sil 216 ; X64-NEXT: movzbl %ah, %ecx 217 ; X64-NEXT: movzbl %al, %eax 218 ; X64-NEXT: addq %rcx, %rax 219 ; X64-NEXT: retq 220 %r1 = urem i8 %a, %c 221 %d1 = udiv i8 %a, %c 222 %r2 = zext i8 %r1 to i64 223 %d2 = zext i8 %d1 to i64 224 %ret = add i64 %r2, %d2 225 ret i64 %ret 226 } 227 228 @z = external global i8 229