1d0e1e764SStefan Pintilie; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 2 2d0e1e764SStefan Pintilie; RUN: llc -verify-machineinstrs -mtriple powerpc-ibm-aix-xcoff -mcpu=pwr8 \ 3d0e1e764SStefan Pintilie; RUN: -ppc-asm-full-reg-names < %s | FileCheck %s --check-prefixes=AIX32 4d0e1e764SStefan Pintilie; RUN: llc -verify-machineinstrs -mtriple powerpc64-ibm-aix-xcoff -mcpu=pwr8 \ 5d0e1e764SStefan Pintilie; RUN: -ppc-asm-full-reg-names < %s | FileCheck %s --check-prefixes=AIX64 6d0e1e764SStefan Pintilie; RUN: llc -verify-machineinstrs -mtriple powerpc64-unknown-linux -mcpu=pwr8 \ 7d0e1e764SStefan Pintilie; RUN: -ppc-asm-full-reg-names < %s | FileCheck %s --check-prefixes=LINUX64BE 8d0e1e764SStefan Pintilie; RUN: llc -verify-machineinstrs -mtriple powerpc64le-unknown-linux -mcpu=pwr8 \ 9d0e1e764SStefan Pintilie; RUN: -ppc-asm-full-reg-names < %s | FileCheck %s --check-prefixes=LINUX64LE 10d0e1e764SStefan Pintilie 11d0e1e764SStefan Pintiliedefine dso_local i64 @rotatemask32(i64 noundef %word) local_unnamed_addr #0 { 12d0e1e764SStefan Pintilie; AIX32-LABEL: rotatemask32: 13d0e1e764SStefan Pintilie; AIX32: # %bb.0: # %entry 14*b922a362SQiu Chaofan; AIX32-NEXT: cntlzw r5, r3 15d0e1e764SStefan Pintilie; AIX32-NEXT: cmplwi r3, 0 16*b922a362SQiu Chaofan; AIX32-NEXT: cntlzw r3, r4 17*b922a362SQiu Chaofan; AIX32-NEXT: addi r3, r3, 32 18*b922a362SQiu Chaofan; AIX32-NEXT: iseleq r3, r3, r5 19d0e1e764SStefan Pintilie; AIX32-NEXT: rlwnm r4, r4, r3, 1, 31 20d0e1e764SStefan Pintilie; AIX32-NEXT: li r3, 0 21d0e1e764SStefan Pintilie; AIX32-NEXT: blr 22d0e1e764SStefan Pintilie; 23d0e1e764SStefan Pintilie; AIX64-LABEL: rotatemask32: 24d0e1e764SStefan Pintilie; AIX64: # %bb.0: # %entry 25d0e1e764SStefan Pintilie; AIX64-NEXT: cntlzd r4, r3 26d0e1e764SStefan Pintilie; AIX64-NEXT: rlwnm r3, r3, r4, 1, 31 27d0e1e764SStefan Pintilie; AIX64-NEXT: blr 28d0e1e764SStefan Pintilie; 29d0e1e764SStefan Pintilie; LINUX64BE-LABEL: rotatemask32: 30d0e1e764SStefan Pintilie; LINUX64BE: # %bb.0: # %entry 31d0e1e764SStefan Pintilie; LINUX64BE-NEXT: cntlzd r4, r3 32d0e1e764SStefan Pintilie; LINUX64BE-NEXT: rlwnm r3, r3, r4, 1, 31 33d0e1e764SStefan Pintilie; LINUX64BE-NEXT: blr 34d0e1e764SStefan Pintilie; 35d0e1e764SStefan Pintilie; LINUX64LE-LABEL: rotatemask32: 36d0e1e764SStefan Pintilie; LINUX64LE: # %bb.0: # %entry 37d0e1e764SStefan Pintilie; LINUX64LE-NEXT: cntlzd r4, r3 38d0e1e764SStefan Pintilie; LINUX64LE-NEXT: rlwnm r3, r3, r4, 1, 31 39d0e1e764SStefan Pintilie; LINUX64LE-NEXT: blr 40d0e1e764SStefan Pintilieentry: 41d0e1e764SStefan Pintilie %0 = tail call i64 @llvm.ctlz.i64(i64 %word, i1 false) 42d0e1e764SStefan Pintilie %cast = trunc i64 %0 to i32 43d0e1e764SStefan Pintilie %conv1 = trunc i64 %word to i32 44d0e1e764SStefan Pintilie %1 = tail call i32 @llvm.fshl.i32(i32 %conv1, i32 %conv1, i32 %cast) 45d0e1e764SStefan Pintilie %2 = and i32 %1, 2147483647 46d0e1e764SStefan Pintilie %and = zext i32 %2 to i64 47d0e1e764SStefan Pintilie ret i64 %and 48d0e1e764SStefan Pintilie} 49d0e1e764SStefan Pintilie 50d0e1e764SStefan Pintiliedeclare i64 @llvm.ctlz.i64(i64, i1 immarg) #0 51d0e1e764SStefan Pintiliedeclare i32 @llvm.fshl.i32(i32, i32, i32) #0 52d0e1e764SStefan Pintilie 53d0e1e764SStefan Pintiliedefine dso_local i64 @rotatemask64(i64 noundef %word) local_unnamed_addr #0 { 54d0e1e764SStefan Pintilie; AIX32-LABEL: rotatemask64: 55d0e1e764SStefan Pintilie; AIX32: # %bb.0: # %entry 56d0e1e764SStefan Pintilie; AIX32-NEXT: cmplwi r3, 0 57*b922a362SQiu Chaofan; AIX32-NEXT: cntlzw r6, r4 58*b922a362SQiu Chaofan; AIX32-NEXT: addi r6, r6, 32 59*b922a362SQiu Chaofan; AIX32-NEXT: cntlzw r5, r3 60*b922a362SQiu Chaofan; AIX32-NEXT: iseleq r5, r6, r5 61d0e1e764SStefan Pintilie; AIX32-NEXT: andi. r6, r5, 32 62d0e1e764SStefan Pintilie; AIX32-NEXT: clrlwi r5, r5, 27 63d0e1e764SStefan Pintilie; AIX32-NEXT: iseleq r6, r3, r4 64d0e1e764SStefan Pintilie; AIX32-NEXT: iseleq r3, r4, r3 65*b922a362SQiu Chaofan; AIX32-NEXT: subfic r7, r5, 32 66*b922a362SQiu Chaofan; AIX32-NEXT: slw r4, r3, r5 67*b922a362SQiu Chaofan; AIX32-NEXT: srw r3, r3, r7 68*b922a362SQiu Chaofan; AIX32-NEXT: slw r5, r6, r5 69*b922a362SQiu Chaofan; AIX32-NEXT: srw r8, r6, r7 70*b922a362SQiu Chaofan; AIX32-NEXT: or r3, r5, r3 71*b922a362SQiu Chaofan; AIX32-NEXT: or r4, r4, r8 72*b922a362SQiu Chaofan; AIX32-NEXT: clrlwi r3, r3, 1 73d0e1e764SStefan Pintilie; AIX32-NEXT: blr 74d0e1e764SStefan Pintilie; 75d0e1e764SStefan Pintilie; AIX64-LABEL: rotatemask64: 76d0e1e764SStefan Pintilie; AIX64: # %bb.0: # %entry 77d0e1e764SStefan Pintilie; AIX64-NEXT: cntlzd r4, r3 78492c1f3dSStefan Pintilie; AIX64-NEXT: rldcl r3, r3, r4, 1 79d0e1e764SStefan Pintilie; AIX64-NEXT: blr 80d0e1e764SStefan Pintilie; 81d0e1e764SStefan Pintilie; LINUX64BE-LABEL: rotatemask64: 82d0e1e764SStefan Pintilie; LINUX64BE: # %bb.0: # %entry 83d0e1e764SStefan Pintilie; LINUX64BE-NEXT: cntlzd r4, r3 84492c1f3dSStefan Pintilie; LINUX64BE-NEXT: rldcl r3, r3, r4, 1 85d0e1e764SStefan Pintilie; LINUX64BE-NEXT: blr 86d0e1e764SStefan Pintilie; 87d0e1e764SStefan Pintilie; LINUX64LE-LABEL: rotatemask64: 88d0e1e764SStefan Pintilie; LINUX64LE: # %bb.0: # %entry 89d0e1e764SStefan Pintilie; LINUX64LE-NEXT: cntlzd r4, r3 90492c1f3dSStefan Pintilie; LINUX64LE-NEXT: rldcl r3, r3, r4, 1 91d0e1e764SStefan Pintilie; LINUX64LE-NEXT: blr 92d0e1e764SStefan Pintilieentry: 93d0e1e764SStefan Pintilie %0 = tail call i64 @llvm.ctlz.i64(i64 %word, i1 false) 94d0e1e764SStefan Pintilie %1 = tail call i64 @llvm.fshl.i64(i64 %word, i64 %word, i64 %0) 95d0e1e764SStefan Pintilie %and = and i64 %1, 9223372036854775807 96d0e1e764SStefan Pintilie ret i64 %and 97d0e1e764SStefan Pintilie} 98d0e1e764SStefan Pintilie 99d0e1e764SStefan Pintiliedeclare i64 @llvm.fshl.i64(i64, i64, i64) #1 100d0e1e764SStefan Pintilie 101d0e1e764SStefan Pintiliedefine dso_local i64 @rotatemask64_2(i64 noundef %word) local_unnamed_addr #0 { 102d0e1e764SStefan Pintilie; AIX32-LABEL: rotatemask64_2: 103d0e1e764SStefan Pintilie; AIX32: # %bb.0: # %entry 104d0e1e764SStefan Pintilie; AIX32-NEXT: cmplwi r3, 0 105*b922a362SQiu Chaofan; AIX32-NEXT: cntlzw r6, r4 106*b922a362SQiu Chaofan; AIX32-NEXT: addi r6, r6, 32 107*b922a362SQiu Chaofan; AIX32-NEXT: cntlzw r5, r3 108*b922a362SQiu Chaofan; AIX32-NEXT: iseleq r5, r6, r5 109d0e1e764SStefan Pintilie; AIX32-NEXT: andi. r6, r5, 32 110d0e1e764SStefan Pintilie; AIX32-NEXT: clrlwi r5, r5, 27 111d0e1e764SStefan Pintilie; AIX32-NEXT: iseleq r6, r3, r4 112d0e1e764SStefan Pintilie; AIX32-NEXT: iseleq r3, r4, r3 113*b922a362SQiu Chaofan; AIX32-NEXT: subfic r7, r5, 32 114*b922a362SQiu Chaofan; AIX32-NEXT: slw r4, r3, r5 115*b922a362SQiu Chaofan; AIX32-NEXT: srw r3, r3, r7 116*b922a362SQiu Chaofan; AIX32-NEXT: slw r5, r6, r5 117*b922a362SQiu Chaofan; AIX32-NEXT: srw r8, r6, r7 118*b922a362SQiu Chaofan; AIX32-NEXT: or r3, r5, r3 119*b922a362SQiu Chaofan; AIX32-NEXT: or r4, r4, r8 120*b922a362SQiu Chaofan; AIX32-NEXT: clrlwi r3, r3, 1 121d0e1e764SStefan Pintilie; AIX32-NEXT: blr 122d0e1e764SStefan Pintilie; 123d0e1e764SStefan Pintilie; AIX64-LABEL: rotatemask64_2: 124d0e1e764SStefan Pintilie; AIX64: # %bb.0: # %entry 125d0e1e764SStefan Pintilie; AIX64-NEXT: cntlzd r4, r3 126492c1f3dSStefan Pintilie; AIX64-NEXT: rldcl r3, r3, r4, 1 127d0e1e764SStefan Pintilie; AIX64-NEXT: blr 128d0e1e764SStefan Pintilie; 129d0e1e764SStefan Pintilie; LINUX64BE-LABEL: rotatemask64_2: 130d0e1e764SStefan Pintilie; LINUX64BE: # %bb.0: # %entry 131d0e1e764SStefan Pintilie; LINUX64BE-NEXT: cntlzd r4, r3 132492c1f3dSStefan Pintilie; LINUX64BE-NEXT: rldcl r3, r3, r4, 1 133d0e1e764SStefan Pintilie; LINUX64BE-NEXT: blr 134d0e1e764SStefan Pintilie; 135d0e1e764SStefan Pintilie; LINUX64LE-LABEL: rotatemask64_2: 136d0e1e764SStefan Pintilie; LINUX64LE: # %bb.0: # %entry 137d0e1e764SStefan Pintilie; LINUX64LE-NEXT: cntlzd r4, r3 138492c1f3dSStefan Pintilie; LINUX64LE-NEXT: rldcl r3, r3, r4, 1 139d0e1e764SStefan Pintilie; LINUX64LE-NEXT: blr 140d0e1e764SStefan Pintilieentry: 141d0e1e764SStefan Pintilie %0 = tail call i64 @llvm.ctlz.i64(i64 %word, i1 false) 142d0e1e764SStefan Pintilie %1 = tail call i64 @llvm.fshl.i64(i64 %word, i64 %word, i64 %0) 143d0e1e764SStefan Pintilie %and = and i64 %1, 9223372036854775807 144d0e1e764SStefan Pintilie ret i64 %and 145d0e1e764SStefan Pintilie} 146d0e1e764SStefan Pintilie 147d0e1e764SStefan Pintiliedefine dso_local i64 @rotatemask64_3(i64 noundef %word) local_unnamed_addr #0 { 148d0e1e764SStefan Pintilie; AIX32-LABEL: rotatemask64_3: 149d0e1e764SStefan Pintilie; AIX32: # %bb.0: # %entry 150d0e1e764SStefan Pintilie; AIX32-NEXT: cmplwi r3, 0 151*b922a362SQiu Chaofan; AIX32-NEXT: cntlzw r6, r4 152*b922a362SQiu Chaofan; AIX32-NEXT: addi r6, r6, 32 153*b922a362SQiu Chaofan; AIX32-NEXT: cntlzw r5, r3 154*b922a362SQiu Chaofan; AIX32-NEXT: iseleq r5, r6, r5 155d0e1e764SStefan Pintilie; AIX32-NEXT: andi. r6, r5, 32 156d0e1e764SStefan Pintilie; AIX32-NEXT: clrlwi r5, r5, 27 157d0e1e764SStefan Pintilie; AIX32-NEXT: iseleq r6, r3, r4 158d0e1e764SStefan Pintilie; AIX32-NEXT: iseleq r3, r4, r3 159*b922a362SQiu Chaofan; AIX32-NEXT: subfic r7, r5, 32 160*b922a362SQiu Chaofan; AIX32-NEXT: srw r8, r6, r7 161*b922a362SQiu Chaofan; AIX32-NEXT: slw r4, r3, r5 162d0e1e764SStefan Pintilie; AIX32-NEXT: srw r3, r3, r7 163d0e1e764SStefan Pintilie; AIX32-NEXT: slw r5, r6, r5 164*b922a362SQiu Chaofan; AIX32-NEXT: or r4, r4, r8 165d0e1e764SStefan Pintilie; AIX32-NEXT: or r3, r5, r3 166d0e1e764SStefan Pintilie; AIX32-NEXT: clrlwi r3, r3, 1 167d0e1e764SStefan Pintilie; AIX32-NEXT: rlwinm r4, r4, 0, 0, 23 168d0e1e764SStefan Pintilie; AIX32-NEXT: blr 169d0e1e764SStefan Pintilie; 170d0e1e764SStefan Pintilie; AIX64-LABEL: rotatemask64_3: 171d0e1e764SStefan Pintilie; AIX64: # %bb.0: # %entry 172d0e1e764SStefan Pintilie; AIX64-NEXT: cntlzd r4, r3 173d0e1e764SStefan Pintilie; AIX64-NEXT: rotld r3, r3, r4 174d0e1e764SStefan Pintilie; AIX64-NEXT: rldicl r3, r3, 56, 8 175d0e1e764SStefan Pintilie; AIX64-NEXT: rldicl r3, r3, 8, 1 176d0e1e764SStefan Pintilie; AIX64-NEXT: blr 177d0e1e764SStefan Pintilie; 178d0e1e764SStefan Pintilie; LINUX64BE-LABEL: rotatemask64_3: 179d0e1e764SStefan Pintilie; LINUX64BE: # %bb.0: # %entry 180d0e1e764SStefan Pintilie; LINUX64BE-NEXT: cntlzd r4, r3 181d0e1e764SStefan Pintilie; LINUX64BE-NEXT: rotld r3, r3, r4 182d0e1e764SStefan Pintilie; LINUX64BE-NEXT: rldicl r3, r3, 56, 8 183d0e1e764SStefan Pintilie; LINUX64BE-NEXT: rldicl r3, r3, 8, 1 184d0e1e764SStefan Pintilie; LINUX64BE-NEXT: blr 185d0e1e764SStefan Pintilie; 186d0e1e764SStefan Pintilie; LINUX64LE-LABEL: rotatemask64_3: 187d0e1e764SStefan Pintilie; LINUX64LE: # %bb.0: # %entry 188d0e1e764SStefan Pintilie; LINUX64LE-NEXT: cntlzd r4, r3 189d0e1e764SStefan Pintilie; LINUX64LE-NEXT: rotld r3, r3, r4 190d0e1e764SStefan Pintilie; LINUX64LE-NEXT: rldicl r3, r3, 56, 8 191d0e1e764SStefan Pintilie; LINUX64LE-NEXT: rldicl r3, r3, 8, 1 192d0e1e764SStefan Pintilie; LINUX64LE-NEXT: blr 193d0e1e764SStefan Pintilieentry: 194d0e1e764SStefan Pintilie %0 = tail call i64 @llvm.ctlz.i64(i64 %word, i1 false) 195d0e1e764SStefan Pintilie %1 = tail call i64 @llvm.fshl.i64(i64 %word, i64 %word, i64 %0) 196d0e1e764SStefan Pintilie %and = and i64 %1, 9223372036854775552 197d0e1e764SStefan Pintilie ret i64 %and 198d0e1e764SStefan Pintilie} 199d0e1e764SStefan Pintilie 200d0e1e764SStefan Pintiliedefine dso_local i64 @rotatemask64_nocount(i64 noundef %word, i64 noundef %clz) local_unnamed_addr #0 { 201d0e1e764SStefan Pintilie; AIX32-LABEL: rotatemask64_nocount: 202d0e1e764SStefan Pintilie; AIX32: # %bb.0: # %entry 203d0e1e764SStefan Pintilie; AIX32-NEXT: andi. r5, r6, 32 204*b922a362SQiu Chaofan; AIX32-NEXT: clrlwi r6, r6, 27 205*b922a362SQiu Chaofan; AIX32-NEXT: subfic r7, r6, 32 206*b922a362SQiu Chaofan; AIX32-NEXT: iseleq r5, r3, r4 207d0e1e764SStefan Pintilie; AIX32-NEXT: iseleq r3, r4, r3 208*b922a362SQiu Chaofan; AIX32-NEXT: srw r8, r5, r7 209*b922a362SQiu Chaofan; AIX32-NEXT: slw r4, r3, r6 210*b922a362SQiu Chaofan; AIX32-NEXT: srw r3, r3, r7 211*b922a362SQiu Chaofan; AIX32-NEXT: slw r5, r5, r6 212*b922a362SQiu Chaofan; AIX32-NEXT: or r3, r5, r3 213*b922a362SQiu Chaofan; AIX32-NEXT: or r4, r4, r8 214*b922a362SQiu Chaofan; AIX32-NEXT: clrlwi r3, r3, 8 215d0e1e764SStefan Pintilie; AIX32-NEXT: blr 216d0e1e764SStefan Pintilie; 217d0e1e764SStefan Pintilie; AIX64-LABEL: rotatemask64_nocount: 218d0e1e764SStefan Pintilie; AIX64: # %bb.0: # %entry 219492c1f3dSStefan Pintilie; AIX64-NEXT: rldcl r3, r3, r4, 8 220d0e1e764SStefan Pintilie; AIX64-NEXT: blr 221d0e1e764SStefan Pintilie; 222d0e1e764SStefan Pintilie; LINUX64BE-LABEL: rotatemask64_nocount: 223d0e1e764SStefan Pintilie; LINUX64BE: # %bb.0: # %entry 224492c1f3dSStefan Pintilie; LINUX64BE-NEXT: rldcl r3, r3, r4, 8 225d0e1e764SStefan Pintilie; LINUX64BE-NEXT: blr 226d0e1e764SStefan Pintilie; 227d0e1e764SStefan Pintilie; LINUX64LE-LABEL: rotatemask64_nocount: 228d0e1e764SStefan Pintilie; LINUX64LE: # %bb.0: # %entry 229492c1f3dSStefan Pintilie; LINUX64LE-NEXT: rldcl r3, r3, r4, 8 230d0e1e764SStefan Pintilie; LINUX64LE-NEXT: blr 231d0e1e764SStefan Pintilieentry: 232d0e1e764SStefan Pintilie %0 = tail call i64 @llvm.fshl.i64(i64 %word, i64 %word, i64 %clz) 233d0e1e764SStefan Pintilie %and = and i64 %0, 72057594037927935 234d0e1e764SStefan Pintilie ret i64 %and 235d0e1e764SStefan Pintilie} 236d0e1e764SStefan Pintilie 237d0e1e764SStefan Pintiliedefine dso_local i64 @builtincheck(i64 noundef %word, i64 noundef %shift) local_unnamed_addr #0 { 238d0e1e764SStefan Pintilie; AIX32-LABEL: builtincheck: 239d0e1e764SStefan Pintilie; AIX32: # %bb.0: # %entry 240d0e1e764SStefan Pintilie; AIX32-NEXT: andi. r5, r6, 32 241*b922a362SQiu Chaofan; AIX32-NEXT: clrlwi r6, r6, 27 242*b922a362SQiu Chaofan; AIX32-NEXT: subfic r7, r6, 32 243*b922a362SQiu Chaofan; AIX32-NEXT: iseleq r5, r3, r4 244d0e1e764SStefan Pintilie; AIX32-NEXT: iseleq r3, r4, r3 245*b922a362SQiu Chaofan; AIX32-NEXT: srw r8, r5, r7 246*b922a362SQiu Chaofan; AIX32-NEXT: slw r4, r3, r6 247*b922a362SQiu Chaofan; AIX32-NEXT: srw r3, r3, r7 248*b922a362SQiu Chaofan; AIX32-NEXT: slw r5, r5, r6 249*b922a362SQiu Chaofan; AIX32-NEXT: or r3, r5, r3 250*b922a362SQiu Chaofan; AIX32-NEXT: or r4, r4, r8 251*b922a362SQiu Chaofan; AIX32-NEXT: clrlwi r3, r3, 1 252d0e1e764SStefan Pintilie; AIX32-NEXT: blr 253d0e1e764SStefan Pintilie; 254d0e1e764SStefan Pintilie; AIX64-LABEL: builtincheck: 255d0e1e764SStefan Pintilie; AIX64: # %bb.0: # %entry 256492c1f3dSStefan Pintilie; AIX64-NEXT: rldcl r3, r3, r4, 1 257d0e1e764SStefan Pintilie; AIX64-NEXT: blr 258d0e1e764SStefan Pintilie; 259d0e1e764SStefan Pintilie; LINUX64BE-LABEL: builtincheck: 260d0e1e764SStefan Pintilie; LINUX64BE: # %bb.0: # %entry 261492c1f3dSStefan Pintilie; LINUX64BE-NEXT: rldcl r3, r3, r4, 1 262d0e1e764SStefan Pintilie; LINUX64BE-NEXT: blr 263d0e1e764SStefan Pintilie; 264d0e1e764SStefan Pintilie; LINUX64LE-LABEL: builtincheck: 265d0e1e764SStefan Pintilie; LINUX64LE: # %bb.0: # %entry 266492c1f3dSStefan Pintilie; LINUX64LE-NEXT: rldcl r3, r3, r4, 1 267d0e1e764SStefan Pintilie; LINUX64LE-NEXT: blr 268d0e1e764SStefan Pintilieentry: 269d0e1e764SStefan Pintilie %0 = tail call i64 @llvm.fshl.i64(i64 %word, i64 %word, i64 %shift) 270d0e1e764SStefan Pintilie %1 = and i64 %0, 9223372036854775807 271d0e1e764SStefan Pintilie ret i64 %1 272d0e1e764SStefan Pintilie} 273d0e1e764SStefan Pintilie 274d0e1e764SStefan Pintiliedefine dso_local i64 @immshift(i64 noundef %word) local_unnamed_addr #0 { 275d0e1e764SStefan Pintilie; AIX32-LABEL: immshift: 276d0e1e764SStefan Pintilie; AIX32: # %bb.0: # %entry 277d0e1e764SStefan Pintilie; AIX32-NEXT: rotlwi r5, r3, 15 278d0e1e764SStefan Pintilie; AIX32-NEXT: rlwimi r5, r4, 15, 0, 16 279*b922a362SQiu Chaofan; AIX32-NEXT: srwi r4, r4, 17 280*b922a362SQiu Chaofan; AIX32-NEXT: rlwimi r4, r3, 15, 12, 16 281*b922a362SQiu Chaofan; AIX32-NEXT: mr r3, r4 282d0e1e764SStefan Pintilie; AIX32-NEXT: mr r4, r5 283d0e1e764SStefan Pintilie; AIX32-NEXT: blr 284d0e1e764SStefan Pintilie; 285d0e1e764SStefan Pintilie; AIX64-LABEL: immshift: 286d0e1e764SStefan Pintilie; AIX64: # %bb.0: # %entry 287d0e1e764SStefan Pintilie; AIX64-NEXT: rldicl r3, r3, 15, 12 288d0e1e764SStefan Pintilie; AIX64-NEXT: blr 289d0e1e764SStefan Pintilie; 290d0e1e764SStefan Pintilie; LINUX64BE-LABEL: immshift: 291d0e1e764SStefan Pintilie; LINUX64BE: # %bb.0: # %entry 292d0e1e764SStefan Pintilie; LINUX64BE-NEXT: rldicl r3, r3, 15, 12 293d0e1e764SStefan Pintilie; LINUX64BE-NEXT: blr 294d0e1e764SStefan Pintilie; 295d0e1e764SStefan Pintilie; LINUX64LE-LABEL: immshift: 296d0e1e764SStefan Pintilie; LINUX64LE: # %bb.0: # %entry 297d0e1e764SStefan Pintilie; LINUX64LE-NEXT: rldicl r3, r3, 15, 12 298d0e1e764SStefan Pintilie; LINUX64LE-NEXT: blr 299d0e1e764SStefan Pintilieentry: 300d0e1e764SStefan Pintilie %0 = tail call i64 @llvm.fshl.i64(i64 %word, i64 %word, i64 15) 301d0e1e764SStefan Pintilie %and = and i64 %0, 4503599627370495 302d0e1e764SStefan Pintilie ret i64 %and 303d0e1e764SStefan Pintilie} 304d0e1e764SStefan Pintilie 305d0e1e764SStefan Pintiliedefine dso_local i64 @twomasks(i64 noundef %word) local_unnamed_addr #0 { 306d0e1e764SStefan Pintilie; AIX32-LABEL: twomasks: 307d0e1e764SStefan Pintilie; AIX32: # %bb.0: # %entry 308d0e1e764SStefan Pintilie; AIX32-NEXT: mflr r0 309d0e1e764SStefan Pintilie; AIX32-NEXT: stwu r1, -64(r1) 310d0e1e764SStefan Pintilie; AIX32-NEXT: cmplwi r3, 0 311*b922a362SQiu Chaofan; AIX32-NEXT: cntlzw r6, r4 312*b922a362SQiu Chaofan; AIX32-NEXT: stw r0, 72(r1) 313*b922a362SQiu Chaofan; AIX32-NEXT: addi r6, r6, 32 314*b922a362SQiu Chaofan; AIX32-NEXT: cntlzw r5, r3 315*b922a362SQiu Chaofan; AIX32-NEXT: iseleq r5, r6, r5 316d0e1e764SStefan Pintilie; AIX32-NEXT: andi. r6, r5, 32 317d0e1e764SStefan Pintilie; AIX32-NEXT: clrlwi r5, r5, 27 318d0e1e764SStefan Pintilie; AIX32-NEXT: iseleq r6, r3, r4 319d0e1e764SStefan Pintilie; AIX32-NEXT: iseleq r3, r4, r3 320*b922a362SQiu Chaofan; AIX32-NEXT: subfic r7, r5, 32 321*b922a362SQiu Chaofan; AIX32-NEXT: srw r8, r6, r7 322*b922a362SQiu Chaofan; AIX32-NEXT: slw r4, r3, r5 323*b922a362SQiu Chaofan; AIX32-NEXT: srw r3, r3, r7 324*b922a362SQiu Chaofan; AIX32-NEXT: slw r5, r6, r5 325*b922a362SQiu Chaofan; AIX32-NEXT: or r4, r4, r8 326*b922a362SQiu Chaofan; AIX32-NEXT: or r5, r5, r3 327d0e1e764SStefan Pintilie; AIX32-NEXT: clrlwi r3, r5, 1 328d0e1e764SStefan Pintilie; AIX32-NEXT: clrlwi r5, r5, 16 329d0e1e764SStefan Pintilie; AIX32-NEXT: mr r6, r4 330d0e1e764SStefan Pintilie; AIX32-NEXT: bl .callee[PR] 331d0e1e764SStefan Pintilie; AIX32-NEXT: nop 332d0e1e764SStefan Pintilie; AIX32-NEXT: addi r1, r1, 64 333d0e1e764SStefan Pintilie; AIX32-NEXT: lwz r0, 8(r1) 334d0e1e764SStefan Pintilie; AIX32-NEXT: mtlr r0 335d0e1e764SStefan Pintilie; AIX32-NEXT: blr 336d0e1e764SStefan Pintilie; 337d0e1e764SStefan Pintilie; AIX64-LABEL: twomasks: 338d0e1e764SStefan Pintilie; AIX64: # %bb.0: # %entry 339d0e1e764SStefan Pintilie; AIX64-NEXT: mflr r0 340d0e1e764SStefan Pintilie; AIX64-NEXT: stdu r1, -112(r1) 341d0e1e764SStefan Pintilie; AIX64-NEXT: cntlzd r4, r3 342d0e1e764SStefan Pintilie; AIX64-NEXT: std r0, 128(r1) 343492c1f3dSStefan Pintilie; AIX64-NEXT: rldcl r5, r3, r4, 1 344492c1f3dSStefan Pintilie; AIX64-NEXT: rldcl r4, r3, r4, 16 345492c1f3dSStefan Pintilie; AIX64-NEXT: mr r3, r5 346d0e1e764SStefan Pintilie; AIX64-NEXT: bl .callee[PR] 347d0e1e764SStefan Pintilie; AIX64-NEXT: nop 348d0e1e764SStefan Pintilie; AIX64-NEXT: addi r1, r1, 112 349d0e1e764SStefan Pintilie; AIX64-NEXT: ld r0, 16(r1) 350d0e1e764SStefan Pintilie; AIX64-NEXT: mtlr r0 351d0e1e764SStefan Pintilie; AIX64-NEXT: blr 352d0e1e764SStefan Pintilie; 353d0e1e764SStefan Pintilie; LINUX64BE-LABEL: twomasks: 354d0e1e764SStefan Pintilie; LINUX64BE: # %bb.0: # %entry 355d0e1e764SStefan Pintilie; LINUX64BE-NEXT: mflr r0 356d0e1e764SStefan Pintilie; LINUX64BE-NEXT: stdu r1, -112(r1) 357d0e1e764SStefan Pintilie; LINUX64BE-NEXT: cntlzd r4, r3 358d0e1e764SStefan Pintilie; LINUX64BE-NEXT: std r0, 128(r1) 359492c1f3dSStefan Pintilie; LINUX64BE-NEXT: rldcl r5, r3, r4, 1 360492c1f3dSStefan Pintilie; LINUX64BE-NEXT: rldcl r4, r3, r4, 16 361492c1f3dSStefan Pintilie; LINUX64BE-NEXT: mr r3, r5 362d0e1e764SStefan Pintilie; LINUX64BE-NEXT: bl callee 363d0e1e764SStefan Pintilie; LINUX64BE-NEXT: nop 364d0e1e764SStefan Pintilie; LINUX64BE-NEXT: addi r1, r1, 112 365d0e1e764SStefan Pintilie; LINUX64BE-NEXT: ld r0, 16(r1) 366d0e1e764SStefan Pintilie; LINUX64BE-NEXT: mtlr r0 367d0e1e764SStefan Pintilie; LINUX64BE-NEXT: blr 368d0e1e764SStefan Pintilie; 369d0e1e764SStefan Pintilie; LINUX64LE-LABEL: twomasks: 370d0e1e764SStefan Pintilie; LINUX64LE: # %bb.0: # %entry 371d0e1e764SStefan Pintilie; LINUX64LE-NEXT: mflr r0 372d0e1e764SStefan Pintilie; LINUX64LE-NEXT: stdu r1, -32(r1) 373d0e1e764SStefan Pintilie; LINUX64LE-NEXT: cntlzd r4, r3 374d0e1e764SStefan Pintilie; LINUX64LE-NEXT: std r0, 48(r1) 375492c1f3dSStefan Pintilie; LINUX64LE-NEXT: rldcl r5, r3, r4, 1 376492c1f3dSStefan Pintilie; LINUX64LE-NEXT: rldcl r4, r3, r4, 16 377492c1f3dSStefan Pintilie; LINUX64LE-NEXT: mr r3, r5 378d0e1e764SStefan Pintilie; LINUX64LE-NEXT: bl callee 379d0e1e764SStefan Pintilie; LINUX64LE-NEXT: nop 380d0e1e764SStefan Pintilie; LINUX64LE-NEXT: addi r1, r1, 32 381d0e1e764SStefan Pintilie; LINUX64LE-NEXT: ld r0, 16(r1) 382d0e1e764SStefan Pintilie; LINUX64LE-NEXT: mtlr r0 383d0e1e764SStefan Pintilie; LINUX64LE-NEXT: blr 384d0e1e764SStefan Pintilieentry: 385d0e1e764SStefan Pintilie %0 = tail call i64 @llvm.ctlz.i64(i64 %word, i1 false) 386d0e1e764SStefan Pintilie %1 = tail call i64 @llvm.fshl.i64(i64 %word, i64 %word, i64 %0) 387d0e1e764SStefan Pintilie %and = and i64 %1, 9223372036854775807 388d0e1e764SStefan Pintilie %and1 = and i64 %1, 281474976710655 389d0e1e764SStefan Pintilie %call = tail call i64 @callee(i64 noundef %and, i64 noundef %and1) #0 390d0e1e764SStefan Pintilie ret i64 %call 391d0e1e764SStefan Pintilie} 392d0e1e764SStefan Pintilie 393d0e1e764SStefan Pintiliedeclare i64 @callee(i64 noundef, i64 noundef) local_unnamed_addr #0 394d0e1e764SStefan Pintilie 395d0e1e764SStefan Pintiliedefine dso_local i64 @tworotates(i64 noundef %word) local_unnamed_addr #0 { 396d0e1e764SStefan Pintilie; AIX32-LABEL: tworotates: 397d0e1e764SStefan Pintilie; AIX32: # %bb.0: # %entry 398d0e1e764SStefan Pintilie; AIX32-NEXT: mflr r0 399d0e1e764SStefan Pintilie; AIX32-NEXT: stwu r1, -64(r1) 400d0e1e764SStefan Pintilie; AIX32-NEXT: cmplwi r3, 0 401*b922a362SQiu Chaofan; AIX32-NEXT: cntlzw r6, r4 402*b922a362SQiu Chaofan; AIX32-NEXT: stw r0, 72(r1) 403*b922a362SQiu Chaofan; AIX32-NEXT: addi r6, r6, 32 404*b922a362SQiu Chaofan; AIX32-NEXT: cntlzw r5, r3 405*b922a362SQiu Chaofan; AIX32-NEXT: iseleq r5, r6, r5 406d0e1e764SStefan Pintilie; AIX32-NEXT: andi. r6, r5, 32 407d0e1e764SStefan Pintilie; AIX32-NEXT: clrlwi r5, r5, 27 408*b922a362SQiu Chaofan; AIX32-NEXT: iseleq r6, r3, r4 409d0e1e764SStefan Pintilie; AIX32-NEXT: iseleq r9, r4, r3 410*b922a362SQiu Chaofan; AIX32-NEXT: subfic r7, r5, 32 411*b922a362SQiu Chaofan; AIX32-NEXT: srw r8, r6, r7 412*b922a362SQiu Chaofan; AIX32-NEXT: slw r10, r9, r5 413*b922a362SQiu Chaofan; AIX32-NEXT: srw r7, r9, r7 414*b922a362SQiu Chaofan; AIX32-NEXT: slw r5, r6, r5 415*b922a362SQiu Chaofan; AIX32-NEXT: rotlwi r6, r3, 23 416*b922a362SQiu Chaofan; AIX32-NEXT: or r5, r5, r7 417*b922a362SQiu Chaofan; AIX32-NEXT: or r8, r10, r8 418d0e1e764SStefan Pintilie; AIX32-NEXT: rlwimi r6, r4, 23, 0, 8 419*b922a362SQiu Chaofan; AIX32-NEXT: clrlwi r7, r5, 1 420*b922a362SQiu Chaofan; AIX32-NEXT: srwi r5, r4, 9 421*b922a362SQiu Chaofan; AIX32-NEXT: mr r4, r8 422d0e1e764SStefan Pintilie; AIX32-NEXT: rlwimi r5, r3, 23, 1, 8 423d0e1e764SStefan Pintilie; AIX32-NEXT: mr r3, r7 424d0e1e764SStefan Pintilie; AIX32-NEXT: bl .callee[PR] 425d0e1e764SStefan Pintilie; AIX32-NEXT: nop 426d0e1e764SStefan Pintilie; AIX32-NEXT: addi r1, r1, 64 427d0e1e764SStefan Pintilie; AIX32-NEXT: lwz r0, 8(r1) 428d0e1e764SStefan Pintilie; AIX32-NEXT: mtlr r0 429d0e1e764SStefan Pintilie; AIX32-NEXT: blr 430d0e1e764SStefan Pintilie; 431d0e1e764SStefan Pintilie; AIX64-LABEL: tworotates: 432d0e1e764SStefan Pintilie; AIX64: # %bb.0: # %entry 433d0e1e764SStefan Pintilie; AIX64-NEXT: mflr r0 434d0e1e764SStefan Pintilie; AIX64-NEXT: stdu r1, -112(r1) 435d0e1e764SStefan Pintilie; AIX64-NEXT: cntlzd r4, r3 436d0e1e764SStefan Pintilie; AIX64-NEXT: std r0, 128(r1) 437492c1f3dSStefan Pintilie; AIX64-NEXT: rldcl r5, r3, r4, 1 438d0e1e764SStefan Pintilie; AIX64-NEXT: rldicl r4, r3, 23, 1 439d0e1e764SStefan Pintilie; AIX64-NEXT: mr r3, r5 440d0e1e764SStefan Pintilie; AIX64-NEXT: bl .callee[PR] 441d0e1e764SStefan Pintilie; AIX64-NEXT: nop 442d0e1e764SStefan Pintilie; AIX64-NEXT: addi r1, r1, 112 443d0e1e764SStefan Pintilie; AIX64-NEXT: ld r0, 16(r1) 444d0e1e764SStefan Pintilie; AIX64-NEXT: mtlr r0 445d0e1e764SStefan Pintilie; AIX64-NEXT: blr 446d0e1e764SStefan Pintilie; 447d0e1e764SStefan Pintilie; LINUX64BE-LABEL: tworotates: 448d0e1e764SStefan Pintilie; LINUX64BE: # %bb.0: # %entry 449d0e1e764SStefan Pintilie; LINUX64BE-NEXT: mflr r0 450d0e1e764SStefan Pintilie; LINUX64BE-NEXT: stdu r1, -112(r1) 451d0e1e764SStefan Pintilie; LINUX64BE-NEXT: cntlzd r4, r3 452d0e1e764SStefan Pintilie; LINUX64BE-NEXT: std r0, 128(r1) 453492c1f3dSStefan Pintilie; LINUX64BE-NEXT: rldcl r5, r3, r4, 1 454d0e1e764SStefan Pintilie; LINUX64BE-NEXT: rldicl r4, r3, 23, 1 455d0e1e764SStefan Pintilie; LINUX64BE-NEXT: mr r3, r5 456d0e1e764SStefan Pintilie; LINUX64BE-NEXT: bl callee 457d0e1e764SStefan Pintilie; LINUX64BE-NEXT: nop 458d0e1e764SStefan Pintilie; LINUX64BE-NEXT: addi r1, r1, 112 459d0e1e764SStefan Pintilie; LINUX64BE-NEXT: ld r0, 16(r1) 460d0e1e764SStefan Pintilie; LINUX64BE-NEXT: mtlr r0 461d0e1e764SStefan Pintilie; LINUX64BE-NEXT: blr 462d0e1e764SStefan Pintilie; 463d0e1e764SStefan Pintilie; LINUX64LE-LABEL: tworotates: 464d0e1e764SStefan Pintilie; LINUX64LE: # %bb.0: # %entry 465d0e1e764SStefan Pintilie; LINUX64LE-NEXT: mflr r0 466d0e1e764SStefan Pintilie; LINUX64LE-NEXT: stdu r1, -32(r1) 467d0e1e764SStefan Pintilie; LINUX64LE-NEXT: cntlzd r4, r3 468d0e1e764SStefan Pintilie; LINUX64LE-NEXT: std r0, 48(r1) 469492c1f3dSStefan Pintilie; LINUX64LE-NEXT: rldcl r5, r3, r4, 1 470d0e1e764SStefan Pintilie; LINUX64LE-NEXT: rldicl r4, r3, 23, 1 471d0e1e764SStefan Pintilie; LINUX64LE-NEXT: mr r3, r5 472d0e1e764SStefan Pintilie; LINUX64LE-NEXT: bl callee 473d0e1e764SStefan Pintilie; LINUX64LE-NEXT: nop 474d0e1e764SStefan Pintilie; LINUX64LE-NEXT: addi r1, r1, 32 475d0e1e764SStefan Pintilie; LINUX64LE-NEXT: ld r0, 16(r1) 476d0e1e764SStefan Pintilie; LINUX64LE-NEXT: mtlr r0 477d0e1e764SStefan Pintilie; LINUX64LE-NEXT: blr 478d0e1e764SStefan Pintilieentry: 479d0e1e764SStefan Pintilie %0 = tail call i64 @llvm.ctlz.i64(i64 %word, i1 false) 480d0e1e764SStefan Pintilie %1 = tail call i64 @llvm.fshl.i64(i64 %word, i64 %word, i64 %0) 481d0e1e764SStefan Pintilie %2 = tail call i64 @llvm.fshl.i64(i64 %word, i64 %word, i64 23) 482d0e1e764SStefan Pintilie %and = and i64 %1, 9223372036854775807 483d0e1e764SStefan Pintilie %and1 = and i64 %2, 9223372036854775807 484d0e1e764SStefan Pintilie %call = tail call i64 @callee(i64 noundef %and, i64 noundef %and1) #0 485d0e1e764SStefan Pintilie ret i64 %call 486d0e1e764SStefan Pintilie} 487d0e1e764SStefan Pintilie 488d0e1e764SStefan Pintilieattributes #0 = { nounwind } 489