; 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 < %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 i32 @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 i32 1
    ; CHECK:        rtsd
}

define i32 @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 i32 1
    ; 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
}
