| ; Ensure that the FSL instrinsic instruction generate single FSL instructions | |
| ; at the machine level. Additionally, ensure that dynamic values use the | |
| ; dynamic version of the instructions and that constant values use the | |
| ; constant version of the instructions. | |
| ; | |
| ; RUN: llc -O3 < %s -march=mblaze | FileCheck %s | |
| declare i32 @llvm.mblaze.fsl.get(i32 %port) | |
| declare i32 @llvm.mblaze.fsl.aget(i32 %port) | |
| declare i32 @llvm.mblaze.fsl.cget(i32 %port) | |
| declare i32 @llvm.mblaze.fsl.caget(i32 %port) | |
| declare i32 @llvm.mblaze.fsl.eget(i32 %port) | |
| declare i32 @llvm.mblaze.fsl.eaget(i32 %port) | |
| declare i32 @llvm.mblaze.fsl.ecget(i32 %port) | |
| declare i32 @llvm.mblaze.fsl.ecaget(i32 %port) | |
| declare i32 @llvm.mblaze.fsl.nget(i32 %port) | |
| declare i32 @llvm.mblaze.fsl.naget(i32 %port) | |
| declare i32 @llvm.mblaze.fsl.ncget(i32 %port) | |
| declare i32 @llvm.mblaze.fsl.ncaget(i32 %port) | |
| declare i32 @llvm.mblaze.fsl.neget(i32 %port) | |
| declare i32 @llvm.mblaze.fsl.neaget(i32 %port) | |
| declare i32 @llvm.mblaze.fsl.necget(i32 %port) | |
| declare i32 @llvm.mblaze.fsl.necaget(i32 %port) | |
| declare i32 @llvm.mblaze.fsl.tget(i32 %port) | |
| declare i32 @llvm.mblaze.fsl.taget(i32 %port) | |
| declare i32 @llvm.mblaze.fsl.tcget(i32 %port) | |
| declare i32 @llvm.mblaze.fsl.tcaget(i32 %port) | |
| declare i32 @llvm.mblaze.fsl.teget(i32 %port) | |
| declare i32 @llvm.mblaze.fsl.teaget(i32 %port) | |
| declare i32 @llvm.mblaze.fsl.tecget(i32 %port) | |
| declare i32 @llvm.mblaze.fsl.tecaget(i32 %port) | |
| declare i32 @llvm.mblaze.fsl.tnget(i32 %port) | |
| declare i32 @llvm.mblaze.fsl.tnaget(i32 %port) | |
| declare i32 @llvm.mblaze.fsl.tncget(i32 %port) | |
| declare i32 @llvm.mblaze.fsl.tncaget(i32 %port) | |
| declare i32 @llvm.mblaze.fsl.tneget(i32 %port) | |
| declare i32 @llvm.mblaze.fsl.tneaget(i32 %port) | |
| declare i32 @llvm.mblaze.fsl.tnecget(i32 %port) | |
| declare i32 @llvm.mblaze.fsl.tnecaget(i32 %port) | |
| declare void @llvm.mblaze.fsl.put(i32 %value, i32 %port) | |
| declare void @llvm.mblaze.fsl.aput(i32 %value, i32 %port) | |
| declare void @llvm.mblaze.fsl.cput(i32 %value, i32 %port) | |
| declare void @llvm.mblaze.fsl.caput(i32 %value, i32 %port) | |
| declare void @llvm.mblaze.fsl.nput(i32 %value, i32 %port) | |
| declare void @llvm.mblaze.fsl.naput(i32 %value, i32 %port) | |
| declare void @llvm.mblaze.fsl.ncput(i32 %value, i32 %port) | |
| declare void @llvm.mblaze.fsl.ncaput(i32 %value, i32 %port) | |
| declare void @llvm.mblaze.fsl.tput(i32 %port) | |
| declare void @llvm.mblaze.fsl.taput(i32 %port) | |
| declare void @llvm.mblaze.fsl.tcput(i32 %port) | |
| declare void @llvm.mblaze.fsl.tcaput(i32 %port) | |
| declare void @llvm.mblaze.fsl.tnput(i32 %port) | |
| declare void @llvm.mblaze.fsl.tnaput(i32 %port) | |
| declare void @llvm.mblaze.fsl.tncput(i32 %port) | |
| declare void @llvm.mblaze.fsl.tncaput(i32 %port) | |
| define void @fsl_get(i32 %port) { | |
| ; CHECK: fsl_get: | |
| %v0 = call i32 @llvm.mblaze.fsl.get(i32 %port) | |
| ; CHECK: getd | |
| %v1 = call i32 @llvm.mblaze.fsl.aget(i32 %port) | |
| ; CHECK-NEXT: agetd | |
| %v2 = call i32 @llvm.mblaze.fsl.cget(i32 %port) | |
| ; CHECK-NEXT: cgetd | |
| %v3 = call i32 @llvm.mblaze.fsl.caget(i32 %port) | |
| ; CHECK-NEXT: cagetd | |
| %v4 = call i32 @llvm.mblaze.fsl.eget(i32 %port) | |
| ; CHECK-NEXT: egetd | |
| %v5 = call i32 @llvm.mblaze.fsl.eaget(i32 %port) | |
| ; CHECK-NEXT: eagetd | |
| %v6 = call i32 @llvm.mblaze.fsl.ecget(i32 %port) | |
| ; CHECK-NEXT: ecgetd | |
| %v7 = call i32 @llvm.mblaze.fsl.ecaget(i32 %port) | |
| ; CHECK-NEXT: ecagetd | |
| %v8 = call i32 @llvm.mblaze.fsl.nget(i32 %port) | |
| ; CHECK-NEXT: ngetd | |
| %v9 = call i32 @llvm.mblaze.fsl.naget(i32 %port) | |
| ; CHECK-NEXT: nagetd | |
| %v10 = call i32 @llvm.mblaze.fsl.ncget(i32 %port) | |
| ; CHECK-NEXT: ncgetd | |
| %v11 = call i32 @llvm.mblaze.fsl.ncaget(i32 %port) | |
| ; CHECK-NEXT: ncagetd | |
| %v12 = call i32 @llvm.mblaze.fsl.neget(i32 %port) | |
| ; CHECK-NEXT: negetd | |
| %v13 = call i32 @llvm.mblaze.fsl.neaget(i32 %port) | |
| ; CHECK-NEXT: neagetd | |
| %v14 = call i32 @llvm.mblaze.fsl.necget(i32 %port) | |
| ; CHECK-NEXT: necgetd | |
| %v15 = call i32 @llvm.mblaze.fsl.necaget(i32 %port) | |
| ; CHECK-NEXT: necagetd | |
| %v16 = call i32 @llvm.mblaze.fsl.tget(i32 %port) | |
| ; CHECK-NEXT: tgetd | |
| %v17 = call i32 @llvm.mblaze.fsl.taget(i32 %port) | |
| ; CHECK-NEXT: tagetd | |
| %v18 = call i32 @llvm.mblaze.fsl.tcget(i32 %port) | |
| ; CHECK-NEXT: tcgetd | |
| %v19 = call i32 @llvm.mblaze.fsl.tcaget(i32 %port) | |
| ; CHECK-NEXT: tcagetd | |
| %v20 = call i32 @llvm.mblaze.fsl.teget(i32 %port) | |
| ; CHECK-NEXT: tegetd | |
| %v21 = call i32 @llvm.mblaze.fsl.teaget(i32 %port) | |
| ; CHECK-NEXT: teagetd | |
| %v22 = call i32 @llvm.mblaze.fsl.tecget(i32 %port) | |
| ; CHECK-NEXT: tecgetd | |
| %v23 = call i32 @llvm.mblaze.fsl.tecaget(i32 %port) | |
| ; CHECK-NEXT: tecagetd | |
| %v24 = call i32 @llvm.mblaze.fsl.tnget(i32 %port) | |
| ; CHECK-NEXT: tngetd | |
| %v25 = call i32 @llvm.mblaze.fsl.tnaget(i32 %port) | |
| ; CHECK-NEXT: tnagetd | |
| %v26 = call i32 @llvm.mblaze.fsl.tncget(i32 %port) | |
| ; CHECK-NEXT: tncgetd | |
| %v27 = call i32 @llvm.mblaze.fsl.tncaget(i32 %port) | |
| ; CHECK-NEXT: tncagetd | |
| %v28 = call i32 @llvm.mblaze.fsl.tneget(i32 %port) | |
| ; CHECK-NEXT: tnegetd | |
| %v29 = call i32 @llvm.mblaze.fsl.tneaget(i32 %port) | |
| ; CHECK-NEXT: tneagetd | |
| %v30 = call i32 @llvm.mblaze.fsl.tnecget(i32 %port) | |
| ; CHECK-NEXT: tnecgetd | |
| %v31 = call i32 @llvm.mblaze.fsl.tnecaget(i32 %port) | |
| ; CHECK-NEXT: tnecagetd | |
| ret void | |
| ; CHECK: rtsd | |
| } | |
| define void @fslc_get() { | |
| ; CHECK: fslc_get: | |
| %v0 = call i32 @llvm.mblaze.fsl.get(i32 1) | |
| ; CHECK: get | |
| %v1 = call i32 @llvm.mblaze.fsl.aget(i32 1) | |
| ; CHECK-NOT: agetd | |
| ; CHECK: aget | |
| %v2 = call i32 @llvm.mblaze.fsl.cget(i32 1) | |
| ; CHECK-NOT: cgetd | |
| ; CHECK: cget | |
| %v3 = call i32 @llvm.mblaze.fsl.caget(i32 1) | |
| ; CHECK-NOT: cagetd | |
| ; CHECK: caget | |
| %v4 = call i32 @llvm.mblaze.fsl.eget(i32 1) | |
| ; CHECK-NOT: egetd | |
| ; CHECK: eget | |
| %v5 = call i32 @llvm.mblaze.fsl.eaget(i32 1) | |
| ; CHECK-NOT: eagetd | |
| ; CHECK: eaget | |
| %v6 = call i32 @llvm.mblaze.fsl.ecget(i32 1) | |
| ; CHECK-NOT: ecgetd | |
| ; CHECK: ecget | |
| %v7 = call i32 @llvm.mblaze.fsl.ecaget(i32 1) | |
| ; CHECK-NOT: ecagetd | |
| ; CHECK: ecaget | |
| %v8 = call i32 @llvm.mblaze.fsl.nget(i32 1) | |
| ; CHECK-NOT: ngetd | |
| ; CHECK: nget | |
| %v9 = call i32 @llvm.mblaze.fsl.naget(i32 1) | |
| ; CHECK-NOT: nagetd | |
| ; CHECK: naget | |
| %v10 = call i32 @llvm.mblaze.fsl.ncget(i32 1) | |
| ; CHECK-NOT: ncgetd | |
| ; CHECK: ncget | |
| %v11 = call i32 @llvm.mblaze.fsl.ncaget(i32 1) | |
| ; CHECK-NOT: ncagetd | |
| ; CHECK: ncaget | |
| %v12 = call i32 @llvm.mblaze.fsl.neget(i32 1) | |
| ; CHECK-NOT: negetd | |
| ; CHECK: neget | |
| %v13 = call i32 @llvm.mblaze.fsl.neaget(i32 1) | |
| ; CHECK-NOT: neagetd | |
| ; CHECK: neaget | |
| %v14 = call i32 @llvm.mblaze.fsl.necget(i32 1) | |
| ; CHECK-NOT: necgetd | |
| ; CHECK: necget | |
| %v15 = call i32 @llvm.mblaze.fsl.necaget(i32 1) | |
| ; CHECK-NOT: necagetd | |
| ; CHECK: necaget | |
| %v16 = call i32 @llvm.mblaze.fsl.tget(i32 1) | |
| ; CHECK-NOT: tgetd | |
| ; CHECK: tget | |
| %v17 = call i32 @llvm.mblaze.fsl.taget(i32 1) | |
| ; CHECK-NOT: tagetd | |
| ; CHECK: taget | |
| %v18 = call i32 @llvm.mblaze.fsl.tcget(i32 1) | |
| ; CHECK-NOT: tcgetd | |
| ; CHECK: tcget | |
| %v19 = call i32 @llvm.mblaze.fsl.tcaget(i32 1) | |
| ; CHECK-NOT: tcagetd | |
| ; CHECK: tcaget | |
| %v20 = call i32 @llvm.mblaze.fsl.teget(i32 1) | |
| ; CHECK-NOT: tegetd | |
| ; CHECK: teget | |
| %v21 = call i32 @llvm.mblaze.fsl.teaget(i32 1) | |
| ; CHECK-NOT: teagetd | |
| ; CHECK: teaget | |
| %v22 = call i32 @llvm.mblaze.fsl.tecget(i32 1) | |
| ; CHECK-NOT: tecgetd | |
| ; CHECK: tecget | |
| %v23 = call i32 @llvm.mblaze.fsl.tecaget(i32 1) | |
| ; CHECK-NOT: tecagetd | |
| ; CHECK: tecaget | |
| %v24 = call i32 @llvm.mblaze.fsl.tnget(i32 1) | |
| ; CHECK-NOT: tngetd | |
| ; CHECK: tnget | |
| %v25 = call i32 @llvm.mblaze.fsl.tnaget(i32 1) | |
| ; CHECK-NOT: tnagetd | |
| ; CHECK: tnaget | |
| %v26 = call i32 @llvm.mblaze.fsl.tncget(i32 1) | |
| ; CHECK-NOT: tncgetd | |
| ; CHECK: tncget | |
| %v27 = call i32 @llvm.mblaze.fsl.tncaget(i32 1) | |
| ; CHECK-NOT: tncagetd | |
| ; CHECK: tncaget | |
| %v28 = call i32 @llvm.mblaze.fsl.tneget(i32 1) | |
| ; CHECK-NOT: tnegetd | |
| ; CHECK: tneget | |
| %v29 = call i32 @llvm.mblaze.fsl.tneaget(i32 1) | |
| ; CHECK-NOT: tneagetd | |
| ; CHECK: tneaget | |
| %v30 = call i32 @llvm.mblaze.fsl.tnecget(i32 1) | |
| ; CHECK-NOT: tnecgetd | |
| ; CHECK: tnecget | |
| %v31 = call i32 @llvm.mblaze.fsl.tnecaget(i32 1) | |
| ; CHECK-NOT: tnecagetd | |
| ; CHECK: tnecaget | |
| ret void | |
| ; CHECK: rtsd | |
| } | |
| define void @putfsl(i32 %value, i32 %port) { | |
| ; CHECK: putfsl: | |
| call void @llvm.mblaze.fsl.put(i32 %value, i32 %port) | |
| ; CHECK: putd | |
| call void @llvm.mblaze.fsl.aput(i32 %value, i32 %port) | |
| ; CHECK-NEXT: aputd | |
| call void @llvm.mblaze.fsl.cput(i32 %value, i32 %port) | |
| ; CHECK-NEXT: cputd | |
| call void @llvm.mblaze.fsl.caput(i32 %value, i32 %port) | |
| ; CHECK-NEXT: caputd | |
| call void @llvm.mblaze.fsl.nput(i32 %value, i32 %port) | |
| ; CHECK-NEXT: nputd | |
| call void @llvm.mblaze.fsl.naput(i32 %value, i32 %port) | |
| ; CHECK-NEXT: naputd | |
| call void @llvm.mblaze.fsl.ncput(i32 %value, i32 %port) | |
| ; CHECK-NEXT: ncputd | |
| call void @llvm.mblaze.fsl.ncaput(i32 %value, i32 %port) | |
| ; CHECK-NEXT: ncaputd | |
| call void @llvm.mblaze.fsl.tput(i32 %port) | |
| ; CHECK-NEXT: tputd | |
| call void @llvm.mblaze.fsl.taput(i32 %port) | |
| ; CHECK-NEXT: taputd | |
| call void @llvm.mblaze.fsl.tcput(i32 %port) | |
| ; CHECK-NEXT: tcputd | |
| call void @llvm.mblaze.fsl.tcaput(i32 %port) | |
| ; CHECK-NEXT: tcaputd | |
| call void @llvm.mblaze.fsl.tnput(i32 %port) | |
| ; CHECK-NEXT: tnputd | |
| call void @llvm.mblaze.fsl.tnaput(i32 %port) | |
| ; CHECK-NEXT: tnaputd | |
| call void @llvm.mblaze.fsl.tncput(i32 %port) | |
| ; CHECK-NEXT: tncputd | |
| call void @llvm.mblaze.fsl.tncaput(i32 %port) | |
| ; CHECK-NEXT: tncaputd | |
| ret void | |
| ; CHECK: rtsd | |
| } | |
| define void @putfsl_const(i32 %value) { | |
| ; CHECK: putfsl_const: | |
| call void @llvm.mblaze.fsl.put(i32 %value, i32 1) | |
| ; CHECK-NOT: putd | |
| ; CHECK: put | |
| call void @llvm.mblaze.fsl.aput(i32 %value, i32 1) | |
| ; CHECK-NOT: aputd | |
| ; CHECK: aput | |
| call void @llvm.mblaze.fsl.cput(i32 %value, i32 1) | |
| ; CHECK-NOT: cputd | |
| ; CHECK: cput | |
| call void @llvm.mblaze.fsl.caput(i32 %value, i32 1) | |
| ; CHECK-NOT: caputd | |
| ; CHECK: caput | |
| call void @llvm.mblaze.fsl.nput(i32 %value, i32 1) | |
| ; CHECK-NOT: nputd | |
| ; CHECK: nput | |
| call void @llvm.mblaze.fsl.naput(i32 %value, i32 1) | |
| ; CHECK-NOT: naputd | |
| ; CHECK: naput | |
| call void @llvm.mblaze.fsl.ncput(i32 %value, i32 1) | |
| ; CHECK-NOT: ncputd | |
| ; CHECK: ncput | |
| call void @llvm.mblaze.fsl.ncaput(i32 %value, i32 1) | |
| ; CHECK-NOT: ncaputd | |
| ; CHECK: ncaput | |
| call void @llvm.mblaze.fsl.tput(i32 1) | |
| ; CHECK-NOT: tputd | |
| ; CHECK: tput | |
| call void @llvm.mblaze.fsl.taput(i32 1) | |
| ; CHECK-NOT: taputd | |
| ; CHECK: taput | |
| call void @llvm.mblaze.fsl.tcput(i32 1) | |
| ; CHECK-NOT: tcputd | |
| ; CHECK: tcput | |
| call void @llvm.mblaze.fsl.tcaput(i32 1) | |
| ; CHECK-NOT: tcaputd | |
| ; CHECK: tcaput | |
| call void @llvm.mblaze.fsl.tnput(i32 1) | |
| ; CHECK-NOT: tnputd | |
| ; CHECK: tnput | |
| call void @llvm.mblaze.fsl.tnaput(i32 1) | |
| ; CHECK-NOT: tnaputd | |
| ; CHECK: tnaput | |
| call void @llvm.mblaze.fsl.tncput(i32 1) | |
| ; CHECK-NOT: tncputd | |
| ; CHECK: tncput | |
| call void @llvm.mblaze.fsl.tncaput(i32 1) | |
| ; CHECK-NOT: tncaputd | |
| ; CHECK: tncaput | |
| ret void | |
| ; CHECK: rtsd | |
| } |