263 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc --mtriple=loongarch32 --mattr=+f --verify-machineinstrs < %s | FileCheck %s3; RUN: llc --mtriple=loongarch64 --mattr=+f --verify-machineinstrs < %s | FileCheck %s4 5declare void @llvm.loongarch.dbar(i32)6declare void @llvm.loongarch.ibar(i32)7declare void @llvm.loongarch.break(i32)8declare void @llvm.loongarch.movgr2fcsr(i32, i32)9declare i32 @llvm.loongarch.movfcsr2gr(i32)10declare void @llvm.loongarch.syscall(i32)11declare i32 @llvm.loongarch.csrrd.w(i32 immarg)12declare i32 @llvm.loongarch.csrwr.w(i32, i32 immarg)13declare i32 @llvm.loongarch.csrxchg.w(i32, i32, i32 immarg)14declare i32 @llvm.loongarch.iocsrrd.b(i32)15declare i32 @llvm.loongarch.iocsrrd.h(i32)16declare i32 @llvm.loongarch.iocsrrd.w(i32)17declare void @llvm.loongarch.iocsrwr.b(i32, i32)18declare void @llvm.loongarch.iocsrwr.h(i32, i32)19declare void @llvm.loongarch.iocsrwr.w(i32, i32)20declare i32 @llvm.loongarch.cpucfg(i32)21 22define void @foo() nounwind {23; CHECK-LABEL: foo:24; CHECK: # %bb.0: # %entry25; CHECK-NEXT: dbar 026; CHECK-NEXT: ret27entry:28 call void @llvm.loongarch.dbar(i32 0)29 ret void30}31 32define void @ibar() nounwind {33; CHECK-LABEL: ibar:34; CHECK: # %bb.0: # %entry35; CHECK-NEXT: ibar 036; CHECK-NEXT: ret37entry:38 call void @llvm.loongarch.ibar(i32 0)39 ret void40}41 42define void @break() nounwind {43; CHECK-LABEL: break:44; CHECK: # %bb.0: # %entry45; CHECK-NEXT: break 146; CHECK-NEXT: ret47entry:48 call void @llvm.loongarch.break(i32 1)49 ret void50}51 52define void @movgr2fcsr(i32 %a) nounwind {53; CHECK-LABEL: movgr2fcsr:54; CHECK: # %bb.0: # %entry55; CHECK-NEXT: movgr2fcsr $fcsr1, $a056; CHECK-NEXT: ret57entry:58 call void @llvm.loongarch.movgr2fcsr(i32 1, i32 %a)59 ret void60}61 62define i32 @movfcsr2gr() nounwind {63; CHECK-LABEL: movfcsr2gr:64; CHECK: # %bb.0: # %entry65; CHECK-NEXT: movfcsr2gr $a0, $fcsr166; CHECK-NEXT: ret67entry:68 %res = call i32 @llvm.loongarch.movfcsr2gr(i32 1)69 ret i32 %res70}71 72;; TODO: Optimize out `movfcsr2gr` without data-dependency.73define void @movfcsr2gr_noret() nounwind {74; CHECK-LABEL: movfcsr2gr_noret:75; CHECK: # %bb.0: # %entry76; CHECK-NEXT: movfcsr2gr $zero, $fcsr177; CHECK-NEXT: ret78entry:79 %res = call i32 @llvm.loongarch.movfcsr2gr(i32 1)80 ret void81}82 83define void @syscall() nounwind {84; CHECK-LABEL: syscall:85; CHECK: # %bb.0: # %entry86; CHECK-NEXT: syscall 187; CHECK-NEXT: ret88entry:89 call void @llvm.loongarch.syscall(i32 1)90 ret void91}92 93define i32 @csrrd_w() {94; CHECK-LABEL: csrrd_w:95; CHECK: # %bb.0: # %entry96; CHECK-NEXT: csrrd $a0, 197; CHECK-NEXT: ret98entry:99 %0 = tail call i32 @llvm.loongarch.csrrd.w(i32 1)100 ret i32 %0101}102 103define void @csrrd_w_noret() {104; CHECK-LABEL: csrrd_w_noret:105; CHECK: # %bb.0: # %entry106; CHECK-NEXT: csrrd $zero, 1107; CHECK-NEXT: ret108entry:109 %0 = tail call i32 @llvm.loongarch.csrrd.w(i32 1)110 ret void111}112 113define i32 @csrwr_w(i32 signext %a) {114; CHECK-LABEL: csrwr_w:115; CHECK: # %bb.0: # %entry116; CHECK-NEXT: csrwr $a0, 1117; CHECK-NEXT: ret118entry:119 %0 = tail call i32 @llvm.loongarch.csrwr.w(i32 %a, i32 1)120 ret i32 %0121}122 123;; Check that csrwr is emitted even if the return value of the intrinsic is not used.124define void @csrwr_w_noret(i32 signext %a) {125; CHECK-LABEL: csrwr_w_noret:126; CHECK: # %bb.0: # %entry127; CHECK-NEXT: csrwr $a0, 1128; CHECK-NEXT: ret129entry:130 %0 = tail call i32 @llvm.loongarch.csrwr.w(i32 %a, i32 1)131 ret void132}133 134define i32 @csrxchg_w(i32 signext %a, i32 signext %b) {135; CHECK-LABEL: csrxchg_w:136; CHECK: # %bb.0: # %entry137; CHECK-NEXT: csrxchg $a0, $a1, 1138; CHECK-NEXT: ret139entry:140 %0 = tail call i32 @llvm.loongarch.csrxchg.w(i32 %a, i32 %b, i32 1)141 ret i32 %0142}143 144;; Check that csrxchg is emitted even if the return value of the intrinsic is not used.145define void @csrxchg_w_noret(i32 signext %a, i32 signext %b) {146; CHECK-LABEL: csrxchg_w_noret:147; CHECK: # %bb.0: # %entry148; CHECK-NEXT: csrxchg $a0, $a1, 1149; CHECK-NEXT: ret150entry:151 %0 = tail call i32 @llvm.loongarch.csrxchg.w(i32 %a, i32 %b, i32 1)152 ret void153}154 155define i32 @iocsrrd_b(i32 %a) {156; CHECK-LABEL: iocsrrd_b:157; CHECK: # %bb.0: # %entry158; CHECK-NEXT: iocsrrd.b $a0, $a0159; CHECK-NEXT: ret160entry:161 %0 = tail call i32 @llvm.loongarch.iocsrrd.b(i32 %a)162 ret i32 %0163}164 165define i32 @iocsrrd_h(i32 %a) {166; CHECK-LABEL: iocsrrd_h:167; CHECK: # %bb.0: # %entry168; CHECK-NEXT: iocsrrd.h $a0, $a0169; CHECK-NEXT: ret170entry:171 %0 = tail call i32 @llvm.loongarch.iocsrrd.h(i32 %a)172 ret i32 %0173}174 175define i32 @iocsrrd_w(i32 %a) {176; CHECK-LABEL: iocsrrd_w:177; CHECK: # %bb.0: # %entry178; CHECK-NEXT: iocsrrd.w $a0, $a0179; CHECK-NEXT: ret180entry:181 %0 = tail call i32 @llvm.loongarch.iocsrrd.w(i32 %a)182 ret i32 %0183}184 185define void @iocsrrd_b_noret(i32 %a) {186; CHECK-LABEL: iocsrrd_b_noret:187; CHECK: # %bb.0: # %entry188; CHECK-NEXT: iocsrrd.b $zero, $a0189; CHECK-NEXT: ret190entry:191 %0 = tail call i32 @llvm.loongarch.iocsrrd.b(i32 %a)192 ret void193}194 195define void @iocsrrd_h_noret(i32 %a) {196; CHECK-LABEL: iocsrrd_h_noret:197; CHECK: # %bb.0: # %entry198; CHECK-NEXT: iocsrrd.h $zero, $a0199; CHECK-NEXT: ret200entry:201 %0 = tail call i32 @llvm.loongarch.iocsrrd.h(i32 %a)202 ret void203}204 205define void @iocsrrd_w_noret(i32 %a) {206; CHECK-LABEL: iocsrrd_w_noret:207; CHECK: # %bb.0: # %entry208; CHECK-NEXT: iocsrrd.w $zero, $a0209; CHECK-NEXT: ret210entry:211 %0 = tail call i32 @llvm.loongarch.iocsrrd.w(i32 %a)212 ret void213}214 215define void @iocsrwr_b(i32 %a, i32 %b) {216; CHECK-LABEL: iocsrwr_b:217; CHECK: # %bb.0: # %entry218; CHECK-NEXT: iocsrwr.b $a0, $a1219; CHECK-NEXT: ret220entry:221 tail call void @llvm.loongarch.iocsrwr.b(i32 %a, i32 %b)222 ret void223}224 225define void @iocsrwr_h(i32 %a, i32 %b) {226; CHECK-LABEL: iocsrwr_h:227; CHECK: # %bb.0: # %entry228; CHECK-NEXT: iocsrwr.h $a0, $a1229; CHECK-NEXT: ret230entry:231 tail call void @llvm.loongarch.iocsrwr.h(i32 %a, i32 %b)232 ret void233}234 235define void @iocsrwr_w(i32 %a, i32 %b) {236; CHECK-LABEL: iocsrwr_w:237; CHECK: # %bb.0: # %entry238; CHECK-NEXT: iocsrwr.w $a0, $a1239; CHECK-NEXT: ret240entry:241 tail call void @llvm.loongarch.iocsrwr.w(i32 %a, i32 %b)242 ret void243}244 245define i32 @cpucfg(i32 %a) {246; CHECK-LABEL: cpucfg:247; CHECK: # %bb.0: # %entry248; CHECK-NEXT: cpucfg $a0, $a0249; CHECK-NEXT: ret250entry:251 %0 = tail call i32 @llvm.loongarch.cpucfg(i32 %a)252 ret i32 %0253}254 255define void @cpucfg_noret(i32 %a) {256; CHECK-LABEL: cpucfg_noret:257; CHECK: # %bb.0: # %entry258; CHECK-NEXT: ret259entry:260 %0 = tail call i32 @llvm.loongarch.cpucfg(i32 %a)261 ret void262}263