1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 3 2; RUN: llc -verify-machineinstrs < %s -mtriple=powerpc64le-unknown-linux-gnu -mcpu=pwr8 | FileCheck %s 3; RUN: llc -verify-machineinstrs < %s -mtriple=powerpc64-ibm-aix -mcpu=pwr8 | FileCheck %s 4 5define i64 @rldimi1(i64 %a) { 6; CHECK-LABEL: rldimi1: 7; CHECK: # %bb.0: # %entry 8; CHECK-NEXT: rldimi 3, 3, 8, 0 9; CHECK-NEXT: blr 10entry: 11 %x0 = shl i64 %a, 8 12 %x1 = and i64 %a, 255 13 %x2 = or i64 %x0, %x1 14 ret i64 %x2 15} 16 17define i64 @rldimi2(i64 %a) { 18; CHECK-LABEL: rldimi2: 19; CHECK: # %bb.0: # %entry 20; CHECK-NEXT: mr 4, 3 21; CHECK-NEXT: rlwimi 4, 3, 8, 16, 23 22; CHECK-NEXT: rlwimi 4, 3, 16, 8, 15 23; CHECK-NEXT: rldimi 4, 3, 24, 0 24; CHECK-NEXT: mr 3, 4 25; CHECK-NEXT: blr 26entry: 27 %x0 = shl i64 %a, 8 28 %x1 = and i64 %a, 255 29 %x2 = or i64 %x0, %x1 30 %x3 = shl i64 %x2, 16 31 %x4 = and i64 %x2, 65535 32 %x5 = or i64 %x3, %x4 33 ret i64 %x5 34} 35 36define i64 @rldimi3(i64 %a) { 37; CHECK-LABEL: rldimi3: 38; CHECK: # %bb.0: # %entry 39; CHECK-NEXT: rotldi 4, 3, 32 40; CHECK-NEXT: rlwimi 4, 3, 0, 24, 31 41; CHECK-NEXT: rlwimi 4, 3, 8, 16, 23 42; CHECK-NEXT: rlwimi 4, 3, 16, 8, 15 43; CHECK-NEXT: rlwimi 4, 3, 24, 0, 7 44; CHECK-NEXT: rldimi 4, 3, 40, 16 45; CHECK-NEXT: rldimi 4, 3, 48, 8 46; CHECK-NEXT: rldimi 4, 3, 56, 0 47; CHECK-NEXT: mr 3, 4 48; CHECK-NEXT: blr 49entry: 50 %0 = shl i64 %a, 8 51 %1 = and i64 %a, 255 52 %2 = or i64 %0, %1 53 %3 = shl i64 %2, 16 54 %4 = and i64 %2, 65535 55 %5 = or i64 %3, %4 56 %6 = shl i64 %5, 32 57 %7 = and i64 %5, 4294967295 58 %8 = or i64 %6, %7 59 ret i64 %8 60} 61 62define i64 @rldimi4(i64 %a) { 63; CHECK-LABEL: rldimi4: 64; CHECK: # %bb.0: 65; CHECK-NEXT: rldimi 3, 3, 8, 0 66; CHECK-NEXT: rldimi 3, 3, 16, 0 67; CHECK-NEXT: rldimi 3, 3, 32, 0 68; CHECK-NEXT: blr 69 %r1 = call i64 @llvm.ppc.rldimi(i64 %a, i64 %a, i32 8, i64 -256) 70 %r2 = call i64 @llvm.ppc.rldimi(i64 %r1, i64 %r1, i32 16, i64 -65536) 71 %r3 = call i64 @llvm.ppc.rldimi(i64 %r2, i64 %r2, i32 32, i64 -4294967296) 72 ret i64 %r3 73} 74 75define i64 @rldimi5(i64 %a, i64 %b) { 76; CHECK-LABEL: rldimi5: 77; CHECK: # %bb.0: 78; CHECK-NEXT: rldimi 4, 3, 8, 40 79; CHECK-NEXT: mr 3, 4 80; CHECK-NEXT: blr 81 %r = call i64 @llvm.ppc.rldimi(i64 %a, i64 %b, i32 8, i64 16776960) ; 0xffff << 8 82 ret i64 %r 83} 84 85define i64 @rldimi6(i64 %a, i64 %b) { 86; CHECK-LABEL: rldimi6: 87; CHECK: # %bb.0: 88; CHECK-NEXT: rotldi 3, 3, 1 89; CHECK-NEXT: rldimi 4, 3, 7, 41 90; CHECK-NEXT: mr 3, 4 91; CHECK-NEXT: blr 92 %r = call i64 @llvm.ppc.rldimi(i64 %a, i64 %b, i32 8, i64 8388480) ; 0xffff << 7 93 ret i64 %r 94} 95 96define i64 @rldimi7(i64 %a, i64 %b) { 97; CHECK-LABEL: rldimi7: 98; CHECK: # %bb.0: 99; CHECK-NEXT: rotldi 3, 3, 63 100; CHECK-NEXT: rldimi 4, 3, 9, 39 101; CHECK-NEXT: mr 3, 4 102; CHECK-NEXT: blr 103 %r = call i64 @llvm.ppc.rldimi(i64 %a, i64 %b, i32 8, i64 33553920) ; 0xffff << 9 104 ret i64 %r 105} 106 107define i64 @rldimi8(i64 %a, i64 %b) { 108; CHECK-LABEL: rldimi8: 109; CHECK: # %bb.0: 110; CHECK-NEXT: mr 3, 4 111; CHECK-NEXT: blr 112 %r = call i64 @llvm.ppc.rldimi(i64 %a, i64 %b, i32 0, i64 0) 113 ret i64 %r 114} 115 116define i64 @rldimi9(i64 %a, i64 %b) { 117; CHECK-LABEL: rldimi9: 118; CHECK: # %bb.0: 119; CHECK-NEXT: mr 3, 4 120; CHECK-NEXT: blr 121 %r = call i64 @llvm.ppc.rldimi(i64 %a, i64 %b, i32 63, i64 0) 122 ret i64 %r 123} 124 125define i64 @rldimi10(i64 %a, i64 %b) { 126; CHECK-LABEL: rldimi10: 127; CHECK: # %bb.0: 128; CHECK-NEXT: blr 129 %r = call i64 @llvm.ppc.rldimi(i64 %a, i64 %b, i32 0, i64 -1) 130 ret i64 %r 131} 132 133define i64 @rldimi11(i64 %a, i64 %b) { 134; CHECK-LABEL: rldimi11: 135; CHECK: # %bb.0: 136; CHECK-NEXT: rotldi 3, 3, 8 137; CHECK-NEXT: blr 138 %r = call i64 @llvm.ppc.rldimi(i64 %a, i64 %b, i32 8, i64 -1) 139 ret i64 %r 140} 141 142define i64 @rldimi12(i64 %a, i64 %b) { 143; CHECK-LABEL: rldimi12: 144; CHECK: # %bb.0: 145; CHECK-NEXT: rotldi 3, 3, 20 146; CHECK-NEXT: rldimi 4, 3, 44, 31 147; CHECK-NEXT: mr 3, 4 148; CHECK-NEXT: blr 149 %r = call i64 @llvm.ppc.rldimi(i64 %a, i64 %b, i32 0, i64 18446726490113441791) 150 ret i64 %r 151} 152 153define i64 @rldimi13(i64 %a, i64 %b) { 154; CHECK-LABEL: rldimi13: 155; CHECK: # %bb.0: 156; CHECK-NEXT: rotldi 3, 3, 62 157; CHECK-NEXT: rldimi 4, 3, 32, 2 158; CHECK-NEXT: mr 3, 4 159; CHECK-NEXT: blr 160 %r = call i64 @llvm.ppc.rldimi(i64 %a, i64 %b, i32 30, i64 4611686014132420608) 161 ret i64 %r 162} 163 164define i64 @rldimi14(i64 %a, i64 %b) { 165; CHECK-LABEL: rldimi14: 166; CHECK: # %bb.0: 167; CHECK-NEXT: rotldi 3, 3, 23 168; CHECK-NEXT: rldimi 4, 3, 53, 0 169; CHECK-NEXT: mr 3, 4 170; CHECK-NEXT: blr 171 %r = call i64 @llvm.ppc.rldimi(i64 %a, i64 %b, i32 12, i64 18437736874454810624) ; mb=0, me=10 172 ret i64 %r 173} 174 175define i64 @rldimi15(i64 %a, i64 %b) { 176; CHECK-LABEL: rldimi15: 177; CHECK: # %bb.0: 178; CHECK-NEXT: rotldi 3, 3, 36 179; CHECK-NEXT: rldimi 4, 3, 40, 10 180; CHECK-NEXT: mr 3, 4 181; CHECK-NEXT: blr 182 %r = call i64 @llvm.ppc.rldimi(i64 %a, i64 %b, i32 12, i64 18013298997854208) ; mb=10, me=23 183 ret i64 %r 184} 185 186define i64 @rldimi16(i64 %a, i64 %b) { 187; CHECK-LABEL: rldimi16: 188; CHECK: # %bb.0: 189; CHECK-NEXT: rotldi 3, 3, 57 190; CHECK-NEXT: rldimi 4, 3, 19, 10 191; CHECK-NEXT: mr 3, 4 192; CHECK-NEXT: blr 193 %r = call i64 @llvm.ppc.rldimi(i64 %a, i64 %b, i32 12, i64 18014398508957696) ; mb=10, me=44 194 ret i64 %r 195} 196 197define i64 @rldimi17(i64 %a, i64 %b) { 198; CHECK-LABEL: rldimi17: 199; CHECK: # %bb.0: 200; CHECK-NEXT: rotldi 3, 3, 43 201; CHECK-NEXT: rldimi 4, 3, 33, 25 202; CHECK-NEXT: mr 3, 4 203; CHECK-NEXT: blr 204 %r = call i64 @llvm.ppc.rldimi(i64 %a, i64 %b, i32 12, i64 541165879296) ; mb=25, me=30 205 ret i64 %r 206} 207 208define i64 @rldimi18(i64 %a, i64 %b) { 209; CHECK-LABEL: rldimi18: 210; CHECK: # %bb.0: 211; CHECK-NEXT: rotldi 3, 3, 57 212; CHECK-NEXT: rldimi 4, 3, 19, 25 213; CHECK-NEXT: mr 3, 4 214; CHECK-NEXT: blr 215 %r = call i64 @llvm.ppc.rldimi(i64 %a, i64 %b, i32 12, i64 549755289600) ; mb=25, me=44 216 ret i64 %r 217} 218 219define i64 @rldimi19(i64 %a, i64 %b) { 220; CHECK-LABEL: rldimi19: 221; CHECK: # %bb.0: 222; CHECK-NEXT: rotldi 3, 3, 57 223; CHECK-NEXT: rldimi 4, 3, 19, 33 224; CHECK-NEXT: mr 3, 4 225; CHECK-NEXT: blr 226 %r = call i64 @llvm.ppc.rldimi(i64 %a, i64 %b, i32 12, i64 2146959360) ; mb=33, me=44 227 ret i64 %r 228} 229 230define i64 @rldimi20(i64 %a, i64 %b) { 231; CHECK-LABEL: rldimi20: 232; CHECK: # %bb.0: 233; CHECK-NEXT: rotldi 3, 3, 23 234; CHECK-NEXT: rldimi 4, 3, 53, 15 235; CHECK-NEXT: mr 3, 4 236; CHECK-NEXT: blr 237 %r = call i64 @llvm.ppc.rldimi(i64 %a, i64 %b, i32 12, i64 18438299824408231935) ; mb=15, me=10 238 ret i64 %r 239} 240 241define i64 @rldimi21(i64 %a, i64 %b) { 242; CHECK-LABEL: rldimi21: 243; CHECK: # %bb.0: 244; CHECK-NEXT: rotldi 3, 3, 23 245; CHECK-NEXT: rldimi 4, 3, 53, 25 246; CHECK-NEXT: mr 3, 4 247; CHECK-NEXT: blr 248 %r = call i64 @llvm.ppc.rldimi(i64 %a, i64 %b, i32 12, i64 18437737424210624511) ; mb=25, me=10 249 ret i64 %r 250} 251 252define i64 @rldimi22(i64 %a, i64 %b) { 253; CHECK-LABEL: rldimi22: 254; CHECK: # %bb.0: 255; CHECK-NEXT: rotldi 3, 3, 34 256; CHECK-NEXT: rldimi 4, 3, 42, 25 257; CHECK-NEXT: mr 3, 4 258; CHECK-NEXT: blr 259 %r = call i64 @llvm.ppc.rldimi(i64 %a, i64 %b, i32 12, i64 18446740225418854399) ; mb=25, me=21 260 ret i64 %r 261} 262 263define i64 @rldimi23(i64 %a, i64 %b) { 264; CHECK-LABEL: rldimi23: 265; CHECK: # %bb.0: 266; CHECK-NEXT: rotldi 3, 3, 23 267; CHECK-NEXT: rldimi 4, 3, 53, 44 268; CHECK-NEXT: mr 3, 4 269; CHECK-NEXT: blr 270 %r = call i64 @llvm.ppc.rldimi(i64 %a, i64 %b, i32 12, i64 18437736874455859199) ; mb=44, me=10 271 ret i64 %r 272} 273 274define i64 @rldimi24(i64 %a, i64 %b) { 275; CHECK-LABEL: rldimi24: 276; CHECK: # %bb.0: 277; CHECK-NEXT: rotldi 3, 3, 38 278; CHECK-NEXT: rldimi 4, 3, 38, 44 279; CHECK-NEXT: mr 3, 4 280; CHECK-NEXT: blr 281 %r = call i64 @llvm.ppc.rldimi(i64 %a, i64 %b, i32 12, i64 18446743798832693247) ; mb=44, me=25 282 ret i64 %r 283} 284 285define i64 @rldimi25(i64 %a, i64 %b) { 286; CHECK-LABEL: rldimi25: 287; CHECK: # %bb.0: 288; CHECK-NEXT: rotldi 3, 3, 48 289; CHECK-NEXT: rldimi 4, 3, 28, 44 290; CHECK-NEXT: mr 3, 4 291; CHECK-NEXT: blr 292 %r = call i64 @llvm.ppc.rldimi(i64 %a, i64 %b, i32 12, i64 18446744073442164735) ; mb=44, me=35 293 ret i64 %r 294} 295 296declare i64 @llvm.ppc.rldimi(i64, i64, i32 immarg, i64 immarg) 297