1 ; Ensure that the FSL instrinsic instruction generate single FSL instructions 2 ; at the machine level. Additionally, ensure that dynamic values use the 3 ; dynamic version of the instructions and that constant values use the 4 ; constant version of the instructions. 5 ; 6 ; RUN: llc -O3 < %s -march=mblaze | FileCheck %s 7 8 declare i32 @llvm.mblaze.fsl.get(i32 %port) 9 declare i32 @llvm.mblaze.fsl.aget(i32 %port) 10 declare i32 @llvm.mblaze.fsl.cget(i32 %port) 11 declare i32 @llvm.mblaze.fsl.caget(i32 %port) 12 declare i32 @llvm.mblaze.fsl.eget(i32 %port) 13 declare i32 @llvm.mblaze.fsl.eaget(i32 %port) 14 declare i32 @llvm.mblaze.fsl.ecget(i32 %port) 15 declare i32 @llvm.mblaze.fsl.ecaget(i32 %port) 16 declare i32 @llvm.mblaze.fsl.nget(i32 %port) 17 declare i32 @llvm.mblaze.fsl.naget(i32 %port) 18 declare i32 @llvm.mblaze.fsl.ncget(i32 %port) 19 declare i32 @llvm.mblaze.fsl.ncaget(i32 %port) 20 declare i32 @llvm.mblaze.fsl.neget(i32 %port) 21 declare i32 @llvm.mblaze.fsl.neaget(i32 %port) 22 declare i32 @llvm.mblaze.fsl.necget(i32 %port) 23 declare i32 @llvm.mblaze.fsl.necaget(i32 %port) 24 declare i32 @llvm.mblaze.fsl.tget(i32 %port) 25 declare i32 @llvm.mblaze.fsl.taget(i32 %port) 26 declare i32 @llvm.mblaze.fsl.tcget(i32 %port) 27 declare i32 @llvm.mblaze.fsl.tcaget(i32 %port) 28 declare i32 @llvm.mblaze.fsl.teget(i32 %port) 29 declare i32 @llvm.mblaze.fsl.teaget(i32 %port) 30 declare i32 @llvm.mblaze.fsl.tecget(i32 %port) 31 declare i32 @llvm.mblaze.fsl.tecaget(i32 %port) 32 declare i32 @llvm.mblaze.fsl.tnget(i32 %port) 33 declare i32 @llvm.mblaze.fsl.tnaget(i32 %port) 34 declare i32 @llvm.mblaze.fsl.tncget(i32 %port) 35 declare i32 @llvm.mblaze.fsl.tncaget(i32 %port) 36 declare i32 @llvm.mblaze.fsl.tneget(i32 %port) 37 declare i32 @llvm.mblaze.fsl.tneaget(i32 %port) 38 declare i32 @llvm.mblaze.fsl.tnecget(i32 %port) 39 declare i32 @llvm.mblaze.fsl.tnecaget(i32 %port) 40 41 declare void @llvm.mblaze.fsl.put(i32 %value, i32 %port) 42 declare void @llvm.mblaze.fsl.aput(i32 %value, i32 %port) 43 declare void @llvm.mblaze.fsl.cput(i32 %value, i32 %port) 44 declare void @llvm.mblaze.fsl.caput(i32 %value, i32 %port) 45 declare void @llvm.mblaze.fsl.nput(i32 %value, i32 %port) 46 declare void @llvm.mblaze.fsl.naput(i32 %value, i32 %port) 47 declare void @llvm.mblaze.fsl.ncput(i32 %value, i32 %port) 48 declare void @llvm.mblaze.fsl.ncaput(i32 %value, i32 %port) 49 declare void @llvm.mblaze.fsl.tput(i32 %port) 50 declare void @llvm.mblaze.fsl.taput(i32 %port) 51 declare void @llvm.mblaze.fsl.tcput(i32 %port) 52 declare void @llvm.mblaze.fsl.tcaput(i32 %port) 53 declare void @llvm.mblaze.fsl.tnput(i32 %port) 54 declare void @llvm.mblaze.fsl.tnaput(i32 %port) 55 declare void @llvm.mblaze.fsl.tncput(i32 %port) 56 declare void @llvm.mblaze.fsl.tncaput(i32 %port) 57 58 define void @fsl_get(i32 %port) { 59 ; CHECK: fsl_get: 60 %v0 = call i32 @llvm.mblaze.fsl.get(i32 %port) 61 ; CHECK: getd 62 %v1 = call i32 @llvm.mblaze.fsl.aget(i32 %port) 63 ; CHECK-NEXT: agetd 64 %v2 = call i32 @llvm.mblaze.fsl.cget(i32 %port) 65 ; CHECK-NEXT: cgetd 66 %v3 = call i32 @llvm.mblaze.fsl.caget(i32 %port) 67 ; CHECK-NEXT: cagetd 68 %v4 = call i32 @llvm.mblaze.fsl.eget(i32 %port) 69 ; CHECK-NEXT: egetd 70 %v5 = call i32 @llvm.mblaze.fsl.eaget(i32 %port) 71 ; CHECK-NEXT: eagetd 72 %v6 = call i32 @llvm.mblaze.fsl.ecget(i32 %port) 73 ; CHECK-NEXT: ecgetd 74 %v7 = call i32 @llvm.mblaze.fsl.ecaget(i32 %port) 75 ; CHECK-NEXT: ecagetd 76 %v8 = call i32 @llvm.mblaze.fsl.nget(i32 %port) 77 ; CHECK-NEXT: ngetd 78 %v9 = call i32 @llvm.mblaze.fsl.naget(i32 %port) 79 ; CHECK-NEXT: nagetd 80 %v10 = call i32 @llvm.mblaze.fsl.ncget(i32 %port) 81 ; CHECK-NEXT: ncgetd 82 %v11 = call i32 @llvm.mblaze.fsl.ncaget(i32 %port) 83 ; CHECK-NEXT: ncagetd 84 %v12 = call i32 @llvm.mblaze.fsl.neget(i32 %port) 85 ; CHECK-NEXT: negetd 86 %v13 = call i32 @llvm.mblaze.fsl.neaget(i32 %port) 87 ; CHECK-NEXT: neagetd 88 %v14 = call i32 @llvm.mblaze.fsl.necget(i32 %port) 89 ; CHECK-NEXT: necgetd 90 %v15 = call i32 @llvm.mblaze.fsl.necaget(i32 %port) 91 ; CHECK-NEXT: necagetd 92 %v16 = call i32 @llvm.mblaze.fsl.tget(i32 %port) 93 ; CHECK-NEXT: tgetd 94 %v17 = call i32 @llvm.mblaze.fsl.taget(i32 %port) 95 ; CHECK-NEXT: tagetd 96 %v18 = call i32 @llvm.mblaze.fsl.tcget(i32 %port) 97 ; CHECK-NEXT: tcgetd 98 %v19 = call i32 @llvm.mblaze.fsl.tcaget(i32 %port) 99 ; CHECK-NEXT: tcagetd 100 %v20 = call i32 @llvm.mblaze.fsl.teget(i32 %port) 101 ; CHECK-NEXT: tegetd 102 %v21 = call i32 @llvm.mblaze.fsl.teaget(i32 %port) 103 ; CHECK-NEXT: teagetd 104 %v22 = call i32 @llvm.mblaze.fsl.tecget(i32 %port) 105 ; CHECK-NEXT: tecgetd 106 %v23 = call i32 @llvm.mblaze.fsl.tecaget(i32 %port) 107 ; CHECK-NEXT: tecagetd 108 %v24 = call i32 @llvm.mblaze.fsl.tnget(i32 %port) 109 ; CHECK-NEXT: tngetd 110 %v25 = call i32 @llvm.mblaze.fsl.tnaget(i32 %port) 111 ; CHECK-NEXT: tnagetd 112 %v26 = call i32 @llvm.mblaze.fsl.tncget(i32 %port) 113 ; CHECK-NEXT: tncgetd 114 %v27 = call i32 @llvm.mblaze.fsl.tncaget(i32 %port) 115 ; CHECK-NEXT: tncagetd 116 %v28 = call i32 @llvm.mblaze.fsl.tneget(i32 %port) 117 ; CHECK-NEXT: tnegetd 118 %v29 = call i32 @llvm.mblaze.fsl.tneaget(i32 %port) 119 ; CHECK-NEXT: tneagetd 120 %v30 = call i32 @llvm.mblaze.fsl.tnecget(i32 %port) 121 ; CHECK-NEXT: tnecgetd 122 %v31 = call i32 @llvm.mblaze.fsl.tnecaget(i32 %port) 123 ; CHECK-NEXT: tnecagetd 124 ret void 125 ; CHECK: rtsd 126 } 127 128 define void @fslc_get() { 129 ; CHECK: fslc_get: 130 %v0 = call i32 @llvm.mblaze.fsl.get(i32 1) 131 ; CHECK: get 132 %v1 = call i32 @llvm.mblaze.fsl.aget(i32 1) 133 ; CHECK-NOT: agetd 134 ; CHECK: aget 135 %v2 = call i32 @llvm.mblaze.fsl.cget(i32 1) 136 ; CHECK-NOT: cgetd 137 ; CHECK: cget 138 %v3 = call i32 @llvm.mblaze.fsl.caget(i32 1) 139 ; CHECK-NOT: cagetd 140 ; CHECK: caget 141 %v4 = call i32 @llvm.mblaze.fsl.eget(i32 1) 142 ; CHECK-NOT: egetd 143 ; CHECK: eget 144 %v5 = call i32 @llvm.mblaze.fsl.eaget(i32 1) 145 ; CHECK-NOT: eagetd 146 ; CHECK: eaget 147 %v6 = call i32 @llvm.mblaze.fsl.ecget(i32 1) 148 ; CHECK-NOT: ecgetd 149 ; CHECK: ecget 150 %v7 = call i32 @llvm.mblaze.fsl.ecaget(i32 1) 151 ; CHECK-NOT: ecagetd 152 ; CHECK: ecaget 153 %v8 = call i32 @llvm.mblaze.fsl.nget(i32 1) 154 ; CHECK-NOT: ngetd 155 ; CHECK: nget 156 %v9 = call i32 @llvm.mblaze.fsl.naget(i32 1) 157 ; CHECK-NOT: nagetd 158 ; CHECK: naget 159 %v10 = call i32 @llvm.mblaze.fsl.ncget(i32 1) 160 ; CHECK-NOT: ncgetd 161 ; CHECK: ncget 162 %v11 = call i32 @llvm.mblaze.fsl.ncaget(i32 1) 163 ; CHECK-NOT: ncagetd 164 ; CHECK: ncaget 165 %v12 = call i32 @llvm.mblaze.fsl.neget(i32 1) 166 ; CHECK-NOT: negetd 167 ; CHECK: neget 168 %v13 = call i32 @llvm.mblaze.fsl.neaget(i32 1) 169 ; CHECK-NOT: neagetd 170 ; CHECK: neaget 171 %v14 = call i32 @llvm.mblaze.fsl.necget(i32 1) 172 ; CHECK-NOT: necgetd 173 ; CHECK: necget 174 %v15 = call i32 @llvm.mblaze.fsl.necaget(i32 1) 175 ; CHECK-NOT: necagetd 176 ; CHECK: necaget 177 %v16 = call i32 @llvm.mblaze.fsl.tget(i32 1) 178 ; CHECK-NOT: tgetd 179 ; CHECK: tget 180 %v17 = call i32 @llvm.mblaze.fsl.taget(i32 1) 181 ; CHECK-NOT: tagetd 182 ; CHECK: taget 183 %v18 = call i32 @llvm.mblaze.fsl.tcget(i32 1) 184 ; CHECK-NOT: tcgetd 185 ; CHECK: tcget 186 %v19 = call i32 @llvm.mblaze.fsl.tcaget(i32 1) 187 ; CHECK-NOT: tcagetd 188 ; CHECK: tcaget 189 %v20 = call i32 @llvm.mblaze.fsl.teget(i32 1) 190 ; CHECK-NOT: tegetd 191 ; CHECK: teget 192 %v21 = call i32 @llvm.mblaze.fsl.teaget(i32 1) 193 ; CHECK-NOT: teagetd 194 ; CHECK: teaget 195 %v22 = call i32 @llvm.mblaze.fsl.tecget(i32 1) 196 ; CHECK-NOT: tecgetd 197 ; CHECK: tecget 198 %v23 = call i32 @llvm.mblaze.fsl.tecaget(i32 1) 199 ; CHECK-NOT: tecagetd 200 ; CHECK: tecaget 201 %v24 = call i32 @llvm.mblaze.fsl.tnget(i32 1) 202 ; CHECK-NOT: tngetd 203 ; CHECK: tnget 204 %v25 = call i32 @llvm.mblaze.fsl.tnaget(i32 1) 205 ; CHECK-NOT: tnagetd 206 ; CHECK: tnaget 207 %v26 = call i32 @llvm.mblaze.fsl.tncget(i32 1) 208 ; CHECK-NOT: tncgetd 209 ; CHECK: tncget 210 %v27 = call i32 @llvm.mblaze.fsl.tncaget(i32 1) 211 ; CHECK-NOT: tncagetd 212 ; CHECK: tncaget 213 %v28 = call i32 @llvm.mblaze.fsl.tneget(i32 1) 214 ; CHECK-NOT: tnegetd 215 ; CHECK: tneget 216 %v29 = call i32 @llvm.mblaze.fsl.tneaget(i32 1) 217 ; CHECK-NOT: tneagetd 218 ; CHECK: tneaget 219 %v30 = call i32 @llvm.mblaze.fsl.tnecget(i32 1) 220 ; CHECK-NOT: tnecgetd 221 ; CHECK: tnecget 222 %v31 = call i32 @llvm.mblaze.fsl.tnecaget(i32 1) 223 ; CHECK-NOT: tnecagetd 224 ; CHECK: tnecaget 225 ret void 226 ; CHECK: rtsd 227 } 228 229 define void @putfsl(i32 %value, i32 %port) { 230 ; CHECK: putfsl: 231 call void @llvm.mblaze.fsl.put(i32 %value, i32 %port) 232 ; CHECK: putd 233 call void @llvm.mblaze.fsl.aput(i32 %value, i32 %port) 234 ; CHECK-NEXT: aputd 235 call void @llvm.mblaze.fsl.cput(i32 %value, i32 %port) 236 ; CHECK-NEXT: cputd 237 call void @llvm.mblaze.fsl.caput(i32 %value, i32 %port) 238 ; CHECK-NEXT: caputd 239 call void @llvm.mblaze.fsl.nput(i32 %value, i32 %port) 240 ; CHECK-NEXT: nputd 241 call void @llvm.mblaze.fsl.naput(i32 %value, i32 %port) 242 ; CHECK-NEXT: naputd 243 call void @llvm.mblaze.fsl.ncput(i32 %value, i32 %port) 244 ; CHECK-NEXT: ncputd 245 call void @llvm.mblaze.fsl.ncaput(i32 %value, i32 %port) 246 ; CHECK-NEXT: ncaputd 247 call void @llvm.mblaze.fsl.tput(i32 %port) 248 ; CHECK-NEXT: tputd 249 call void @llvm.mblaze.fsl.taput(i32 %port) 250 ; CHECK-NEXT: taputd 251 call void @llvm.mblaze.fsl.tcput(i32 %port) 252 ; CHECK-NEXT: tcputd 253 call void @llvm.mblaze.fsl.tcaput(i32 %port) 254 ; CHECK-NEXT: tcaputd 255 call void @llvm.mblaze.fsl.tnput(i32 %port) 256 ; CHECK-NEXT: tnputd 257 call void @llvm.mblaze.fsl.tnaput(i32 %port) 258 ; CHECK-NEXT: tnaputd 259 call void @llvm.mblaze.fsl.tncput(i32 %port) 260 ; CHECK-NEXT: tncputd 261 call void @llvm.mblaze.fsl.tncaput(i32 %port) 262 ; CHECK-NEXT: tncaputd 263 ret void 264 ; CHECK: rtsd 265 } 266 267 define void @putfsl_const(i32 %value) { 268 ; CHECK: putfsl_const: 269 call void @llvm.mblaze.fsl.put(i32 %value, i32 1) 270 ; CHECK-NOT: putd 271 ; CHECK: put 272 call void @llvm.mblaze.fsl.aput(i32 %value, i32 1) 273 ; CHECK-NOT: aputd 274 ; CHECK: aput 275 call void @llvm.mblaze.fsl.cput(i32 %value, i32 1) 276 ; CHECK-NOT: cputd 277 ; CHECK: cput 278 call void @llvm.mblaze.fsl.caput(i32 %value, i32 1) 279 ; CHECK-NOT: caputd 280 ; CHECK: caput 281 call void @llvm.mblaze.fsl.nput(i32 %value, i32 1) 282 ; CHECK-NOT: nputd 283 ; CHECK: nput 284 call void @llvm.mblaze.fsl.naput(i32 %value, i32 1) 285 ; CHECK-NOT: naputd 286 ; CHECK: naput 287 call void @llvm.mblaze.fsl.ncput(i32 %value, i32 1) 288 ; CHECK-NOT: ncputd 289 ; CHECK: ncput 290 call void @llvm.mblaze.fsl.ncaput(i32 %value, i32 1) 291 ; CHECK-NOT: ncaputd 292 ; CHECK: ncaput 293 call void @llvm.mblaze.fsl.tput(i32 1) 294 ; CHECK-NOT: tputd 295 ; CHECK: tput 296 call void @llvm.mblaze.fsl.taput(i32 1) 297 ; CHECK-NOT: taputd 298 ; CHECK: taput 299 call void @llvm.mblaze.fsl.tcput(i32 1) 300 ; CHECK-NOT: tcputd 301 ; CHECK: tcput 302 call void @llvm.mblaze.fsl.tcaput(i32 1) 303 ; CHECK-NOT: tcaputd 304 ; CHECK: tcaput 305 call void @llvm.mblaze.fsl.tnput(i32 1) 306 ; CHECK-NOT: tnputd 307 ; CHECK: tnput 308 call void @llvm.mblaze.fsl.tnaput(i32 1) 309 ; CHECK-NOT: tnaputd 310 ; CHECK: tnaput 311 call void @llvm.mblaze.fsl.tncput(i32 1) 312 ; CHECK-NOT: tncputd 313 ; CHECK: tncput 314 call void @llvm.mblaze.fsl.tncaput(i32 1) 315 ; CHECK-NOT: tncaputd 316 ; CHECK: tncaput 317 ret void 318 ; CHECK: rtsd 319 } 320