Home | History | Annotate | Download | only in Hexagon
      1 ; RUN: llc -march=hexagon < %s | FileCheck %s
      2 
      3 target triple = "hexagon"
      4 
      5 ; CHECK-LABEL: f0
      6 ; CHECK: r0 = rol(r0,#7)
      7 define i32 @f0(i32 %a0) #0 {
      8 b0:
      9   %v0 = shl i32 %a0, 7
     10   %v1 = lshr i32 %a0, 25
     11   %v2 = or i32 %v0, %v1
     12   ret i32 %v2
     13 }
     14 
     15 ; CHECK-LABEL: f1
     16 ; No variable-shift rotates. Check for the default expansion code.
     17 ; This is a rotate left by %a1(r1).
     18 ; CHECK: r[[R10:[0-9]+]] = sub(#32,r1)
     19 ; CHECK: r[[R11:[0-9]+]] = and(r1,#31)
     20 ; CHECK: r[[R12:[0-9]+]] = and(r[[R10]],#31)
     21 ; CHECK: r[[R13:[0-9]+]] = asl(r0,r[[R11]])
     22 ; CHECK: r[[R13]] |= lsr(r0,r[[R12]])
     23 define i32 @f1(i32 %a0, i32 %a1) #0 {
     24 b0:
     25   %v0 = shl i32 %a0, %a1
     26   %v1 = sub i32 32, %a1
     27   %v2 = lshr i32 %a0, %v1
     28   %v3 = or i32 %v2, %v0
     29   ret i32 %v3
     30 }
     31 
     32 ; CHECK-LABEL: f2
     33 ; CHECK: r0 = rol(r0,#25)
     34 define i32 @f2(i32 %a0) #0 {
     35 b0:
     36   %v0 = lshr i32 %a0, 7
     37   %v1 = shl i32 %a0, 25
     38   %v2 = or i32 %v0, %v1
     39   ret i32 %v2
     40 }
     41 
     42 ; CHECK-LABEL: f3
     43 ; No variable-shift rotates. Check for the default expansion code.
     44 ; This is a rotate right by %a1(r1) that became a rotate left by 32-%a1.
     45 ; CHECK: r[[R30:[0-9]+]] = sub(#32,r1)
     46 ; CHECK: r[[R31:[0-9]+]] = and(r1,#31)
     47 ; CHECK: r[[R32:[0-9]+]] = and(r[[R30]],#31)
     48 ; CHECK: r[[R33:[0-9]+]] = asl(r0,r[[R32]])
     49 ; CHECK: r[[R33]] |= lsr(r0,r[[R31]])
     50 define i32 @f3(i32 %a0, i32 %a1) #0 {
     51 b0:
     52   %v0 = lshr i32 %a0, %a1
     53   %v1 = sub i32 32, %a1
     54   %v2 = shl i32 %a0, %v1
     55   %v3 = or i32 %v2, %v0
     56   ret i32 %v3
     57 }
     58 
     59 ; CHECK-LABEL: f4
     60 ; CHECK: r1:0 = rol(r1:0,#7)
     61 define i64 @f4(i64 %a0) #0 {
     62 b0:
     63   %v0 = shl i64 %a0, 7
     64   %v1 = lshr i64 %a0, 57
     65   %v2 = or i64 %v0, %v1
     66   ret i64 %v2
     67 }
     68 
     69 ; CHECK-LABEL: f5
     70 ; No variable-shift rotates. Check for the default expansion code.
     71 ; This is a rotate left by %a1(r2).
     72 ; CHECK: r[[R50:[0-9]+]] = sub(#64,r2)
     73 ; CHECK: r[[R51:[0-9]+]] = and(r2,#63)
     74 ; CHECK: r[[R52:[0-9]+]] = and(r[[R50]],#63)
     75 ; CHECK: r[[R53:[0-9]+]]:[[R54:[0-9]+]] = asl(r1:0,r[[R51]])
     76 ; CHECK: r[[R53]]:[[R54]] |= lsr(r1:0,r[[R52]])
     77 define i64 @f5(i64 %a0, i32 %a1) #0 {
     78 b0:
     79   %v0 = zext i32 %a1 to i64
     80   %v1 = shl i64 %a0, %v0
     81   %v2 = sub i32 64, %a1
     82   %v3 = zext i32 %v2 to i64
     83   %v4 = lshr i64 %a0, %v3
     84   %v5 = or i64 %v4, %v1
     85   ret i64 %v5
     86 }
     87 
     88 ; CHECK-LABEL: f6
     89 ; CHECK: r1:0 = rol(r1:0,#57)
     90 define i64 @f6(i64 %a0) #0 {
     91 b0:
     92   %v0 = lshr i64 %a0, 7
     93   %v1 = shl i64 %a0, 57
     94   %v2 = or i64 %v0, %v1
     95   ret i64 %v2
     96 }
     97 
     98 ; CHECK-LABEL: f7
     99 ; No variable-shift rotates. Check for the default expansion code.
    100 ; This is a rotate right by %a1(r2) that became a rotate left by 64-%a1.
    101 ; CHECK: r[[R70:[0-9]+]] = sub(#64,r2)
    102 ; CHECK: r[[R71:[0-9]+]] = and(r2,#63)
    103 ; CHECK: r[[R72:[0-9]+]] = and(r[[R70]],#63)
    104 ; CHECK: r[[R73:[0-9]+]]:[[R75:[0-9]+]] = asl(r1:0,r[[R72]])
    105 ; CHECK: r[[R73]]:[[R75]] |= lsr(r1:0,r[[R71]])
    106 define i64 @f7(i64 %a0, i32 %a1) #0 {
    107 b0:
    108   %v0 = zext i32 %a1 to i64
    109   %v1 = lshr i64 %a0, %v0
    110   %v2 = sub i32 64, %a1
    111   %v3 = zext i32 %v2 to i64
    112   %v4 = shl i64 %a0, %v3
    113   %v5 = or i64 %v4, %v1
    114   ret i64 %v5
    115 }
    116 
    117 ; CHECK-LABEL: f8
    118 ; CHECK: r0 += rol(r1,#7)
    119 define i32 @f8(i32 %a0, i32 %a1) #0 {
    120 b0:
    121   %v0 = shl i32 %a1, 7
    122   %v1 = lshr i32 %a1, 25
    123   %v2 = or i32 %v0, %v1
    124   %v3 = add i32 %v2, %a0
    125   ret i32 %v3
    126 }
    127 
    128 ; CHECK-LABEL: f9
    129 ; CHECK: r0 -= rol(r1,#7)
    130 define i32 @f9(i32 %a0, i32 %a1) #0 {
    131 b0:
    132   %v0 = shl i32 %a1, 7
    133   %v1 = lshr i32 %a1, 25
    134   %v2 = or i32 %v0, %v1
    135   %v3 = sub i32 %a0, %v2
    136   ret i32 %v3
    137 }
    138 
    139 ; CHECK-LABEL: f10
    140 ; CHECK: r0 &= rol(r1,#7)
    141 define i32 @f10(i32 %a0, i32 %a1) #0 {
    142 b0:
    143   %v0 = shl i32 %a1, 7
    144   %v1 = lshr i32 %a1, 25
    145   %v2 = or i32 %v0, %v1
    146   %v3 = and i32 %v2, %a0
    147   ret i32 %v3
    148 }
    149 
    150 ; CHECK-LABEL: f12
    151 ; CHECK: r0 ^= rol(r1,#7)
    152 define i32 @f12(i32 %a0, i32 %a1) #0 {
    153 b0:
    154   %v0 = shl i32 %a1, 7
    155   %v1 = lshr i32 %a1, 25
    156   %v2 = or i32 %v0, %v1
    157   %v3 = xor i32 %v2, %a0
    158   ret i32 %v3
    159 }
    160 
    161 ; CHECK-LABEL: f13
    162 ; CHECK: r1:0 += rol(r3:2,#7)
    163 define i64 @f13(i64 %a0, i64 %a1) #0 {
    164 b0:
    165   %v0 = shl i64 %a1, 7
    166   %v1 = lshr i64 %a1, 57
    167   %v2 = or i64 %v0, %v1
    168   %v3 = add i64 %v2, %a0
    169   ret i64 %v3
    170 }
    171 
    172 ; CHECK-LABEL: f14
    173 ; CHECK: r1:0 -= rol(r3:2,#7)
    174 define i64 @f14(i64 %a0, i64 %a1) #0 {
    175 b0:
    176   %v0 = shl i64 %a1, 7
    177   %v1 = lshr i64 %a1, 57
    178   %v2 = or i64 %v0, %v1
    179   %v3 = sub i64 %a0, %v2
    180   ret i64 %v3
    181 }
    182 
    183 ; CHECK-LABEL: f15
    184 ; CHECK: r1:0 &= rol(r3:2,#7)
    185 define i64 @f15(i64 %a0, i64 %a1) #0 {
    186 b0:
    187   %v0 = shl i64 %a1, 7
    188   %v1 = lshr i64 %a1, 57
    189   %v2 = or i64 %v0, %v1
    190   %v3 = and i64 %v2, %a0
    191   ret i64 %v3
    192 }
    193 
    194 ; CHECK-LABEL: f17
    195 ; CHECK: r1:0 ^= rol(r3:2,#7)
    196 define i64 @f17(i64 %a0, i64 %a1) #0 {
    197 b0:
    198   %v0 = shl i64 %a1, 7
    199   %v1 = lshr i64 %a1, 57
    200   %v2 = or i64 %v0, %v1
    201   %v3 = xor i64 %v2, %a0
    202   ret i64 %v3
    203 }
    204 
    205 attributes #0 = { norecurse nounwind readnone "target-cpu"="hexagonv60" "target-features"="-packets" }
    206