Home | History | Annotate | Download | only in X86
      1 ; RUN: llc < %s -march=x86 -mcpu=corei7 | FileCheck %s
      2 ; RUN: llc < %s -march=x86 -mcpu=core-avx2 | FileCheck %s --check-prefix=BMI2
      3 
      4 define i32 @foo(i32 %x, i32 %y, i32 %z) nounwind readnone {
      5 entry:
      6 ; CHECK-LABEL: foo:
      7 ; CHECK: roll %cl
      8 	%0 = shl i32 %x, %z
      9 	%1 = sub i32 32, %z
     10 	%2 = lshr i32 %x, %1
     11 	%3 = or i32 %2, %0
     12 	ret i32 %3
     13 }
     14 
     15 define i32 @bar(i32 %x, i32 %y, i32 %z) nounwind readnone {
     16 entry:
     17 ; CHECK-LABEL: bar:
     18 ; CHECK: shldl %cl
     19 	%0 = shl i32 %y, %z
     20 	%1 = sub i32 32, %z
     21 	%2 = lshr i32 %x, %1
     22 	%3 = or i32 %2, %0
     23 	ret i32 %3
     24 }
     25 
     26 define i32 @un(i32 %x, i32 %y, i32 %z) nounwind readnone {
     27 entry:
     28 ; CHECK-LABEL: un:
     29 ; CHECK: rorl %cl
     30 	%0 = lshr i32 %x, %z
     31 	%1 = sub i32 32, %z
     32 	%2 = shl i32 %x, %1
     33 	%3 = or i32 %2, %0
     34 	ret i32 %3
     35 }
     36 
     37 define i32 @bu(i32 %x, i32 %y, i32 %z) nounwind readnone {
     38 entry:
     39 ; CHECK-LABEL: bu:
     40 ; CHECK: shrdl %cl
     41 	%0 = lshr i32 %y, %z
     42 	%1 = sub i32 32, %z
     43 	%2 = shl i32 %x, %1
     44 	%3 = or i32 %2, %0
     45 	ret i32 %3
     46 }
     47 
     48 define i32 @xfoo(i32 %x, i32 %y, i32 %z) nounwind readnone {
     49 entry:
     50 ; CHECK-LABEL: xfoo:
     51 ; CHECK: roll $7
     52 ; BMI2-LABEL: xfoo:
     53 ; BMI2: rorxl $25
     54 	%0 = lshr i32 %x, 25
     55 	%1 = shl i32 %x, 7
     56 	%2 = or i32 %0, %1
     57 	ret i32 %2
     58 }
     59 
     60 define i32 @xfoop(i32* %p) nounwind readnone {
     61 entry:
     62 ; BMI2-LABEL: xfoop:
     63 ; BMI2: rorxl $25, ({{.+}}), %{{.+}}
     64 	%x = load i32, i32* %p
     65 	%a = lshr i32 %x, 25
     66 	%b = shl i32 %x, 7
     67 	%c = or i32 %a, %b
     68 	ret i32 %c
     69 }
     70 
     71 define i32 @xbar(i32 %x, i32 %y, i32 %z) nounwind readnone {
     72 entry:
     73 ; CHECK-LABEL: xbar:
     74 ; CHECK: shldl $7
     75 	%0 = shl i32 %y, 7
     76 	%1 = lshr i32 %x, 25
     77 	%2 = or i32 %0, %1
     78 	ret i32 %2
     79 }
     80 
     81 define i32 @xun(i32 %x, i32 %y, i32 %z) nounwind readnone {
     82 entry:
     83 ; CHECK-LABEL: xun:
     84 ; CHECK: roll $25
     85 ; BMI2-LABEL: xun:
     86 ; BMI2: rorxl $7
     87 	%0 = lshr i32 %x, 7
     88 	%1 = shl i32 %x, 25
     89 	%2 = or i32 %0, %1
     90 	ret i32 %2
     91 }
     92 
     93 define i32 @xunp(i32* %p) nounwind readnone {
     94 entry:
     95 ; BMI2-LABEL: xunp:
     96 ; BMI2: rorxl $7, ({{.+}}), %{{.+}}
     97 	%x = load i32, i32* %p
     98 	%a = lshr i32 %x, 7
     99 	%b = shl i32 %x, 25
    100 	%c = or i32 %a, %b
    101 	ret i32 %c
    102 }
    103 
    104 define i32 @xbu(i32 %x, i32 %y, i32 %z) nounwind readnone {
    105 entry:
    106 ; CHECK-LABEL: xbu:
    107 ; CHECK: shldl
    108 	%0 = lshr i32 %y, 7
    109 	%1 = shl i32 %x, 25
    110 	%2 = or i32 %0, %1
    111 	ret i32 %2
    112 }
    113