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