brintos

brintos / llvm-project-archived public Read only

0
0
Text · 6.5 KiB · 6d8adb5 Raw
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