1840d10a1SAyke van Laethem; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2840d10a1SAyke van Laethem; RUN: llc < %s -mtriple=avr -mattr=movw -verify-machineinstrs | FileCheck %s 3840d10a1SAyke van Laethem 4840d10a1SAyke van Laethemdefine i32 @shl_i32_1(i32 %a) { 5840d10a1SAyke van Laethem; CHECK-LABEL: shl_i32_1: 6840d10a1SAyke van Laethem; CHECK: ; %bb.0: 7840d10a1SAyke van Laethem; CHECK-NEXT: lsl r22 8840d10a1SAyke van Laethem; CHECK-NEXT: rol r23 9840d10a1SAyke van Laethem; CHECK-NEXT: rol r24 10840d10a1SAyke van Laethem; CHECK-NEXT: rol r25 11840d10a1SAyke van Laethem; CHECK-NEXT: ret 12840d10a1SAyke van Laethem %res = shl i32 %a, 1 13840d10a1SAyke van Laethem ret i32 %res 14840d10a1SAyke van Laethem} 15840d10a1SAyke van Laethem 16840d10a1SAyke van Laethemdefine i32 @shl_i32_2(i32 %a) { 17840d10a1SAyke van Laethem; CHECK-LABEL: shl_i32_2: 18840d10a1SAyke van Laethem; CHECK: ; %bb.0: 19840d10a1SAyke van Laethem; CHECK-NEXT: lsl r22 20840d10a1SAyke van Laethem; CHECK-NEXT: rol r23 21840d10a1SAyke van Laethem; CHECK-NEXT: rol r24 22840d10a1SAyke van Laethem; CHECK-NEXT: rol r25 23840d10a1SAyke van Laethem; CHECK-NEXT: lsl r22 24840d10a1SAyke van Laethem; CHECK-NEXT: rol r23 25840d10a1SAyke van Laethem; CHECK-NEXT: rol r24 26840d10a1SAyke van Laethem; CHECK-NEXT: rol r25 27840d10a1SAyke van Laethem; CHECK-NEXT: ret 28840d10a1SAyke van Laethem %res = shl i32 %a, 2 29840d10a1SAyke van Laethem ret i32 %res 30840d10a1SAyke van Laethem} 31840d10a1SAyke van Laethem 3281f5f22fSAyke van Laethemdefine i32 @shl_i32_4(i32 %a) { 3381f5f22fSAyke van Laethem; CHECK-LABEL: shl_i32_4: 3481f5f22fSAyke van Laethem; CHECK: ; %bb.0: 3581f5f22fSAyke van Laethem; CHECK-NEXT: swap r25 3681f5f22fSAyke van Laethem; CHECK-NEXT: andi r25, 240 3781f5f22fSAyke van Laethem; CHECK-NEXT: swap r24 3881f5f22fSAyke van Laethem; CHECK-NEXT: eor r25, r24 3981f5f22fSAyke van Laethem; CHECK-NEXT: andi r24, 240 4081f5f22fSAyke van Laethem; CHECK-NEXT: eor r25, r24 4181f5f22fSAyke van Laethem; CHECK-NEXT: swap r23 4281f5f22fSAyke van Laethem; CHECK-NEXT: eor r24, r23 4381f5f22fSAyke van Laethem; CHECK-NEXT: andi r23, 240 4481f5f22fSAyke van Laethem; CHECK-NEXT: eor r24, r23 4581f5f22fSAyke van Laethem; CHECK-NEXT: swap r22 4681f5f22fSAyke van Laethem; CHECK-NEXT: eor r23, r22 4781f5f22fSAyke van Laethem; CHECK-NEXT: andi r22, 240 4881f5f22fSAyke van Laethem; CHECK-NEXT: eor r23, r22 4981f5f22fSAyke van Laethem; CHECK-NEXT: ret 5081f5f22fSAyke van Laethem %res = shl i32 %a, 4 5181f5f22fSAyke van Laethem ret i32 %res 5281f5f22fSAyke van Laethem} 5381f5f22fSAyke van Laethem 5481f5f22fSAyke van Laethem; shift four bits and then shift one bit 5581f5f22fSAyke van Laethemdefine i32 @shl_i32_5(i32 %a) { 5681f5f22fSAyke van Laethem; CHECK-LABEL: shl_i32_5: 5781f5f22fSAyke van Laethem; CHECK: ; %bb.0: 5881f5f22fSAyke van Laethem; CHECK-NEXT: swap r25 5981f5f22fSAyke van Laethem; CHECK-NEXT: andi r25, 240 6081f5f22fSAyke van Laethem; CHECK-NEXT: swap r24 6181f5f22fSAyke van Laethem; CHECK-NEXT: eor r25, r24 6281f5f22fSAyke van Laethem; CHECK-NEXT: andi r24, 240 6381f5f22fSAyke van Laethem; CHECK-NEXT: eor r25, r24 6481f5f22fSAyke van Laethem; CHECK-NEXT: swap r23 6581f5f22fSAyke van Laethem; CHECK-NEXT: eor r24, r23 6681f5f22fSAyke van Laethem; CHECK-NEXT: andi r23, 240 6781f5f22fSAyke van Laethem; CHECK-NEXT: eor r24, r23 6881f5f22fSAyke van Laethem; CHECK-NEXT: swap r22 6981f5f22fSAyke van Laethem; CHECK-NEXT: eor r23, r22 7081f5f22fSAyke van Laethem; CHECK-NEXT: andi r22, 240 7181f5f22fSAyke van Laethem; CHECK-NEXT: eor r23, r22 7281f5f22fSAyke van Laethem; CHECK-NEXT: lsl r22 7381f5f22fSAyke van Laethem; CHECK-NEXT: rol r23 7481f5f22fSAyke van Laethem; CHECK-NEXT: rol r24 7581f5f22fSAyke van Laethem; CHECK-NEXT: rol r25 7681f5f22fSAyke van Laethem; CHECK-NEXT: ret 7781f5f22fSAyke van Laethem %res = shl i32 %a, 5 7881f5f22fSAyke van Laethem ret i32 %res 7981f5f22fSAyke van Laethem} 8081f5f22fSAyke van Laethem 81fad5e0cfSAyke van Laethem; shift two to the right and move the registers around 82fad5e0cfSAyke van Laethemdefine i32 @shl_i32_6(i32 %a) { 83fad5e0cfSAyke van Laethem; CHECK-LABEL: shl_i32_6: 84fad5e0cfSAyke van Laethem; CHECK: ; %bb.0: 85fad5e0cfSAyke van Laethem; CHECK-NEXT: lsr r25 86fad5e0cfSAyke van Laethem; CHECK-NEXT: ror r24 87fad5e0cfSAyke van Laethem; CHECK-NEXT: ror r23 88fad5e0cfSAyke van Laethem; CHECK-NEXT: ror r22 89fad5e0cfSAyke van Laethem; CHECK-NEXT: mov r18, r1 90fad5e0cfSAyke van Laethem; CHECK-NEXT: ror r18 91fad5e0cfSAyke van Laethem; CHECK-NEXT: lsr r25 92fad5e0cfSAyke van Laethem; CHECK-NEXT: ror r24 93fad5e0cfSAyke van Laethem; CHECK-NEXT: ror r23 94fad5e0cfSAyke van Laethem; CHECK-NEXT: ror r22 95fad5e0cfSAyke van Laethem; CHECK-NEXT: ror r18 96fad5e0cfSAyke van Laethem; CHECK-NEXT: mov r25, r24 97fad5e0cfSAyke van Laethem; CHECK-NEXT: mov r24, r23 98fad5e0cfSAyke van Laethem; CHECK-NEXT: mov r19, r22 99fad5e0cfSAyke van Laethem; CHECK-NEXT: movw r22, r18 100fad5e0cfSAyke van Laethem; CHECK-NEXT: ret 101fad5e0cfSAyke van Laethem %res = shl i32 %a, 6 102fad5e0cfSAyke van Laethem ret i32 %res 103fad5e0cfSAyke van Laethem} 104fad5e0cfSAyke van Laethem 105fad5e0cfSAyke van Laethem 106fad5e0cfSAyke van Laethem; shift one to the right and move registers around 107fad5e0cfSAyke van Laethemdefine i32 @shl_i32_7(i32 %a) { 108fad5e0cfSAyke van Laethem; CHECK-LABEL: shl_i32_7: 109fad5e0cfSAyke van Laethem; CHECK: ; %bb.0: 110fad5e0cfSAyke van Laethem; CHECK-NEXT: lsr r25 111fad5e0cfSAyke van Laethem; CHECK-NEXT: ror r24 112fad5e0cfSAyke van Laethem; CHECK-NEXT: ror r23 113fad5e0cfSAyke van Laethem; CHECK-NEXT: ror r22 114fad5e0cfSAyke van Laethem; CHECK-NEXT: mov r18, r1 115fad5e0cfSAyke van Laethem; CHECK-NEXT: ror r18 116fad5e0cfSAyke van Laethem; CHECK-NEXT: mov r25, r24 117fad5e0cfSAyke van Laethem; CHECK-NEXT: mov r24, r23 118fad5e0cfSAyke van Laethem; CHECK-NEXT: mov r19, r22 119fad5e0cfSAyke van Laethem; CHECK-NEXT: movw r22, r18 120fad5e0cfSAyke van Laethem; CHECK-NEXT: ret 121fad5e0cfSAyke van Laethem %res = shl i32 %a, 7 122fad5e0cfSAyke van Laethem ret i32 %res 123fad5e0cfSAyke van Laethem} 124fad5e0cfSAyke van Laethem 1258f8afabdSAyke van Laethemdefine i32 @shl_i32_8(i32 %a) { 1268f8afabdSAyke van Laethem; CHECK-LABEL: shl_i32_8: 1278f8afabdSAyke van Laethem; CHECK: ; %bb.0: 1288f8afabdSAyke van Laethem; CHECK-NEXT: mov r25, r24 1298f8afabdSAyke van Laethem; CHECK-NEXT: mov r24, r23 1308f8afabdSAyke van Laethem; CHECK-NEXT: mov r23, r22 1318f8afabdSAyke van Laethem; CHECK-NEXT: mov r22, r1 1328f8afabdSAyke van Laethem; CHECK-NEXT: ret 1338f8afabdSAyke van Laethem %res = shl i32 %a, 8 1348f8afabdSAyke van Laethem ret i32 %res 1358f8afabdSAyke van Laethem} 1368f8afabdSAyke van Laethem 1378f8afabdSAyke van Laethemdefine i32 @shl_i32_9(i32 %a) { 1388f8afabdSAyke van Laethem; CHECK-LABEL: shl_i32_9: 1398f8afabdSAyke van Laethem; CHECK: ; %bb.0: 1408f8afabdSAyke van Laethem; CHECK-NEXT: lsl r22 1418f8afabdSAyke van Laethem; CHECK-NEXT: rol r23 1428f8afabdSAyke van Laethem; CHECK-NEXT: rol r24 1438f8afabdSAyke van Laethem; CHECK-NEXT: mov r25, r24 1448f8afabdSAyke van Laethem; CHECK-NEXT: mov r24, r23 1458f8afabdSAyke van Laethem; CHECK-NEXT: mov r23, r22 1468f8afabdSAyke van Laethem; CHECK-NEXT: mov r22, r1 1478f8afabdSAyke van Laethem; CHECK-NEXT: ret 1488f8afabdSAyke van Laethem %res = shl i32 %a, 9 1498f8afabdSAyke van Laethem ret i32 %res 1508f8afabdSAyke van Laethem} 1518f8afabdSAyke van Laethem 15281f5f22fSAyke van Laethem; shift 3 of 4 registers and move the others around 15381f5f22fSAyke van Laethemdefine i32 @shl_i32_12(i32 %a) { 15481f5f22fSAyke van Laethem; CHECK-LABEL: shl_i32_12: 15581f5f22fSAyke van Laethem; CHECK: ; %bb.0: 15681f5f22fSAyke van Laethem; CHECK-NEXT: swap r24 15781f5f22fSAyke van Laethem; CHECK-NEXT: andi r24, 240 15881f5f22fSAyke van Laethem; CHECK-NEXT: swap r23 15981f5f22fSAyke van Laethem; CHECK-NEXT: eor r24, r23 16081f5f22fSAyke van Laethem; CHECK-NEXT: andi r23, 240 16181f5f22fSAyke van Laethem; CHECK-NEXT: eor r24, r23 16281f5f22fSAyke van Laethem; CHECK-NEXT: swap r22 16381f5f22fSAyke van Laethem; CHECK-NEXT: eor r23, r22 16481f5f22fSAyke van Laethem; CHECK-NEXT: andi r22, 240 16581f5f22fSAyke van Laethem; CHECK-NEXT: eor r23, r22 16681f5f22fSAyke van Laethem; CHECK-NEXT: mov r25, r24 16781f5f22fSAyke van Laethem; CHECK-NEXT: mov r24, r23 16881f5f22fSAyke van Laethem; CHECK-NEXT: mov r23, r22 16981f5f22fSAyke van Laethem; CHECK-NEXT: mov r22, r1 17081f5f22fSAyke van Laethem; CHECK-NEXT: ret 17181f5f22fSAyke van Laethem %res = shl i32 %a, 12 17281f5f22fSAyke van Laethem ret i32 %res 17381f5f22fSAyke van Laethem} 17481f5f22fSAyke van Laethem 175fad5e0cfSAyke van Laethemdefine i32 @shl_i32_15(i32 %a) { 176fad5e0cfSAyke van Laethem; CHECK-LABEL: shl_i32_15: 177fad5e0cfSAyke van Laethem; CHECK: ; %bb.0: 178fad5e0cfSAyke van Laethem; CHECK-NEXT: movw r18, r22 179fad5e0cfSAyke van Laethem; CHECK-NEXT: lsr r24 180fad5e0cfSAyke van Laethem; CHECK-NEXT: ror r19 181fad5e0cfSAyke van Laethem; CHECK-NEXT: ror r18 182fad5e0cfSAyke van Laethem; CHECK-NEXT: mov r23, r1 183fad5e0cfSAyke van Laethem; CHECK-NEXT: ror r23 184fad5e0cfSAyke van Laethem; CHECK-NEXT: mov r22, r1 185fad5e0cfSAyke van Laethem; CHECK-NEXT: movw r24, r18 186fad5e0cfSAyke van Laethem; CHECK-NEXT: ret 187fad5e0cfSAyke van Laethem %res = shl i32 %a, 15 188fad5e0cfSAyke van Laethem ret i32 %res 189fad5e0cfSAyke van Laethem} 190fad5e0cfSAyke van Laethem 191840d10a1SAyke van Laethem; This is a special case: this shift is performed directly inside SelectionDAG 192840d10a1SAyke van Laethem; instead of as a custom lowering like the other shift operations. 193840d10a1SAyke van Laethemdefine i32 @shl_i32_16(i32 %a) { 194840d10a1SAyke van Laethem; CHECK-LABEL: shl_i32_16: 195840d10a1SAyke van Laethem; CHECK: ; %bb.0: 196840d10a1SAyke van Laethem; CHECK-NEXT: movw r24, r22 197840d10a1SAyke van Laethem; CHECK-NEXT: ldi r22, 0 198840d10a1SAyke van Laethem; CHECK-NEXT: ldi r23, 0 199840d10a1SAyke van Laethem; CHECK-NEXT: ret 200840d10a1SAyke van Laethem %res = shl i32 %a, 16 201840d10a1SAyke van Laethem ret i32 %res 202840d10a1SAyke van Laethem} 203840d10a1SAyke van Laethem 204840d10a1SAyke van Laethem; Combined with the register allocator, shift instructions can sometimes be 205840d10a1SAyke van Laethem; optimized away entirely. The least significant registers are simply stored 206840d10a1SAyke van Laethem; directly instead of moving them first. 207840d10a1SAyke van Laethemdefine void @shl_i32_16_ptr(i32 %a, ptr %ptr) { 208840d10a1SAyke van Laethem; CHECK-LABEL: shl_i32_16_ptr: 209840d10a1SAyke van Laethem; CHECK: ; %bb.0: 210840d10a1SAyke van Laethem; CHECK-NEXT: movw r30, r20 211840d10a1SAyke van Laethem; CHECK-NEXT: std Z+3, r23 212*2a528760SBen Shi; CHECK-NEXT: std Z+2, r22 213840d10a1SAyke van Laethem; CHECK-NEXT: ldi r24, 0 214840d10a1SAyke van Laethem; CHECK-NEXT: ldi r25, 0 215840d10a1SAyke van Laethem; CHECK-NEXT: std Z+1, r25 216*2a528760SBen Shi; CHECK-NEXT: st Z, r24 217840d10a1SAyke van Laethem; CHECK-NEXT: ret 218840d10a1SAyke van Laethem %res = shl i32 %a, 16 219840d10a1SAyke van Laethem store i32 %res, ptr %ptr 220840d10a1SAyke van Laethem ret void 221840d10a1SAyke van Laethem} 222840d10a1SAyke van Laethem 22381f5f22fSAyke van Laethem; shift only the most significant byte and then move it 22481f5f22fSAyke van Laethemdefine i32 @shl_i32_28(i32 %a) { 22581f5f22fSAyke van Laethem; CHECK-LABEL: shl_i32_28: 22681f5f22fSAyke van Laethem; CHECK: ; %bb.0: 22781f5f22fSAyke van Laethem; CHECK-NEXT: swap r22 22881f5f22fSAyke van Laethem; CHECK-NEXT: andi r22, 240 22981f5f22fSAyke van Laethem; CHECK-NEXT: mov r25, r22 23081f5f22fSAyke van Laethem; CHECK-NEXT: mov r24, r1 23181f5f22fSAyke van Laethem; CHECK-NEXT: mov r23, r1 23281f5f22fSAyke van Laethem; CHECK-NEXT: mov r22, r1 23381f5f22fSAyke van Laethem; CHECK-NEXT: ret 23481f5f22fSAyke van Laethem %res = shl i32 %a, 28 23581f5f22fSAyke van Laethem ret i32 %res 23681f5f22fSAyke van Laethem} 23781f5f22fSAyke van Laethem 238fad5e0cfSAyke van Laethem; move the rightmost bit to the leftmost bit and clear the rest 239fad5e0cfSAyke van Laethemdefine i32 @shl_i32_31(i32 %a) { 240fad5e0cfSAyke van Laethem; CHECK-LABEL: shl_i32_31: 241fad5e0cfSAyke van Laethem; CHECK: ; %bb.0: 242fad5e0cfSAyke van Laethem; CHECK-NEXT: lsr r22 243fad5e0cfSAyke van Laethem; CHECK-NEXT: mov r25, r1 244fad5e0cfSAyke van Laethem; CHECK-NEXT: ror r25 245fad5e0cfSAyke van Laethem; CHECK-NEXT: mov r24, r1 246fad5e0cfSAyke van Laethem; CHECK-NEXT: mov r23, r1 247fad5e0cfSAyke van Laethem; CHECK-NEXT: mov r22, r1 248fad5e0cfSAyke van Laethem; CHECK-NEXT: ret 249fad5e0cfSAyke van Laethem %res = shl i32 %a, 31 250fad5e0cfSAyke van Laethem ret i32 %res 251fad5e0cfSAyke van Laethem} 252fad5e0cfSAyke van Laethem 253840d10a1SAyke van Laethemdefine i32 @lshr_i32_1(i32 %a) { 254840d10a1SAyke van Laethem; CHECK-LABEL: lshr_i32_1: 255840d10a1SAyke van Laethem; CHECK: ; %bb.0: 256840d10a1SAyke van Laethem; CHECK-NEXT: lsr r25 257840d10a1SAyke van Laethem; CHECK-NEXT: ror r24 258840d10a1SAyke van Laethem; CHECK-NEXT: ror r23 259840d10a1SAyke van Laethem; CHECK-NEXT: ror r22 260840d10a1SAyke van Laethem; CHECK-NEXT: ret 261840d10a1SAyke van Laethem %res = lshr i32 %a, 1 262840d10a1SAyke van Laethem ret i32 %res 263840d10a1SAyke van Laethem} 264840d10a1SAyke van Laethem 265840d10a1SAyke van Laethemdefine i32 @lshr_i32_2(i32 %a) { 266840d10a1SAyke van Laethem; CHECK-LABEL: lshr_i32_2: 267840d10a1SAyke van Laethem; CHECK: ; %bb.0: 268840d10a1SAyke van Laethem; CHECK-NEXT: lsr r25 269840d10a1SAyke van Laethem; CHECK-NEXT: ror r24 270840d10a1SAyke van Laethem; CHECK-NEXT: ror r23 271840d10a1SAyke van Laethem; CHECK-NEXT: ror r22 272840d10a1SAyke van Laethem; CHECK-NEXT: lsr r25 273840d10a1SAyke van Laethem; CHECK-NEXT: ror r24 274840d10a1SAyke van Laethem; CHECK-NEXT: ror r23 275840d10a1SAyke van Laethem; CHECK-NEXT: ror r22 276840d10a1SAyke van Laethem; CHECK-NEXT: ret 277840d10a1SAyke van Laethem %res = lshr i32 %a, 2 278840d10a1SAyke van Laethem ret i32 %res 279840d10a1SAyke van Laethem} 280840d10a1SAyke van Laethem 28181f5f22fSAyke van Laethemdefine i32 @lshr_i32_4(i32 %a) { 28281f5f22fSAyke van Laethem; CHECK-LABEL: lshr_i32_4: 28381f5f22fSAyke van Laethem; CHECK: ; %bb.0: 28481f5f22fSAyke van Laethem; CHECK-NEXT: swap r22 28581f5f22fSAyke van Laethem; CHECK-NEXT: andi r22, 15 28681f5f22fSAyke van Laethem; CHECK-NEXT: swap r23 28781f5f22fSAyke van Laethem; CHECK-NEXT: eor r22, r23 28881f5f22fSAyke van Laethem; CHECK-NEXT: andi r23, 15 28981f5f22fSAyke van Laethem; CHECK-NEXT: eor r22, r23 29081f5f22fSAyke van Laethem; CHECK-NEXT: swap r24 29181f5f22fSAyke van Laethem; CHECK-NEXT: eor r23, r24 29281f5f22fSAyke van Laethem; CHECK-NEXT: andi r24, 15 29381f5f22fSAyke van Laethem; CHECK-NEXT: eor r23, r24 29481f5f22fSAyke van Laethem; CHECK-NEXT: swap r25 29581f5f22fSAyke van Laethem; CHECK-NEXT: eor r24, r25 29681f5f22fSAyke van Laethem; CHECK-NEXT: andi r25, 15 29781f5f22fSAyke van Laethem; CHECK-NEXT: eor r24, r25 29881f5f22fSAyke van Laethem; CHECK-NEXT: ret 29981f5f22fSAyke van Laethem %res = lshr i32 %a, 4 30081f5f22fSAyke van Laethem ret i32 %res 30181f5f22fSAyke van Laethem} 30281f5f22fSAyke van Laethem 303fad5e0cfSAyke van Laethemdefine i32 @lshr_i32_6(i32 %a) { 304fad5e0cfSAyke van Laethem; CHECK-LABEL: lshr_i32_6: 305fad5e0cfSAyke van Laethem; CHECK: ; %bb.0: 306fad5e0cfSAyke van Laethem; CHECK-NEXT: lsl r22 307fad5e0cfSAyke van Laethem; CHECK-NEXT: rol r23 308fad5e0cfSAyke van Laethem; CHECK-NEXT: rol r24 309fad5e0cfSAyke van Laethem; CHECK-NEXT: rol r25 310fad5e0cfSAyke van Laethem; CHECK-NEXT: mov r19, r1 311fad5e0cfSAyke van Laethem; CHECK-NEXT: rol r19 312fad5e0cfSAyke van Laethem; CHECK-NEXT: lsl r22 313fad5e0cfSAyke van Laethem; CHECK-NEXT: rol r23 314fad5e0cfSAyke van Laethem; CHECK-NEXT: rol r24 315fad5e0cfSAyke van Laethem; CHECK-NEXT: rol r25 316fad5e0cfSAyke van Laethem; CHECK-NEXT: rol r19 31795929208SAyke van Laethem; CHECK-NEXT: mov r22, r23 31895929208SAyke van Laethem; CHECK-NEXT: mov r23, r24 319fad5e0cfSAyke van Laethem; CHECK-NEXT: mov r18, r25 320fad5e0cfSAyke van Laethem; CHECK-NEXT: movw r24, r18 321fad5e0cfSAyke van Laethem; CHECK-NEXT: ret 322fad5e0cfSAyke van Laethem %res = lshr i32 %a, 6 323fad5e0cfSAyke van Laethem ret i32 %res 324fad5e0cfSAyke van Laethem} 325fad5e0cfSAyke van Laethem 326fad5e0cfSAyke van Laethemdefine i32 @lshr_i32_7(i32 %a) { 327fad5e0cfSAyke van Laethem; CHECK-LABEL: lshr_i32_7: 328fad5e0cfSAyke van Laethem; CHECK: ; %bb.0: 329fad5e0cfSAyke van Laethem; CHECK-NEXT: lsl r22 330fad5e0cfSAyke van Laethem; CHECK-NEXT: rol r23 331fad5e0cfSAyke van Laethem; CHECK-NEXT: rol r24 332fad5e0cfSAyke van Laethem; CHECK-NEXT: rol r25 333fad5e0cfSAyke van Laethem; CHECK-NEXT: mov r19, r1 334fad5e0cfSAyke van Laethem; CHECK-NEXT: rol r19 33595929208SAyke van Laethem; CHECK-NEXT: mov r22, r23 33695929208SAyke van Laethem; CHECK-NEXT: mov r23, r24 337fad5e0cfSAyke van Laethem; CHECK-NEXT: mov r18, r25 338fad5e0cfSAyke van Laethem; CHECK-NEXT: movw r24, r18 339fad5e0cfSAyke van Laethem; CHECK-NEXT: ret 340fad5e0cfSAyke van Laethem %res = lshr i32 %a, 7 341fad5e0cfSAyke van Laethem ret i32 %res 342fad5e0cfSAyke van Laethem} 343fad5e0cfSAyke van Laethem 3448f8afabdSAyke van Laethemdefine i32 @lshr_i32_8(i32 %a) { 3458f8afabdSAyke van Laethem; CHECK-LABEL: lshr_i32_8: 3468f8afabdSAyke van Laethem; CHECK: ; %bb.0: 34795929208SAyke van Laethem; CHECK-NEXT: mov r22, r23 34895929208SAyke van Laethem; CHECK-NEXT: mov r23, r24 34995929208SAyke van Laethem; CHECK-NEXT: mov r24, r25 35095929208SAyke van Laethem; CHECK-NEXT: mov r25, r1 3518f8afabdSAyke van Laethem; CHECK-NEXT: ret 3528f8afabdSAyke van Laethem %res = lshr i32 %a, 8 3538f8afabdSAyke van Laethem ret i32 %res 3548f8afabdSAyke van Laethem} 3558f8afabdSAyke van Laethem 3568f8afabdSAyke van Laethemdefine i32 @lshr_i32_9(i32 %a) { 3578f8afabdSAyke van Laethem; CHECK-LABEL: lshr_i32_9: 3588f8afabdSAyke van Laethem; CHECK: ; %bb.0: 3598f8afabdSAyke van Laethem; CHECK-NEXT: lsr r25 3608f8afabdSAyke van Laethem; CHECK-NEXT: ror r24 3618f8afabdSAyke van Laethem; CHECK-NEXT: ror r23 36295929208SAyke van Laethem; CHECK-NEXT: mov r22, r23 36395929208SAyke van Laethem; CHECK-NEXT: mov r23, r24 36495929208SAyke van Laethem; CHECK-NEXT: mov r24, r25 36595929208SAyke van Laethem; CHECK-NEXT: mov r25, r1 3668f8afabdSAyke van Laethem; CHECK-NEXT: ret 3678f8afabdSAyke van Laethem %res = lshr i32 %a, 9 3688f8afabdSAyke van Laethem ret i32 %res 3698f8afabdSAyke van Laethem} 3708f8afabdSAyke van Laethem 371840d10a1SAyke van Laethemdefine i32 @lshr_i32_16(i32 %a) { 372840d10a1SAyke van Laethem; CHECK-LABEL: lshr_i32_16: 373840d10a1SAyke van Laethem; CHECK: ; %bb.0: 374840d10a1SAyke van Laethem; CHECK-NEXT: movw r22, r24 375840d10a1SAyke van Laethem; CHECK-NEXT: ldi r24, 0 376840d10a1SAyke van Laethem; CHECK-NEXT: ldi r25, 0 377840d10a1SAyke van Laethem; CHECK-NEXT: ret 378840d10a1SAyke van Laethem %res = lshr i32 %a, 16 379840d10a1SAyke van Laethem ret i32 %res 380840d10a1SAyke van Laethem} 381840d10a1SAyke van Laethem 3828f8afabdSAyke van Laethemdefine i32 @lshr_i32_24(i32 %a) { 3838f8afabdSAyke van Laethem; CHECK-LABEL: lshr_i32_24: 3848f8afabdSAyke van Laethem; CHECK: ; %bb.0: 3858f8afabdSAyke van Laethem; CHECK-NEXT: mov r22, r25 38695929208SAyke van Laethem; CHECK-NEXT: mov r23, r1 38795929208SAyke van Laethem; CHECK-NEXT: mov r24, r1 38895929208SAyke van Laethem; CHECK-NEXT: mov r25, r1 3898f8afabdSAyke van Laethem; CHECK-NEXT: ret 3908f8afabdSAyke van Laethem %res = lshr i32 %a, 24 3918f8afabdSAyke van Laethem ret i32 %res 3928f8afabdSAyke van Laethem} 3938f8afabdSAyke van Laethem 394fad5e0cfSAyke van Laethemdefine i32 @lshr_i32_31(i32 %a) { 395fad5e0cfSAyke van Laethem; CHECK-LABEL: lshr_i32_31: 396fad5e0cfSAyke van Laethem; CHECK: ; %bb.0: 397fad5e0cfSAyke van Laethem; CHECK-NEXT: lsl r25 398fad5e0cfSAyke van Laethem; CHECK-NEXT: mov r22, r1 399fad5e0cfSAyke van Laethem; CHECK-NEXT: rol r22 400fad5e0cfSAyke van Laethem; CHECK-NEXT: mov r23, r1 40195929208SAyke van Laethem; CHECK-NEXT: mov r24, r1 40295929208SAyke van Laethem; CHECK-NEXT: mov r25, r1 403fad5e0cfSAyke van Laethem; CHECK-NEXT: ret 404fad5e0cfSAyke van Laethem %res = lshr i32 %a, 31 405fad5e0cfSAyke van Laethem ret i32 %res 406fad5e0cfSAyke van Laethem} 407fad5e0cfSAyke van Laethem 408840d10a1SAyke van Laethemdefine i32 @ashr_i32_1(i32 %a) { 409840d10a1SAyke van Laethem; CHECK-LABEL: ashr_i32_1: 410840d10a1SAyke van Laethem; CHECK: ; %bb.0: 411840d10a1SAyke van Laethem; CHECK-NEXT: asr r25 412840d10a1SAyke van Laethem; CHECK-NEXT: ror r24 413840d10a1SAyke van Laethem; CHECK-NEXT: ror r23 414840d10a1SAyke van Laethem; CHECK-NEXT: ror r22 415840d10a1SAyke van Laethem; CHECK-NEXT: ret 416840d10a1SAyke van Laethem %res = ashr i32 %a, 1 417840d10a1SAyke van Laethem ret i32 %res 418840d10a1SAyke van Laethem} 419840d10a1SAyke van Laethem 420840d10a1SAyke van Laethemdefine i32 @ashr_i32_2(i32 %a) { 421840d10a1SAyke van Laethem; CHECK-LABEL: ashr_i32_2: 422840d10a1SAyke van Laethem; CHECK: ; %bb.0: 423840d10a1SAyke van Laethem; CHECK-NEXT: asr r25 424840d10a1SAyke van Laethem; CHECK-NEXT: ror r24 425840d10a1SAyke van Laethem; CHECK-NEXT: ror r23 426840d10a1SAyke van Laethem; CHECK-NEXT: ror r22 427840d10a1SAyke van Laethem; CHECK-NEXT: asr r25 428840d10a1SAyke van Laethem; CHECK-NEXT: ror r24 429840d10a1SAyke van Laethem; CHECK-NEXT: ror r23 430840d10a1SAyke van Laethem; CHECK-NEXT: ror r22 431840d10a1SAyke van Laethem; CHECK-NEXT: ret 432840d10a1SAyke van Laethem %res = ashr i32 %a, 2 433840d10a1SAyke van Laethem ret i32 %res 434840d10a1SAyke van Laethem} 4358f8afabdSAyke van Laethem 43681f5f22fSAyke van Laethem; can't use the swap/andi/eor trick here 43781f5f22fSAyke van Laethemdefine i32 @ashr_i32_4(i32 %a) { 43881f5f22fSAyke van Laethem; CHECK-LABEL: ashr_i32_4: 43981f5f22fSAyke van Laethem; CHECK: ; %bb.0: 44081f5f22fSAyke van Laethem; CHECK-NEXT: asr r25 44181f5f22fSAyke van Laethem; CHECK-NEXT: ror r24 44281f5f22fSAyke van Laethem; CHECK-NEXT: ror r23 44381f5f22fSAyke van Laethem; CHECK-NEXT: ror r22 44481f5f22fSAyke van Laethem; CHECK-NEXT: asr r25 44581f5f22fSAyke van Laethem; CHECK-NEXT: ror r24 44681f5f22fSAyke van Laethem; CHECK-NEXT: ror r23 44781f5f22fSAyke van Laethem; CHECK-NEXT: ror r22 44881f5f22fSAyke van Laethem; CHECK-NEXT: asr r25 44981f5f22fSAyke van Laethem; CHECK-NEXT: ror r24 45081f5f22fSAyke van Laethem; CHECK-NEXT: ror r23 45181f5f22fSAyke van Laethem; CHECK-NEXT: ror r22 45281f5f22fSAyke van Laethem; CHECK-NEXT: asr r25 45381f5f22fSAyke van Laethem; CHECK-NEXT: ror r24 45481f5f22fSAyke van Laethem; CHECK-NEXT: ror r23 45581f5f22fSAyke van Laethem; CHECK-NEXT: ror r22 45681f5f22fSAyke van Laethem; CHECK-NEXT: ret 45781f5f22fSAyke van Laethem %res = ashr i32 %a, 4 45881f5f22fSAyke van Laethem ret i32 %res 45981f5f22fSAyke van Laethem} 46081f5f22fSAyke van Laethem 461fad5e0cfSAyke van Laethemdefine i32 @ashr_i32_7(i32 %a) { 462fad5e0cfSAyke van Laethem; CHECK-LABEL: ashr_i32_7: 463fad5e0cfSAyke van Laethem; CHECK: ; %bb.0: 464fad5e0cfSAyke van Laethem; CHECK-NEXT: lsl r22 465fad5e0cfSAyke van Laethem; CHECK-NEXT: rol r23 466fad5e0cfSAyke van Laethem; CHECK-NEXT: rol r24 467fad5e0cfSAyke van Laethem; CHECK-NEXT: rol r25 468fad5e0cfSAyke van Laethem; CHECK-NEXT: sbc r19, r19 46995929208SAyke van Laethem; CHECK-NEXT: mov r22, r23 47095929208SAyke van Laethem; CHECK-NEXT: mov r23, r24 471fad5e0cfSAyke van Laethem; CHECK-NEXT: mov r18, r25 472fad5e0cfSAyke van Laethem; CHECK-NEXT: movw r24, r18 473fad5e0cfSAyke van Laethem; CHECK-NEXT: ret 474fad5e0cfSAyke van Laethem %res = ashr i32 %a, 7 475fad5e0cfSAyke van Laethem ret i32 %res 476fad5e0cfSAyke van Laethem} 477fad5e0cfSAyke van Laethem 47895929208SAyke van Laethem; TODO: this could be optimized to 4 movs, instead of 5. 4798f8afabdSAyke van Laethemdefine i32 @ashr_i32_8(i32 %a) { 4808f8afabdSAyke van Laethem; CHECK-LABEL: ashr_i32_8: 4818f8afabdSAyke van Laethem; CHECK: ; %bb.0: 4828f8afabdSAyke van Laethem; CHECK-NEXT: mov r19, r25 4838f8afabdSAyke van Laethem; CHECK-NEXT: lsl r19 4848f8afabdSAyke van Laethem; CHECK-NEXT: sbc r19, r19 48595929208SAyke van Laethem; CHECK-NEXT: mov r22, r23 48695929208SAyke van Laethem; CHECK-NEXT: mov r23, r24 4878f8afabdSAyke van Laethem; CHECK-NEXT: mov r18, r25 4888f8afabdSAyke van Laethem; CHECK-NEXT: movw r24, r18 4898f8afabdSAyke van Laethem; CHECK-NEXT: ret 4908f8afabdSAyke van Laethem %res = ashr i32 %a, 8 4918f8afabdSAyke van Laethem ret i32 %res 4928f8afabdSAyke van Laethem} 4938f8afabdSAyke van Laethem 4948f8afabdSAyke van Laethemdefine i32 @ashr_i32_16(i32 %a) { 4958f8afabdSAyke van Laethem; CHECK-LABEL: ashr_i32_16: 4968f8afabdSAyke van Laethem; CHECK: ; %bb.0: 4978f8afabdSAyke van Laethem; CHECK-NEXT: movw r22, r24 4988f8afabdSAyke van Laethem; CHECK-NEXT: lsl r25 4998f8afabdSAyke van Laethem; CHECK-NEXT: sbc r25, r25 5008f8afabdSAyke van Laethem; CHECK-NEXT: mov r24, r25 5018f8afabdSAyke van Laethem; CHECK-NEXT: ret 5028f8afabdSAyke van Laethem %res = ashr i32 %a, 16 5038f8afabdSAyke van Laethem ret i32 %res 5048f8afabdSAyke van Laethem} 5058f8afabdSAyke van Laethem 5068f8afabdSAyke van Laethemdefine i32 @ashr_i32_17(i32 %a) { 5078f8afabdSAyke van Laethem; CHECK-LABEL: ashr_i32_17: 5088f8afabdSAyke van Laethem; CHECK: ; %bb.0: 5098f8afabdSAyke van Laethem; CHECK-NEXT: movw r22, r24 5108f8afabdSAyke van Laethem; CHECK-NEXT: lsl r25 5118f8afabdSAyke van Laethem; CHECK-NEXT: sbc r25, r25 5128f8afabdSAyke van Laethem; CHECK-NEXT: asr r23 5138f8afabdSAyke van Laethem; CHECK-NEXT: ror r22 5148f8afabdSAyke van Laethem; CHECK-NEXT: mov r24, r25 5158f8afabdSAyke van Laethem; CHECK-NEXT: ret 5168f8afabdSAyke van Laethem %res = ashr i32 %a, 17 5178f8afabdSAyke van Laethem ret i32 %res 5188f8afabdSAyke van Laethem} 519fad5e0cfSAyke van Laethem 520fad5e0cfSAyke van Laethemdefine i32 @ashr_i32_22(i32 %a) { 521fad5e0cfSAyke van Laethem; CHECK-LABEL: ashr_i32_22: 522fad5e0cfSAyke van Laethem; CHECK: ; %bb.0: 523fad5e0cfSAyke van Laethem; CHECK-NEXT: lsl r24 524fad5e0cfSAyke van Laethem; CHECK-NEXT: rol r25 52595929208SAyke van Laethem; CHECK-NEXT: sbc r18, r18 526fad5e0cfSAyke van Laethem; CHECK-NEXT: lsl r24 527fad5e0cfSAyke van Laethem; CHECK-NEXT: rol r25 528effb7ab6SJay Foad; CHECK-NEXT: mov r19, r18 52995929208SAyke van Laethem; CHECK-NEXT: mov r23, r18 530fad5e0cfSAyke van Laethem; CHECK-NEXT: rol r23 531fad5e0cfSAyke van Laethem; CHECK-NEXT: mov r22, r25 532fad5e0cfSAyke van Laethem; CHECK-NEXT: movw r24, r18 533fad5e0cfSAyke van Laethem; CHECK-NEXT: ret 534fad5e0cfSAyke van Laethem %res = ashr i32 %a, 22 535fad5e0cfSAyke van Laethem ret i32 %res 536fad5e0cfSAyke van Laethem} 537fad5e0cfSAyke van Laethem 538fad5e0cfSAyke van Laethemdefine i32 @ashr_i32_23(i32 %a) { 539fad5e0cfSAyke van Laethem; CHECK-LABEL: ashr_i32_23: 540fad5e0cfSAyke van Laethem; CHECK: ; %bb.0: 541fad5e0cfSAyke van Laethem; CHECK-NEXT: lsl r24 542fad5e0cfSAyke van Laethem; CHECK-NEXT: rol r25 54395929208SAyke van Laethem; CHECK-NEXT: sbc r23, r23 544fad5e0cfSAyke van Laethem; CHECK-NEXT: mov r22, r25 54595929208SAyke van Laethem; CHECK-NEXT: mov r24, r23 54695929208SAyke van Laethem; CHECK-NEXT: mov r25, r23 547fad5e0cfSAyke van Laethem; CHECK-NEXT: ret 548fad5e0cfSAyke van Laethem %res = ashr i32 %a, 23 549fad5e0cfSAyke van Laethem ret i32 %res 550fad5e0cfSAyke van Laethem} 551fad5e0cfSAyke van Laethem 552fad5e0cfSAyke van Laethemdefine i32 @ashr_i32_30(i32 %a) { 553fad5e0cfSAyke van Laethem; CHECK-LABEL: ashr_i32_30: 554fad5e0cfSAyke van Laethem; CHECK: ; %bb.0: 555fad5e0cfSAyke van Laethem; CHECK-NEXT: lsl r25 55695929208SAyke van Laethem; CHECK-NEXT: sbc r23, r23 557fad5e0cfSAyke van Laethem; CHECK-NEXT: lsl r25 55895929208SAyke van Laethem; CHECK-NEXT: mov r22, r23 559fad5e0cfSAyke van Laethem; CHECK-NEXT: rol r22 56095929208SAyke van Laethem; CHECK-NEXT: mov r24, r23 56195929208SAyke van Laethem; CHECK-NEXT: mov r25, r23 562fad5e0cfSAyke van Laethem; CHECK-NEXT: ret 563fad5e0cfSAyke van Laethem %res = ashr i32 %a, 30 564fad5e0cfSAyke van Laethem ret i32 %res 565fad5e0cfSAyke van Laethem} 566fad5e0cfSAyke van Laethem 567fad5e0cfSAyke van Laethemdefine i32 @ashr_i32_31(i32 %a) { 568fad5e0cfSAyke van Laethem; CHECK-LABEL: ashr_i32_31: 569fad5e0cfSAyke van Laethem; CHECK: ; %bb.0: 570fad5e0cfSAyke van Laethem; CHECK-NEXT: lsl r25 57195929208SAyke van Laethem; CHECK-NEXT: sbc r22, r22 57295929208SAyke van Laethem; CHECK-NEXT: mov r23, r22 573fad5e0cfSAyke van Laethem; CHECK-NEXT: movw r24, r22 574fad5e0cfSAyke van Laethem; CHECK-NEXT: ret 575fad5e0cfSAyke van Laethem %res = ashr i32 %a, 31 576fad5e0cfSAyke van Laethem ret i32 %res 577fad5e0cfSAyke van Laethem} 578