1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc < %s -mtriple=i686-unknown-unknown | FileCheck %s --check-prefix=X32 3; RUN: llc < %s -mtriple=x86_64-unknown-unknown | FileCheck %s --check-prefix=X64 4 5define i16 @foo(i16 %x, i16 %y, i16 %z) nounwind { 6; X32-LABEL: foo: 7; X32: # %bb.0: 8; X32-NEXT: movb {{[0-9]+}}(%esp), %cl 9; X32-NEXT: movzwl {{[0-9]+}}(%esp), %eax 10; X32-NEXT: rolw %cl, %ax 11; X32-NEXT: retl 12; 13; X64-LABEL: foo: 14; X64: # %bb.0: 15; X64-NEXT: movl %edx, %ecx 16; X64-NEXT: shldw %cl, %di, %di 17; X64-NEXT: movl %edi, %eax 18; X64-NEXT: retq 19 %t0 = shl i16 %x, %z 20 %t1 = sub i16 16, %z 21 %t2 = lshr i16 %x, %t1 22 %t3 = or i16 %t2, %t0 23 ret i16 %t3 24} 25 26define i16 @bar(i16 %x, i16 %y, i16 %z) nounwind { 27; X32-LABEL: bar: 28; X32: # %bb.0: 29; X32-NEXT: movb {{[0-9]+}}(%esp), %cl 30; X32-NEXT: movzwl {{[0-9]+}}(%esp), %edx 31; X32-NEXT: movzwl {{[0-9]+}}(%esp), %eax 32; X32-NEXT: shldw %cl, %dx, %ax 33; X32-NEXT: retl 34; 35; X64-LABEL: bar: 36; X64: # %bb.0: 37; X64-NEXT: movl %edx, %ecx 38; X64-NEXT: shldw %cl, %di, %si 39; X64-NEXT: movl %esi, %eax 40; X64-NEXT: retq 41 %t0 = shl i16 %y, %z 42 %t1 = sub i16 16, %z 43 %t2 = lshr i16 %x, %t1 44 %t3 = or i16 %t2, %t0 45 ret i16 %t3 46} 47 48define i16 @un(i16 %x, i16 %y, i16 %z) nounwind { 49; X32-LABEL: un: 50; X32: # %bb.0: 51; X32-NEXT: movb {{[0-9]+}}(%esp), %cl 52; X32-NEXT: movzwl {{[0-9]+}}(%esp), %eax 53; X32-NEXT: rorw %cl, %ax 54; X32-NEXT: retl 55; 56; X64-LABEL: un: 57; X64: # %bb.0: 58; X64-NEXT: movl %edx, %ecx 59; X64-NEXT: shrdw %cl, %di, %di 60; X64-NEXT: movl %edi, %eax 61; X64-NEXT: retq 62 %t0 = lshr i16 %x, %z 63 %t1 = sub i16 16, %z 64 %t2 = shl i16 %x, %t1 65 %t3 = or i16 %t2, %t0 66 ret i16 %t3 67} 68 69define i16 @bu(i16 %x, i16 %y, i16 %z) nounwind { 70; X32-LABEL: bu: 71; X32: # %bb.0: 72; X32-NEXT: movb {{[0-9]+}}(%esp), %cl 73; X32-NEXT: movzwl {{[0-9]+}}(%esp), %edx 74; X32-NEXT: movzwl {{[0-9]+}}(%esp), %eax 75; X32-NEXT: shrdw %cl, %dx, %ax 76; X32-NEXT: retl 77; 78; X64-LABEL: bu: 79; X64: # %bb.0: 80; X64-NEXT: movl %edx, %ecx 81; X64-NEXT: shrdw %cl, %di, %si 82; X64-NEXT: movl %esi, %eax 83; X64-NEXT: retq 84 %t0 = lshr i16 %y, %z 85 %t1 = sub i16 16, %z 86 %t2 = shl i16 %x, %t1 87 %t3 = or i16 %t2, %t0 88 ret i16 %t3 89} 90 91define i16 @xfoo(i16 %x, i16 %y, i16 %z) nounwind { 92; X32-LABEL: xfoo: 93; X32: # %bb.0: 94; X32-NEXT: movzwl {{[0-9]+}}(%esp), %eax 95; X32-NEXT: rolw $5, %ax 96; X32-NEXT: retl 97; 98; X64-LABEL: xfoo: 99; X64: # %bb.0: 100; X64-NEXT: rolw $5, %di 101; X64-NEXT: movl %edi, %eax 102; X64-NEXT: retq 103 %t0 = lshr i16 %x, 11 104 %t1 = shl i16 %x, 5 105 %t2 = or i16 %t0, %t1 106 ret i16 %t2 107} 108 109define i16 @xbar(i16 %x, i16 %y, i16 %z) nounwind { 110; X32-LABEL: xbar: 111; X32: # %bb.0: 112; X32-NEXT: movzwl {{[0-9]+}}(%esp), %ecx 113; X32-NEXT: movzwl {{[0-9]+}}(%esp), %eax 114; X32-NEXT: shldw $5, %cx, %ax 115; X32-NEXT: retl 116; 117; X64-LABEL: xbar: 118; X64: # %bb.0: 119; X64-NEXT: shldw $5, %di, %si 120; X64-NEXT: movl %esi, %eax 121; X64-NEXT: retq 122 %t0 = shl i16 %y, 5 123 %t1 = lshr i16 %x, 11 124 %t2 = or i16 %t0, %t1 125 ret i16 %t2 126} 127 128define i16 @xun(i16 %x, i16 %y, i16 %z) nounwind { 129; X32-LABEL: xun: 130; X32: # %bb.0: 131; X32-NEXT: movzwl {{[0-9]+}}(%esp), %eax 132; X32-NEXT: rolw $11, %ax 133; X32-NEXT: retl 134; 135; X64-LABEL: xun: 136; X64: # %bb.0: 137; X64-NEXT: rolw $11, %di 138; X64-NEXT: movl %edi, %eax 139; X64-NEXT: retq 140 %t0 = lshr i16 %x, 5 141 %t1 = shl i16 %x, 11 142 %t2 = or i16 %t0, %t1 143 ret i16 %t2 144} 145 146define i16 @xbu(i16 %x, i16 %y, i16 %z) nounwind { 147; X32-LABEL: xbu: 148; X32: # %bb.0: 149; X32-NEXT: movzwl {{[0-9]+}}(%esp), %ecx 150; X32-NEXT: movzwl {{[0-9]+}}(%esp), %eax 151; X32-NEXT: shldw $11, %cx, %ax 152; X32-NEXT: retl 153; 154; X64-LABEL: xbu: 155; X64: # %bb.0: 156; X64-NEXT: shldw $11, %si, %di 157; X64-NEXT: movl %edi, %eax 158; X64-NEXT: retq 159 %t0 = lshr i16 %y, 5 160 %t1 = shl i16 %x, 11 161 %t2 = or i16 %t0, %t1 162 ret i16 %t2 163} 164