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 5define 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 31define 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 53define 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 79define 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 101define 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 127define 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 149define 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 175define 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 199define 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