1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -mtriple=thumbv8.1m.main -mattr=+mve -verify-machineinstrs -o - %s | FileCheck %s 3 4define i64 @test_asrl(i64 %value, i32 %shift) { 5; CHECK-LABEL: test_asrl: 6; CHECK: @ %bb.0: @ %entry 7; CHECK-NEXT: asrl r0, r1, r2 8; CHECK-NEXT: bx lr 9entry: 10 %0 = lshr i64 %value, 32 11 %1 = trunc i64 %0 to i32 12 %2 = trunc i64 %value to i32 13 %3 = call { i32, i32 } @llvm.arm.mve.asrl(i32 %2, i32 %1, i32 %shift) 14 %4 = extractvalue { i32, i32 } %3, 1 15 %5 = zext i32 %4 to i64 16 %6 = shl i64 %5, 32 17 %7 = extractvalue { i32, i32 } %3, 0 18 %8 = zext i32 %7 to i64 19 %9 = or i64 %6, %8 20 ret i64 %9 21} 22 23declare { i32, i32 } @llvm.arm.mve.asrl(i32, i32, i32) 24 25define i64 @test_lsll(i64 %value, i32 %shift) { 26; CHECK-LABEL: test_lsll: 27; CHECK: @ %bb.0: @ %entry 28; CHECK-NEXT: lsll r0, r1, r2 29; CHECK-NEXT: bx lr 30entry: 31 %0 = lshr i64 %value, 32 32 %1 = trunc i64 %0 to i32 33 %2 = trunc i64 %value to i32 34 %3 = call { i32, i32 } @llvm.arm.mve.lsll(i32 %2, i32 %1, i32 %shift) 35 %4 = extractvalue { i32, i32 } %3, 1 36 %5 = zext i32 %4 to i64 37 %6 = shl i64 %5, 32 38 %7 = extractvalue { i32, i32 } %3, 0 39 %8 = zext i32 %7 to i64 40 %9 = or i64 %6, %8 41 ret i64 %9 42} 43 44declare { i32, i32 } @llvm.arm.mve.lsll(i32, i32, i32) 45 46define i32 @test_sqrshr(i32 %value, i32 %shift) { 47; CHECK-LABEL: test_sqrshr: 48; CHECK: @ %bb.0: @ %entry 49; CHECK-NEXT: sqrshr r0, r1 50; CHECK-NEXT: bx lr 51entry: 52 %0 = call i32 @llvm.arm.mve.sqrshr(i32 %value, i32 %shift) 53 ret i32 %0 54} 55 56declare i32 @llvm.arm.mve.sqrshr(i32, i32) 57 58define i64 @test_sqrshrl(i64 %value, i32 %shift) { 59; CHECK-LABEL: test_sqrshrl: 60; CHECK: @ %bb.0: @ %entry 61; CHECK-NEXT: sqrshrl r0, r1, #64, r2 62; CHECK-NEXT: bx lr 63entry: 64 %0 = lshr i64 %value, 32 65 %1 = trunc i64 %0 to i32 66 %2 = trunc i64 %value to i32 67 %3 = call { i32, i32 } @llvm.arm.mve.sqrshrl(i32 %2, i32 %1, i32 %shift, i32 64) 68 %4 = extractvalue { i32, i32 } %3, 1 69 %5 = zext i32 %4 to i64 70 %6 = shl i64 %5, 32 71 %7 = extractvalue { i32, i32 } %3, 0 72 %8 = zext i32 %7 to i64 73 %9 = or i64 %6, %8 74 ret i64 %9 75} 76 77declare { i32, i32 } @llvm.arm.mve.sqrshrl(i32, i32, i32, i32) 78 79define i64 @test_sqrshrl_sat48(i64 %value, i32 %shift) { 80; CHECK-LABEL: test_sqrshrl_sat48: 81; CHECK: @ %bb.0: @ %entry 82; CHECK-NEXT: sqrshrl r0, r1, #48, r2 83; CHECK-NEXT: bx lr 84entry: 85 %0 = lshr i64 %value, 32 86 %1 = trunc i64 %0 to i32 87 %2 = trunc i64 %value to i32 88 %3 = call { i32, i32 } @llvm.arm.mve.sqrshrl(i32 %2, i32 %1, i32 %shift, i32 48) 89 %4 = extractvalue { i32, i32 } %3, 1 90 %5 = zext i32 %4 to i64 91 %6 = shl i64 %5, 32 92 %7 = extractvalue { i32, i32 } %3, 0 93 %8 = zext i32 %7 to i64 94 %9 = or i64 %6, %8 95 ret i64 %9 96} 97 98define i32 @test_sqshl(i32 %value) { 99; CHECK-LABEL: test_sqshl: 100; CHECK: @ %bb.0: @ %entry 101; CHECK-NEXT: sqshl r0, #2 102; CHECK-NEXT: bx lr 103entry: 104 %0 = call i32 @llvm.arm.mve.sqshl(i32 %value, i32 2) 105 ret i32 %0 106} 107 108declare i32 @llvm.arm.mve.sqshl(i32, i32) 109 110define i64 @test_sqshll(i64 %value) { 111; CHECK-LABEL: test_sqshll: 112; CHECK: @ %bb.0: @ %entry 113; CHECK-NEXT: sqshll r0, r1, #17 114; CHECK-NEXT: bx lr 115entry: 116 %0 = lshr i64 %value, 32 117 %1 = trunc i64 %0 to i32 118 %2 = trunc i64 %value to i32 119 %3 = call { i32, i32 } @llvm.arm.mve.sqshll(i32 %2, i32 %1, i32 17) 120 %4 = extractvalue { i32, i32 } %3, 1 121 %5 = zext i32 %4 to i64 122 %6 = shl i64 %5, 32 123 %7 = extractvalue { i32, i32 } %3, 0 124 %8 = zext i32 %7 to i64 125 %9 = or i64 %6, %8 126 ret i64 %9 127} 128 129declare { i32, i32 } @llvm.arm.mve.sqshll(i32, i32, i32) 130 131define i32 @test_srshr(i32 %value) { 132; CHECK-LABEL: test_srshr: 133; CHECK: @ %bb.0: @ %entry 134; CHECK-NEXT: srshr r0, #6 135; CHECK-NEXT: bx lr 136entry: 137 %0 = call i32 @llvm.arm.mve.srshr(i32 %value, i32 6) 138 ret i32 %0 139} 140 141declare i32 @llvm.arm.mve.srshr(i32, i32) 142 143define i64 @test_srshrl(i64 %value) { 144; CHECK-LABEL: test_srshrl: 145; CHECK: @ %bb.0: @ %entry 146; CHECK-NEXT: srshrl r0, r1, #26 147; CHECK-NEXT: bx lr 148entry: 149 %0 = lshr i64 %value, 32 150 %1 = trunc i64 %0 to i32 151 %2 = trunc i64 %value to i32 152 %3 = call { i32, i32 } @llvm.arm.mve.srshrl(i32 %2, i32 %1, i32 26) 153 %4 = extractvalue { i32, i32 } %3, 1 154 %5 = zext i32 %4 to i64 155 %6 = shl i64 %5, 32 156 %7 = extractvalue { i32, i32 } %3, 0 157 %8 = zext i32 %7 to i64 158 %9 = or i64 %6, %8 159 ret i64 %9 160} 161 162declare { i32, i32 } @llvm.arm.mve.srshrl(i32, i32, i32) 163 164define i32 @test_uqrshl(i32 %value, i32 %shift) { 165; CHECK-LABEL: test_uqrshl: 166; CHECK: @ %bb.0: @ %entry 167; CHECK-NEXT: uqrshl r0, r1 168; CHECK-NEXT: bx lr 169entry: 170 %0 = call i32 @llvm.arm.mve.uqrshl(i32 %value, i32 %shift) 171 ret i32 %0 172} 173 174declare i32 @llvm.arm.mve.uqrshl(i32, i32) 175 176define i64 @test_uqrshll(i64 %value, i32 %shift) { 177; CHECK-LABEL: test_uqrshll: 178; CHECK: @ %bb.0: @ %entry 179; CHECK-NEXT: uqrshll r0, r1, #64, r2 180; CHECK-NEXT: bx lr 181entry: 182 %0 = lshr i64 %value, 32 183 %1 = trunc i64 %0 to i32 184 %2 = trunc i64 %value to i32 185 %3 = call { i32, i32 } @llvm.arm.mve.uqrshll(i32 %2, i32 %1, i32 %shift, i32 64) 186 %4 = extractvalue { i32, i32 } %3, 1 187 %5 = zext i32 %4 to i64 188 %6 = shl i64 %5, 32 189 %7 = extractvalue { i32, i32 } %3, 0 190 %8 = zext i32 %7 to i64 191 %9 = or i64 %6, %8 192 ret i64 %9 193} 194 195declare { i32, i32 } @llvm.arm.mve.uqrshll(i32, i32, i32, i32) 196 197define i64 @test_uqrshll_sat48(i64 %value, i32 %shift) { 198; CHECK-LABEL: test_uqrshll_sat48: 199; CHECK: @ %bb.0: @ %entry 200; CHECK-NEXT: uqrshll r0, r1, #48, r2 201; CHECK-NEXT: bx lr 202entry: 203 %0 = lshr i64 %value, 32 204 %1 = trunc i64 %0 to i32 205 %2 = trunc i64 %value to i32 206 %3 = call { i32, i32 } @llvm.arm.mve.uqrshll(i32 %2, i32 %1, i32 %shift, i32 48) 207 %4 = extractvalue { i32, i32 } %3, 1 208 %5 = zext i32 %4 to i64 209 %6 = shl i64 %5, 32 210 %7 = extractvalue { i32, i32 } %3, 0 211 %8 = zext i32 %7 to i64 212 %9 = or i64 %6, %8 213 ret i64 %9 214} 215 216define i32 @test_uqshl(i32 %value) { 217; CHECK-LABEL: test_uqshl: 218; CHECK: @ %bb.0: @ %entry 219; CHECK-NEXT: uqshl r0, #21 220; CHECK-NEXT: bx lr 221entry: 222 %0 = call i32 @llvm.arm.mve.uqshl(i32 %value, i32 21) 223 ret i32 %0 224} 225 226declare i32 @llvm.arm.mve.uqshl(i32, i32) 227 228define i64 @test_uqshll(i64 %value) { 229; CHECK-LABEL: test_uqshll: 230; CHECK: @ %bb.0: @ %entry 231; CHECK-NEXT: uqshll r0, r1, #16 232; CHECK-NEXT: bx lr 233entry: 234 %0 = lshr i64 %value, 32 235 %1 = trunc i64 %0 to i32 236 %2 = trunc i64 %value to i32 237 %3 = call { i32, i32 } @llvm.arm.mve.uqshll(i32 %2, i32 %1, i32 16) 238 %4 = extractvalue { i32, i32 } %3, 1 239 %5 = zext i32 %4 to i64 240 %6 = shl i64 %5, 32 241 %7 = extractvalue { i32, i32 } %3, 0 242 %8 = zext i32 %7 to i64 243 %9 = or i64 %6, %8 244 ret i64 %9 245} 246 247declare { i32, i32 } @llvm.arm.mve.uqshll(i32, i32, i32) 248 249define i32 @test_urshr(i32 %value) { 250; CHECK-LABEL: test_urshr: 251; CHECK: @ %bb.0: @ %entry 252; CHECK-NEXT: urshr r0, #22 253; CHECK-NEXT: bx lr 254entry: 255 %0 = call i32 @llvm.arm.mve.urshr(i32 %value, i32 22) 256 ret i32 %0 257} 258 259declare i32 @llvm.arm.mve.urshr(i32, i32) 260 261define i64 @test_urshrl(i64 %value) { 262; CHECK-LABEL: test_urshrl: 263; CHECK: @ %bb.0: @ %entry 264; CHECK-NEXT: urshrl r0, r1, #6 265; CHECK-NEXT: bx lr 266entry: 267 %0 = lshr i64 %value, 32 268 %1 = trunc i64 %0 to i32 269 %2 = trunc i64 %value to i32 270 %3 = call { i32, i32 } @llvm.arm.mve.urshrl(i32 %2, i32 %1, i32 6) 271 %4 = extractvalue { i32, i32 } %3, 1 272 %5 = zext i32 %4 to i64 273 %6 = shl i64 %5, 32 274 %7 = extractvalue { i32, i32 } %3, 0 275 %8 = zext i32 %7 to i64 276 %9 = or i64 %6, %8 277 ret i64 %9 278} 279 280declare { i32, i32 } @llvm.arm.mve.urshrl(i32, i32, i32) 281