| ; 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-LABEL: 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-LABEL: 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-LABEL: 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-LABEL: 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 |
| } |