1ff75a2beSPatryk Wychowaniec; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 2 2ff75a2beSPatryk Wychowaniec; RUN: llc < %s -mtriple=avr | FileCheck %s 3ff75a2beSPatryk Wychowaniec 4ff75a2beSPatryk Wychowaniecdefine i8 @rotl8_1(i8 %x) { 5ff75a2beSPatryk Wychowaniec; CHECK-LABEL: rotl8_1: 6ff75a2beSPatryk Wychowaniec; CHECK: ; %bb.0: ; %start 7ff75a2beSPatryk Wychowaniec; CHECK-NEXT: lsl r24 8ff75a2beSPatryk Wychowaniec; CHECK-NEXT: adc r24, r1 9ff75a2beSPatryk Wychowaniec; CHECK-NEXT: ret 10ff75a2beSPatryk Wychowaniecstart: 11ff75a2beSPatryk Wychowaniec %0 = call i8 @llvm.fshl.i8(i8 %x, i8 %x, i8 1) 12ff75a2beSPatryk Wychowaniec ret i8 %0 13ff75a2beSPatryk Wychowaniec} 14ff75a2beSPatryk Wychowaniec 15ff75a2beSPatryk Wychowaniecdefine i8 @rotl8_3(i8 %x) { 16ff75a2beSPatryk Wychowaniec; CHECK-LABEL: rotl8_3: 17ff75a2beSPatryk Wychowaniec; CHECK: ; %bb.0: ; %start 18*71d90f31SBen Shi; CHECK-NEXT: swap r24 19*71d90f31SBen Shi; CHECK-NEXT: bst r24, 0 20*71d90f31SBen Shi; CHECK-NEXT: ror r24 21*71d90f31SBen Shi; CHECK-NEXT: bld r24, 7 22ff75a2beSPatryk Wychowaniec; CHECK-NEXT: ret 23ff75a2beSPatryk Wychowaniecstart: 24ff75a2beSPatryk Wychowaniec %0 = call i8 @llvm.fshl.i8(i8 %x, i8 %x, i8 3) 25ff75a2beSPatryk Wychowaniec ret i8 %0 26ff75a2beSPatryk Wychowaniec} 27ff75a2beSPatryk Wychowaniec 28b1f0cb89SBen Shidefine i8 @rotl8_5(i8 %x) { 29b1f0cb89SBen Shi; CHECK-LABEL: rotl8_5: 30b1f0cb89SBen Shi; CHECK: ; %bb.0: ; %start 31e21df829SBen Shi; CHECK-NEXT: swap r24 32b1f0cb89SBen Shi; CHECK-NEXT: lsl r24 33b1f0cb89SBen Shi; CHECK-NEXT: adc r24, r1 34b1f0cb89SBen Shi; CHECK-NEXT: ret 35b1f0cb89SBen Shistart: 36b1f0cb89SBen Shi %0 = call i8 @llvm.fshl.i8(i8 %x, i8 %x, i8 5) 37b1f0cb89SBen Shi ret i8 %0 38b1f0cb89SBen Shi} 39b1f0cb89SBen Shi 40b1f0cb89SBen Shidefine i8 @rotl8_7(i8 %x) { 41b1f0cb89SBen Shi; CHECK-LABEL: rotl8_7: 42b1f0cb89SBen Shi; CHECK: ; %bb.0: ; %start 43e21df829SBen Shi; CHECK-NEXT: bst r24, 0 44e21df829SBen Shi; CHECK-NEXT: ror r24 45e21df829SBen Shi; CHECK-NEXT: bld r24, 7 46b1f0cb89SBen Shi; CHECK-NEXT: ret 47b1f0cb89SBen Shistart: 48b1f0cb89SBen Shi %0 = call i8 @llvm.fshl.i8(i8 %x, i8 %x, i8 7) 49b1f0cb89SBen Shi ret i8 %0 50b1f0cb89SBen Shi} 51b1f0cb89SBen Shi 52ff75a2beSPatryk Wychowaniecdefine i8 @rotl8_dyn(i8 %x, i8 %y) { 53ff75a2beSPatryk Wychowaniec; CHECK-LABEL: rotl8_dyn: 54ff75a2beSPatryk Wychowaniec; CHECK: ; %bb.0: ; %start 55ff75a2beSPatryk Wychowaniec; CHECK-NEXT: andi r22, 7 56ff75a2beSPatryk Wychowaniec; CHECK-NEXT: dec r22 57b1f0cb89SBen Shi; CHECK-NEXT: brmi .LBB4_2 58b1f0cb89SBen Shi; CHECK-NEXT: .LBB4_1: ; %start 59ff75a2beSPatryk Wychowaniec; CHECK-NEXT: ; =>This Inner Loop Header: Depth=1 60ff75a2beSPatryk Wychowaniec; CHECK-NEXT: lsl r24 61ff75a2beSPatryk Wychowaniec; CHECK-NEXT: adc r24, r1 62ff75a2beSPatryk Wychowaniec; CHECK-NEXT: dec r22 63b1f0cb89SBen Shi; CHECK-NEXT: brpl .LBB4_1 64b1f0cb89SBen Shi; CHECK-NEXT: .LBB4_2: ; %start 65ff75a2beSPatryk Wychowaniec; CHECK-NEXT: ret 66ff75a2beSPatryk Wychowaniecstart: 67ff75a2beSPatryk Wychowaniec %0 = call i8 @llvm.fshl.i8(i8 %x, i8 %x, i8 %y) 68ff75a2beSPatryk Wychowaniec ret i8 %0 69ff75a2beSPatryk Wychowaniec} 70ff75a2beSPatryk Wychowaniec 71ff75a2beSPatryk Wychowaniecdefine i8 @rotr8_1(i8 %x) { 72ff75a2beSPatryk Wychowaniec; CHECK-LABEL: rotr8_1: 73ff75a2beSPatryk Wychowaniec; CHECK: ; %bb.0: ; %start 74ff75a2beSPatryk Wychowaniec; CHECK-NEXT: bst r24, 0 75ff75a2beSPatryk Wychowaniec; CHECK-NEXT: ror r24 76ff75a2beSPatryk Wychowaniec; CHECK-NEXT: bld r24, 7 77ff75a2beSPatryk Wychowaniec; CHECK-NEXT: ret 78ff75a2beSPatryk Wychowaniecstart: 79ff75a2beSPatryk Wychowaniec %0 = call i8 @llvm.fshr.i8(i8 %x, i8 %x, i8 1) 80ff75a2beSPatryk Wychowaniec ret i8 %0 81ff75a2beSPatryk Wychowaniec} 82ff75a2beSPatryk Wychowaniec 83ff75a2beSPatryk Wychowaniecdefine i8 @rotr8_3(i8 %x) { 84ff75a2beSPatryk Wychowaniec; CHECK-LABEL: rotr8_3: 85ff75a2beSPatryk Wychowaniec; CHECK: ; %bb.0: ; %start 86*71d90f31SBen Shi; CHECK-NEXT: swap r24 87*71d90f31SBen Shi; CHECK-NEXT: lsl r24 88*71d90f31SBen Shi; CHECK-NEXT: adc r24, r1 89ff75a2beSPatryk Wychowaniec; CHECK-NEXT: ret 90ff75a2beSPatryk Wychowaniecstart: 91ff75a2beSPatryk Wychowaniec %0 = call i8 @llvm.fshr.i8(i8 %x, i8 %x, i8 3) 92ff75a2beSPatryk Wychowaniec ret i8 %0 93ff75a2beSPatryk Wychowaniec} 94ff75a2beSPatryk Wychowaniec 95b1f0cb89SBen Shidefine i8 @rotr8_5(i8 %x) { 96b1f0cb89SBen Shi; CHECK-LABEL: rotr8_5: 97b1f0cb89SBen Shi; CHECK: ; %bb.0: ; %start 98e21df829SBen Shi; CHECK-NEXT: swap r24 99b1f0cb89SBen Shi; CHECK-NEXT: bst r24, 0 100b1f0cb89SBen Shi; CHECK-NEXT: ror r24 101b1f0cb89SBen Shi; CHECK-NEXT: bld r24, 7 102b1f0cb89SBen Shi; CHECK-NEXT: ret 103b1f0cb89SBen Shistart: 104b1f0cb89SBen Shi %0 = call i8 @llvm.fshr.i8(i8 %x, i8 %x, i8 5) 105b1f0cb89SBen Shi ret i8 %0 106b1f0cb89SBen Shi} 107b1f0cb89SBen Shi 108b1f0cb89SBen Shidefine i8 @rotr8_7(i8 %x) { 109b1f0cb89SBen Shi; CHECK-LABEL: rotr8_7: 110b1f0cb89SBen Shi; CHECK: ; %bb.0: ; %start 111e21df829SBen Shi; CHECK-NEXT: lsl r24 112e21df829SBen Shi; CHECK-NEXT: adc r24, r1 113b1f0cb89SBen Shi; CHECK-NEXT: ret 114b1f0cb89SBen Shistart: 115b1f0cb89SBen Shi %0 = call i8 @llvm.fshr.i8(i8 %x, i8 %x, i8 7) 116b1f0cb89SBen Shi ret i8 %0 117b1f0cb89SBen Shi} 118b1f0cb89SBen Shi 119ff75a2beSPatryk Wychowaniecdefine i8 @rotr8_dyn(i8 %x, i8 %y) { 120ff75a2beSPatryk Wychowaniec; CHECK-LABEL: rotr8_dyn: 121ff75a2beSPatryk Wychowaniec; CHECK: ; %bb.0: ; %start 122ff75a2beSPatryk Wychowaniec; CHECK-NEXT: andi r22, 7 123ff75a2beSPatryk Wychowaniec; CHECK-NEXT: dec r22 124b1f0cb89SBen Shi; CHECK-NEXT: brmi .LBB9_2 125b1f0cb89SBen Shi; CHECK-NEXT: .LBB9_1: ; %start 126ff75a2beSPatryk Wychowaniec; CHECK-NEXT: ; =>This Inner Loop Header: Depth=1 127ff75a2beSPatryk Wychowaniec; CHECK-NEXT: bst r24, 0 128ff75a2beSPatryk Wychowaniec; CHECK-NEXT: ror r24 129ff75a2beSPatryk Wychowaniec; CHECK-NEXT: bld r24, 7 130ff75a2beSPatryk Wychowaniec; CHECK-NEXT: dec r22 131b1f0cb89SBen Shi; CHECK-NEXT: brpl .LBB9_1 132b1f0cb89SBen Shi; CHECK-NEXT: .LBB9_2: ; %start 133ff75a2beSPatryk Wychowaniec; CHECK-NEXT: ret 134ff75a2beSPatryk Wychowaniecstart: 135ff75a2beSPatryk Wychowaniec %0 = call i8 @llvm.fshr.i8(i8 %x, i8 %x, i8 %y) 136ff75a2beSPatryk Wychowaniec ret i8 %0 137ff75a2beSPatryk Wychowaniec} 138ff75a2beSPatryk Wychowaniec 139ff75a2beSPatryk Wychowaniecdefine i16 @rotl16(i16 %x) { 140ff75a2beSPatryk Wychowaniec; CHECK-LABEL: rotl16: 141ff75a2beSPatryk Wychowaniec; CHECK: ; %bb.0: ; %start 142ff75a2beSPatryk Wychowaniec; CHECK-NEXT: mov r18, r24 143ff75a2beSPatryk Wychowaniec; CHECK-NEXT: mov r19, r25 144ff75a2beSPatryk Wychowaniec; CHECK-NEXT: lsl r18 145ff75a2beSPatryk Wychowaniec; CHECK-NEXT: rol r19 146ff75a2beSPatryk Wychowaniec; CHECK-NEXT: lsl r18 147ff75a2beSPatryk Wychowaniec; CHECK-NEXT: rol r19 148ff75a2beSPatryk Wychowaniec; CHECK-NEXT: mov r24, r25 149ff75a2beSPatryk Wychowaniec; CHECK-NEXT: swap r24 150ff75a2beSPatryk Wychowaniec; CHECK-NEXT: andi r24, 15 151ff75a2beSPatryk Wychowaniec; CHECK-NEXT: clr r25 152ff75a2beSPatryk Wychowaniec; CHECK-NEXT: lsr r24 153ff75a2beSPatryk Wychowaniec; CHECK-NEXT: lsr r24 154ff75a2beSPatryk Wychowaniec; CHECK-NEXT: or r24, r18 155ff75a2beSPatryk Wychowaniec; CHECK-NEXT: or r25, r19 156ff75a2beSPatryk Wychowaniec; CHECK-NEXT: ret 157ff75a2beSPatryk Wychowaniecstart: 158ff75a2beSPatryk Wychowaniec %0 = call i16 @llvm.fshl.i16(i16 %x, i16 %x, i16 2) 159ff75a2beSPatryk Wychowaniec ret i16 %0 160ff75a2beSPatryk Wychowaniec} 161ff75a2beSPatryk Wychowaniec 162ff75a2beSPatryk Wychowaniecdefine i16 @rotr16(i16 %x) { 163ff75a2beSPatryk Wychowaniec; CHECK-LABEL: rotr16: 164ff75a2beSPatryk Wychowaniec; CHECK: ; %bb.0: ; %start 165ff75a2beSPatryk Wychowaniec; CHECK-NEXT: mov r18, r24 166ff75a2beSPatryk Wychowaniec; CHECK-NEXT: mov r19, r25 167ff75a2beSPatryk Wychowaniec; CHECK-NEXT: lsr r19 168ff75a2beSPatryk Wychowaniec; CHECK-NEXT: ror r18 169ff75a2beSPatryk Wychowaniec; CHECK-NEXT: lsr r19 170ff75a2beSPatryk Wychowaniec; CHECK-NEXT: ror r18 171ff75a2beSPatryk Wychowaniec; CHECK-NEXT: mov r25, r24 172ff75a2beSPatryk Wychowaniec; CHECK-NEXT: swap r25 173ff75a2beSPatryk Wychowaniec; CHECK-NEXT: andi r25, 240 174ff75a2beSPatryk Wychowaniec; CHECK-NEXT: clr r24 175ff75a2beSPatryk Wychowaniec; CHECK-NEXT: lsl r25 176ff75a2beSPatryk Wychowaniec; CHECK-NEXT: lsl r25 177ff75a2beSPatryk Wychowaniec; CHECK-NEXT: or r24, r18 178ff75a2beSPatryk Wychowaniec; CHECK-NEXT: or r25, r19 179ff75a2beSPatryk Wychowaniec; CHECK-NEXT: ret 180ff75a2beSPatryk Wychowaniecstart: 181ff75a2beSPatryk Wychowaniec %0 = call i16 @llvm.fshr.i16(i16 %x, i16 %x, i16 2) 182ff75a2beSPatryk Wychowaniec ret i16 %0 183ff75a2beSPatryk Wychowaniec} 184ff75a2beSPatryk Wychowaniec 185ff75a2beSPatryk Wychowaniecdefine i32 @rotl32(i32 %x) { 186ff75a2beSPatryk Wychowaniec; CHECK-LABEL: rotl32: 187ff75a2beSPatryk Wychowaniec; CHECK: ; %bb.0: ; %start 188ff75a2beSPatryk Wychowaniec; CHECK-NEXT: mov r20, r22 189ff75a2beSPatryk Wychowaniec; CHECK-NEXT: mov r21, r23 190ff75a2beSPatryk Wychowaniec; CHECK-NEXT: lsl r20 191ff75a2beSPatryk Wychowaniec; CHECK-NEXT: rol r21 192ff75a2beSPatryk Wychowaniec; CHECK-NEXT: lsl r20 193ff75a2beSPatryk Wychowaniec; CHECK-NEXT: rol r21 194ff75a2beSPatryk Wychowaniec; CHECK-NEXT: mov r18, r24 195ff75a2beSPatryk Wychowaniec; CHECK-NEXT: mov r19, r25 196ff75a2beSPatryk Wychowaniec; CHECK-NEXT: mov r18, r19 197ff75a2beSPatryk Wychowaniec; CHECK-NEXT: swap r18 198ff75a2beSPatryk Wychowaniec; CHECK-NEXT: andi r18, 15 199ff75a2beSPatryk Wychowaniec; CHECK-NEXT: clr r19 200ff75a2beSPatryk Wychowaniec; CHECK-NEXT: lsr r18 201ff75a2beSPatryk Wychowaniec; CHECK-NEXT: lsr r18 202ff75a2beSPatryk Wychowaniec; CHECK-NEXT: or r18, r20 203ff75a2beSPatryk Wychowaniec; CHECK-NEXT: or r19, r21 204ff75a2beSPatryk Wychowaniec; CHECK-NEXT: lsl r24 205ff75a2beSPatryk Wychowaniec; CHECK-NEXT: rol r25 206ff75a2beSPatryk Wychowaniec; CHECK-NEXT: lsl r24 207ff75a2beSPatryk Wychowaniec; CHECK-NEXT: rol r25 208ff75a2beSPatryk Wychowaniec; CHECK-NEXT: mov r22, r23 209ff75a2beSPatryk Wychowaniec; CHECK-NEXT: swap r22 210ff75a2beSPatryk Wychowaniec; CHECK-NEXT: andi r22, 15 211ff75a2beSPatryk Wychowaniec; CHECK-NEXT: clr r23 212ff75a2beSPatryk Wychowaniec; CHECK-NEXT: lsr r22 213ff75a2beSPatryk Wychowaniec; CHECK-NEXT: lsr r22 214ff75a2beSPatryk Wychowaniec; CHECK-NEXT: or r24, r22 215ff75a2beSPatryk Wychowaniec; CHECK-NEXT: or r25, r23 216ff75a2beSPatryk Wychowaniec; CHECK-NEXT: mov r22, r18 217ff75a2beSPatryk Wychowaniec; CHECK-NEXT: mov r23, r19 218ff75a2beSPatryk Wychowaniec; CHECK-NEXT: ret 219ff75a2beSPatryk Wychowaniecstart: 220ff75a2beSPatryk Wychowaniec %0 = call i32 @llvm.fshl.i32(i32 %x, i32 %x, i32 2) 221ff75a2beSPatryk Wychowaniec ret i32 %0 222ff75a2beSPatryk Wychowaniec} 223ff75a2beSPatryk Wychowaniec 224ff75a2beSPatryk Wychowaniecdefine i32 @rotr32(i32 %x) { 225ff75a2beSPatryk Wychowaniec; CHECK-LABEL: rotr32: 226ff75a2beSPatryk Wychowaniec; CHECK: ; %bb.0: ; %start 227ff75a2beSPatryk Wychowaniec; CHECK-NEXT: mov r20, r22 228ff75a2beSPatryk Wychowaniec; CHECK-NEXT: mov r21, r23 229ff75a2beSPatryk Wychowaniec; CHECK-NEXT: lsr r21 230ff75a2beSPatryk Wychowaniec; CHECK-NEXT: ror r20 231ff75a2beSPatryk Wychowaniec; CHECK-NEXT: lsr r21 232ff75a2beSPatryk Wychowaniec; CHECK-NEXT: ror r20 233ff75a2beSPatryk Wychowaniec; CHECK-NEXT: mov r18, r24 234ff75a2beSPatryk Wychowaniec; CHECK-NEXT: mov r19, r25 235ff75a2beSPatryk Wychowaniec; CHECK-NEXT: mov r19, r18 236ff75a2beSPatryk Wychowaniec; CHECK-NEXT: swap r19 237ff75a2beSPatryk Wychowaniec; CHECK-NEXT: andi r19, 240 238ff75a2beSPatryk Wychowaniec; CHECK-NEXT: clr r18 239ff75a2beSPatryk Wychowaniec; CHECK-NEXT: lsl r19 240ff75a2beSPatryk Wychowaniec; CHECK-NEXT: lsl r19 241ff75a2beSPatryk Wychowaniec; CHECK-NEXT: or r18, r20 242ff75a2beSPatryk Wychowaniec; CHECK-NEXT: or r19, r21 243ff75a2beSPatryk Wychowaniec; CHECK-NEXT: lsr r25 244ff75a2beSPatryk Wychowaniec; CHECK-NEXT: ror r24 245ff75a2beSPatryk Wychowaniec; CHECK-NEXT: lsr r25 246ff75a2beSPatryk Wychowaniec; CHECK-NEXT: ror r24 247ff75a2beSPatryk Wychowaniec; CHECK-NEXT: mov r23, r22 248ff75a2beSPatryk Wychowaniec; CHECK-NEXT: swap r23 249ff75a2beSPatryk Wychowaniec; CHECK-NEXT: andi r23, 240 250ff75a2beSPatryk Wychowaniec; CHECK-NEXT: clr r22 251ff75a2beSPatryk Wychowaniec; CHECK-NEXT: lsl r23 252ff75a2beSPatryk Wychowaniec; CHECK-NEXT: lsl r23 253ff75a2beSPatryk Wychowaniec; CHECK-NEXT: or r24, r22 254ff75a2beSPatryk Wychowaniec; CHECK-NEXT: or r25, r23 255ff75a2beSPatryk Wychowaniec; CHECK-NEXT: mov r22, r18 256ff75a2beSPatryk Wychowaniec; CHECK-NEXT: mov r23, r19 257ff75a2beSPatryk Wychowaniec; CHECK-NEXT: ret 258ff75a2beSPatryk Wychowaniecstart: 259ff75a2beSPatryk Wychowaniec %0 = call i32 @llvm.fshr.i32(i32 %x, i32 %x, i32 2) 260ff75a2beSPatryk Wychowaniec ret i32 %0 261ff75a2beSPatryk Wychowaniec} 262ff75a2beSPatryk Wychowaniec 263ff75a2beSPatryk Wychowaniecdeclare i8 @llvm.fshl.i8(i8, i8, i8) 264ff75a2beSPatryk Wychowaniecdeclare i8 @llvm.fshr.i8(i8, i8, i8) 265ff75a2beSPatryk Wychowaniec 266ff75a2beSPatryk Wychowaniecdeclare i16 @llvm.fshl.i16(i16, i16, i16) 267ff75a2beSPatryk Wychowaniecdeclare i16 @llvm.fshr.i16(i16, i16, i16) 268ff75a2beSPatryk Wychowaniec 269ff75a2beSPatryk Wychowaniecdeclare i32 @llvm.fshl.i32(i32, i32, i32) 270ff75a2beSPatryk Wychowaniecdeclare i32 @llvm.fshr.i32(i32, i32, i32) 271