1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -O0 -mtriple=riscv32 -mattr=+m -mattr=+xcvalu -verify-machineinstrs < %s \ 3; RUN: | FileCheck %s 4 5declare i32 @llvm.abs.i32(i32, i1) 6declare i32 @llvm.smin.i32(i32, i32) 7declare i32 @llvm.smax.i32(i32, i32) 8declare i32 @llvm.umin.i32(i32, i32) 9declare i32 @llvm.umax.i32(i32, i32) 10 11define i32 @abs(i32 %a) { 12; CHECK-LABEL: abs: 13; CHECK: # %bb.0: 14; CHECK-NEXT: cv.abs a0, a0 15; CHECK-NEXT: ret 16 %1 = call i32 @llvm.abs.i32(i32 %a, i1 false) 17 ret i32 %1 18} 19 20define i1 @slet(i32 %a, i32 %b) { 21; CHECK-LABEL: slet: 22; CHECK: # %bb.0: 23; CHECK-NEXT: cv.sle a0, a0, a1 24; CHECK-NEXT: ret 25 %1 = icmp sle i32 %a, %b 26 ret i1 %1 27} 28 29define i1 @sletu(i32 %a, i32 %b) { 30; CHECK-LABEL: sletu: 31; CHECK: # %bb.0: 32; CHECK-NEXT: cv.sleu a0, a0, a1 33; CHECK-NEXT: ret 34 %1 = icmp ule i32 %a, %b 35 ret i1 %1 36} 37 38define i32 @smin(i32 %a, i32 %b) { 39; CHECK-LABEL: smin: 40; CHECK: # %bb.0: 41; CHECK-NEXT: cv.min a0, a0, a1 42; CHECK-NEXT: ret 43 %1 = call i32 @llvm.smin.i32(i32 %a, i32 %b) 44 ret i32 %1 45} 46 47define i32 @umin(i32 %a, i32 %b) { 48; CHECK-LABEL: umin: 49; CHECK: # %bb.0: 50; CHECK-NEXT: cv.minu a0, a0, a1 51; CHECK-NEXT: ret 52 %1 = call i32 @llvm.umin.i32(i32 %a, i32 %b) 53 ret i32 %1 54} 55 56define i32 @smax(i32 %a, i32 %b) { 57; CHECK-LABEL: smax: 58; CHECK: # %bb.0: 59; CHECK-NEXT: cv.max a0, a0, a1 60; CHECK-NEXT: ret 61 %1 = call i32 @llvm.smax.i32(i32 %a, i32 %b) 62 ret i32 %1 63} 64 65define i32 @umax(i32 %a, i32 %b) { 66; CHECK-LABEL: umax: 67; CHECK: # %bb.0: 68; CHECK-NEXT: cv.maxu a0, a0, a1 69; CHECK-NEXT: ret 70 %1 = call i32 @llvm.umax.i32(i32 %a, i32 %b) 71 ret i32 %1 72} 73 74define i32 @exths(i16 %a) { 75; CHECK-LABEL: exths: 76; CHECK: # %bb.0: 77; CHECK-NEXT: # kill: def $x11 killed $x10 78; CHECK-NEXT: cv.exths a0, a0 79; CHECK-NEXT: ret 80 %1 = sext i16 %a to i32 81 ret i32 %1 82} 83 84define i32 @exthz(i16 %a) { 85; CHECK-LABEL: exthz: 86; CHECK: # %bb.0: 87; CHECK-NEXT: # kill: def $x11 killed $x10 88; CHECK-NEXT: cv.exthz a0, a0 89; CHECK-NEXT: ret 90 %1 = zext i16 %a to i32 91 ret i32 %1 92} 93 94define i32 @extbs(i8 %a) { 95; CHECK-LABEL: extbs: 96; CHECK: # %bb.0: 97; CHECK-NEXT: # kill: def $x11 killed $x10 98; CHECK-NEXT: cv.extbs a0, a0 99; CHECK-NEXT: ret 100 %1 = sext i8 %a to i32 101 ret i32 %1 102} 103 104define i32 @extbz(i8 %a) { 105; CHECK-LABEL: extbz: 106; CHECK: # %bb.0: 107; CHECK-NEXT: # kill: def $x11 killed $x10 108; CHECK-NEXT: cv.extbz a0, a0 109; CHECK-NEXT: ret 110 %1 = zext i8 %a to i32 111 ret i32 %1 112} 113 114declare i32 @llvm.riscv.cv.alu.clip(i32, i32) 115 116define i32 @test.cv.alu.clip.case.a(i32 %a) { 117; CHECK-LABEL: test.cv.alu.clip.case.a: 118; CHECK: # %bb.0: 119; CHECK-NEXT: cv.clip a0, a0, 5 120; CHECK-NEXT: ret 121 %1 = call i32 @llvm.riscv.cv.alu.clip(i32 %a, i32 15) 122 ret i32 %1 123} 124 125define i32 @test.cv.alu.clip.case.b(i32 %a) { 126; CHECK-LABEL: test.cv.alu.clip.case.b: 127; CHECK: # %bb.0: 128; CHECK-NEXT: li a1, 10 129; CHECK-NEXT: cv.clipr a0, a0, a1 130; CHECK-NEXT: ret 131 %1 = call i32 @llvm.riscv.cv.alu.clip(i32 %a, i32 10) 132 ret i32 %1 133} 134 135declare i32 @llvm.riscv.cv.alu.clipu(i32, i32) 136 137define i32 @test.cv.alu.clipu.case.a(i32 %a) { 138; CHECK-LABEL: test.cv.alu.clipu.case.a: 139; CHECK: # %bb.0: 140; CHECK-NEXT: cv.clipu a0, a0, 9 141; CHECK-NEXT: ret 142 %1 = call i32 @llvm.riscv.cv.alu.clipu(i32 %a, i32 255) 143 ret i32 %1 144} 145 146define i32 @test.cv.alu.clipu.case.b(i32 %a) { 147; CHECK-LABEL: test.cv.alu.clipu.case.b: 148; CHECK: # %bb.0: 149; CHECK-NEXT: li a1, 200 150; CHECK-NEXT: cv.clipur a0, a0, a1 151; CHECK-NEXT: ret 152 %1 = call i32 @llvm.riscv.cv.alu.clipu(i32 %a, i32 200) 153 ret i32 %1 154} 155 156declare i32 @llvm.riscv.cv.alu.addN(i32, i32, i32) 157 158define i32 @test.cv.alu.addN.case.a(i32 %a, i32 %b) { 159; CHECK-LABEL: test.cv.alu.addN.case.a: 160; CHECK: # %bb.0: 161; CHECK-NEXT: cv.addn a0, a0, a1, 15 162; CHECK-NEXT: ret 163 %1 = call i32 @llvm.riscv.cv.alu.addN(i32 %a, i32 %b, i32 15) 164 ret i32 %1 165} 166 167define i32 @test.cv.alu.addN.case.b(i32 %a, i32 %b) { 168; CHECK-LABEL: test.cv.alu.addN.case.b: 169; CHECK: # %bb.0: 170; CHECK-NEXT: li a2, 32 171; CHECK-NEXT: cv.addnr a0, a1, a2 172; CHECK-NEXT: ret 173 %1 = call i32 @llvm.riscv.cv.alu.addN(i32 %a, i32 %b, i32 32) 174 ret i32 %1 175} 176 177declare i32 @llvm.riscv.cv.alu.adduN(i32, i32, i32) 178 179define i32 @test.cv.alu.adduN.case.a(i32 %a, i32 %b) { 180; CHECK-LABEL: test.cv.alu.adduN.case.a: 181; CHECK: # %bb.0: 182; CHECK-NEXT: cv.addun a0, a0, a1, 15 183; CHECK-NEXT: ret 184 %1 = call i32 @llvm.riscv.cv.alu.adduN(i32 %a, i32 %b, i32 15) 185 ret i32 %1 186} 187 188define i32 @test.cv.alu.adduN.case.b(i32 %a, i32 %b) { 189; CHECK-LABEL: test.cv.alu.adduN.case.b: 190; CHECK: # %bb.0: 191; CHECK-NEXT: li a2, 32 192; CHECK-NEXT: cv.addunr a0, a1, a2 193; CHECK-NEXT: ret 194 %1 = call i32 @llvm.riscv.cv.alu.adduN(i32 %a, i32 %b, i32 32) 195 ret i32 %1 196} 197 198declare i32 @llvm.riscv.cv.alu.addRN(i32, i32, i32) 199 200define i32 @test.cv.alu.addRN.case.a(i32 %a, i32 %b) { 201; CHECK-LABEL: test.cv.alu.addRN.case.a: 202; CHECK: # %bb.0: 203; CHECK-NEXT: cv.addrn a0, a0, a1, 15 204; CHECK-NEXT: ret 205 %1 = call i32 @llvm.riscv.cv.alu.addRN(i32 %a, i32 %b, i32 15) 206 ret i32 %1 207} 208 209define i32 @test.cv.alu.addRN.case.b(i32 %a, i32 %b) { 210; CHECK-LABEL: test.cv.alu.addRN.case.b: 211; CHECK: # %bb.0: 212; CHECK-NEXT: li a2, 32 213; CHECK-NEXT: cv.addrnr a0, a1, a2 214; CHECK-NEXT: ret 215 %1 = call i32 @llvm.riscv.cv.alu.addRN(i32 %a, i32 %b, i32 32) 216 ret i32 %1 217} 218 219declare i32 @llvm.riscv.cv.alu.adduRN(i32, i32, i32) 220 221define i32 @test.cv.alu.adduRN.case.a(i32 %a, i32 %b) { 222; CHECK-LABEL: test.cv.alu.adduRN.case.a: 223; CHECK: # %bb.0: 224; CHECK-NEXT: cv.addurn a0, a0, a1, 15 225; CHECK-NEXT: ret 226 %1 = call i32 @llvm.riscv.cv.alu.adduRN(i32 %a, i32 %b, i32 15) 227 ret i32 %1 228} 229 230define i32 @test.cv.alu.adduRN.case.b(i32 %a, i32 %b) { 231; CHECK-LABEL: test.cv.alu.adduRN.case.b: 232; CHECK: # %bb.0: 233; CHECK-NEXT: li a2, 32 234; CHECK-NEXT: cv.addurnr a0, a1, a2 235; CHECK-NEXT: ret 236 %1 = call i32 @llvm.riscv.cv.alu.adduRN(i32 %a, i32 %b, i32 32) 237 ret i32 %1 238} 239 240declare i32 @llvm.riscv.cv.alu.subN(i32, i32, i32) 241 242define i32 @test.cv.alu.subN.case.a(i32 %a, i32 %b) { 243; CHECK-LABEL: test.cv.alu.subN.case.a: 244; CHECK: # %bb.0: 245; CHECK-NEXT: cv.subn a0, a0, a1, 15 246; CHECK-NEXT: ret 247 %1 = call i32 @llvm.riscv.cv.alu.subN(i32 %a, i32 %b, i32 15) 248 ret i32 %1 249} 250 251define i32 @test.cv.alu.subN.case.b(i32 %a, i32 %b) { 252; CHECK-LABEL: test.cv.alu.subN.case.b: 253; CHECK: # %bb.0: 254; CHECK-NEXT: li a2, 32 255; CHECK-NEXT: cv.subnr a0, a1, a2 256; CHECK-NEXT: ret 257 %1 = call i32 @llvm.riscv.cv.alu.subN(i32 %a, i32 %b, i32 32) 258 ret i32 %1 259} 260 261declare i32 @llvm.riscv.cv.alu.subuN(i32, i32, i32) 262 263define i32 @test.cv.alu.subuN.case.a(i32 %a, i32 %b) { 264; CHECK-LABEL: test.cv.alu.subuN.case.a: 265; CHECK: # %bb.0: 266; CHECK-NEXT: cv.subun a0, a0, a1, 15 267; CHECK-NEXT: ret 268 %1 = call i32 @llvm.riscv.cv.alu.subuN(i32 %a, i32 %b, i32 15) 269 ret i32 %1 270} 271 272define i32 @test.cv.alu.subuN.case.b(i32 %a, i32 %b) { 273; CHECK-LABEL: test.cv.alu.subuN.case.b: 274; CHECK: # %bb.0: 275; CHECK-NEXT: li a2, 32 276; CHECK-NEXT: cv.subunr a0, a1, a2 277; CHECK-NEXT: ret 278 %1 = call i32 @llvm.riscv.cv.alu.subuN(i32 %a, i32 %b, i32 32) 279 ret i32 %1 280} 281 282declare i32 @llvm.riscv.cv.alu.subRN(i32, i32, i32) 283 284define i32 @test.cv.alu.subRN.case.a(i32 %a, i32 %b) { 285; CHECK-LABEL: test.cv.alu.subRN.case.a: 286; CHECK: # %bb.0: 287; CHECK-NEXT: cv.subrn a0, a0, a1, 15 288; CHECK-NEXT: ret 289 %1 = call i32 @llvm.riscv.cv.alu.subRN(i32 %a, i32 %b, i32 15) 290 ret i32 %1 291} 292 293define i32 @test.cv.alu.subRN.case.b(i32 %a, i32 %b) { 294; CHECK-LABEL: test.cv.alu.subRN.case.b: 295; CHECK: # %bb.0: 296; CHECK-NEXT: li a2, 32 297; CHECK-NEXT: cv.subrnr a0, a1, a2 298; CHECK-NEXT: ret 299 %1 = call i32 @llvm.riscv.cv.alu.subRN(i32 %a, i32 %b, i32 32) 300 ret i32 %1 301} 302 303declare i32 @llvm.riscv.cv.alu.subuRN(i32, i32, i32) 304 305define i32 @test.cv.alu.subuRN.case.a(i32 %a, i32 %b) { 306; CHECK-LABEL: test.cv.alu.subuRN.case.a: 307; CHECK: # %bb.0: 308; CHECK-NEXT: cv.suburn a0, a0, a1, 15 309; CHECK-NEXT: ret 310 %1 = call i32 @llvm.riscv.cv.alu.subuRN(i32 %a, i32 %b, i32 15) 311 ret i32 %1 312} 313 314define i32 @test.cv.alu.subuRN.case.b(i32 %a, i32 %b) { 315; CHECK-LABEL: test.cv.alu.subuRN.case.b: 316; CHECK: # %bb.0: 317; CHECK-NEXT: li a2, 32 318; CHECK-NEXT: cv.suburnr a0, a1, a2 319; CHECK-NEXT: ret 320 %1 = call i32 @llvm.riscv.cv.alu.subuRN(i32 %a, i32 %b, i32 32) 321 ret i32 %1 322} 323