1# Copyright (c) 2021-2022 Huawei Device Co., Ltd. 2# Licensed under the Apache License, Version 2.0 (the "License"); 3# you may not use this file except in compliance with the License. 4# You may obtain a copy of the License at 5# 6# http://www.apache.org/licenses/LICENSE-2.0 7# 8# Unless required by applicable law or agreed to in writing, software 9# distributed under the License is distributed on an "AS IS" BASIS, 10# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11# See the License for the specific language governing permissions and 12# limitations under the License. 13 14definitions: [] 15tests: 16 - file-name: "mov" 17 isa: 18 title: Move register-to-register 19 description: Move values between registers. 20 exceptions: 21 - x_none 22 commands: 23 - file-name: "op_vs_4_vs_4" 24 isa: 25 instructions: 26 - sig: mov v1:out:b32, v2:in:b32 27 acc: none 28 format: [op_v1_4_v2_4, op_v1_8_v2_8, op_v1_16_v2_16] 29 code-template: | 30 # 31 movi %s, 0x12345678 32 mov %s, %s 33 ldai 0x12345678 34 jne %s, set_failure 35 ldai 0 36 jmp fall_through 37 set_failure: 38 ldai 1 39 fall_through: 40 description: Check mov instruction with different register numbers (4 bit). 41 cases: 42 - values: [v0, v0, v0, v0] 43 - values: [v0, v1, v0, v1] 44 - values: [v0, v2, v0, v2] 45 - values: [v0, v4, v0, v4] 46 - values: [v0, v7, v0, v7] 47 - values: [v1, v1, v1, v1] 48 - values: [v1, v2, v1, v2] 49 - values: [v1, v4, v1, v4] 50 - values: [v1, v7, v1, v7] 51 - values: [v2, v2, v2, v2] 52 - values: [v2, v4, v2, v4] 53 - values: [v2, v7, v2, v7] 54 - values: [v4, v4, v4, v4] 55 - values: [v4, v7, v4, v7] 56 - values: [v7, v7, v7, v7] 57 58 - file-name: "op_vs_8_vs_8" 59 isa: 60 instructions: 61 - sig: mov v1:out:b32, v2:in:b32 62 acc: none 63 format: [op_v1_4_v2_4, op_v1_8_v2_8, op_v1_16_v2_16] 64 code-template: | 65 # 66 movi %s, 0x12345678 67 mov %s, %s 68 ldai 0x12345678 69 jne %s, set_failure 70 ldai 0 71 jmp fall_through 72 set_failure: 73 ldai 1 74 fall_through: 75 description: Check mov instruction with different register numbers (8 bit). 76 cases: 77 - values: [v0, v8, v0, v8] 78 - values: [v0, v64, v0, v64] 79 - values: [v0, v128, v0, v128] 80 - values: [v0, v255, v0, v255] 81 - values: [v8, v0, v8, v0] 82 - values: [v64, v0, v64, v0] 83 - values: [v128, v0, v128, v0] 84 - values: [v255, v0, v255, v0] 85 - values: [v8, v8, v8, v8] 86 - values: [v8, v64, v8, v64] 87 - values: [v8, v128, v8, v128] 88 - values: [v8, v255, v8, v255] 89 - values: [v64, v64, v64, v64] 90 - values: [v64, v128, v64, v128] 91 - values: [v64, v255, v64, v255] 92 - values: [v128, v128, v128, v128] 93 - values: [v128, v255, v128, v255] 94 - values: [v255, v255, v255, v255] 95 96 - file-name: "op_vs_16_vs_16" 97 isa: 98 instructions: 99 - sig: mov v1:out:b32, v2:in:b32 100 acc: none 101 format: [op_v1_4_v2_4, op_v1_8_v2_8, op_v1_16_v2_16] 102 code-template: | 103 # 104 movi v0, 0x12345678 105 mov %s, v0 106 mov %s, %s 107 mov v1, %s 108 ldai 0x12345678 109 jne v1, set_failure 110 ldai 0 111 jmp fall_through 112 set_failure: 113 ldai 1 114 fall_through: 115 description: Check mov instruction with different register numbers (16 bit). 116 tags: ['tsan'] 117 cases: 118 - values: [v256, v256, v256, v256] 119 - values: [v256, v1024, v256, v1024] 120 - values: [v256, v32768, v256, v32768] 121 - values: [v256, v65535, v256, v65535] 122 - values: [v1024, v1024, v1024, v1024] 123 - values: [v1024, v32768, v1024, v32768] 124 - values: [v1024, v65535, v1024, v65535] 125 - values: [v32768, v32768, v32768, v32768] 126 - values: [v32768, v65535, v32768, v65535] 127 - values: [v65535, v65535, v65535, v65535] 128 129 - file-name: "err" 130 isa: 131 instructions: 132 - sig: mov v1:out:b32, v2:in:b32 133 acc: none 134 format: [op_v1_4_v2_4, op_v1_8_v2_8, op_v1_16_v2_16] 135 code-template: | 136 # 137 mov %s, %s 138 check-type: none 139 runner-options: [compile-failure] 140 description: Test erroneous code with mov instruction. 141 cases: 142 - values: [v0, v65536] 143 description: Check when register number is out of range. 144 - values: [v65536, v65536] 145 description: Check when register number is out of range. 146 - values: [v65536, v0] 147 description: Check when register number is out of range. 148 - values: [v65536, a0] 149 description: Check when register number is out of range and incorrect register name. 150 - values: [a0, v65536] 151 description: Check when register number is out of range and incorrect register name. 152 - values: [a0, a0] 153 description: Check when register number is out of range and incorrect register name. 154 - values: [1, v65536] 155 description: Check with incorrect destination and register number out of range. 156 157 - file-name: "type_1" 158 isa: 159 instructions: 160 - sig: mov v1:out:b32, v2:in:b32 161 acc: none 162 format: [op_v1_4_v2_4, op_v1_8_v2_8, op_v1_16_v2_16] 163 code-template: | 164 # 165 %s 166 mov v1, v0 167 %s 168 %s 169 bugid: ['1324'] 170 tags: ['verifier'] 171 runner-options: ['verifier-failure', 'verifier-config'] 172 description: | 173 Check mov with different type of source register - i64 (failure) values, 174 f64 (failure) values, Object (failure). 175 cases: 176 - values: ["movi.64 v0, 0", "ldai.64 0", "cmp.64 v1"] 177 - values: ["movi.64 v0, 0x12345678", "ldai.64 0x12345678", "cmp.64 v1"] 178 - values: ["movi.64 v0, 0x123456789", "ldai.64 0x123456789", "fcmpg.64 v1"] 179 - values: ["fmovi.64 v0, 0", "fldai.64 0", "fcmpg.64 v1"] 180 - values: ["fmovi.64 v0, 1", "fldai.64 1", "fcmpg.64 v1"] 181 - values: ["fmovi.64 v0, 0x1", "fldai.64 0x1", "fcmpg.64 v1"] 182 - values: ["fmovi.64 v0, 0x12345678", "fldai.64 0x12345678 ", "fcmpg.64 v1"] 183 - values: ["fmovi.64 v0, 0x123456789", "fldai.64 0x123456789", "fcmpg.64 v1"] 184 - values: 185 - mov.null v0 186 - lda.null 187 - | 188 # 189 jne.obj v1, return_ne_num 190 ldai 0 191 return 192 return_ne_num: 193 ldai 1 194 return 195 196 - file-name: "vals_pos" 197 isa: 198 instructions: 199 - sig: mov v1:out:b32, v2:in:b32 200 acc: none 201 format: [op_v1_4_v2_4, op_v1_8_v2_8, op_v1_16_v2_16] 202 code-template: | 203 # 204 movi v0, %s 205 mov v1, v0 206 lda v0 207 jne v1, set_failure 208 ldai 0 209 return 210 set_failure: 211 ldai 1 212 return 213 check-type: no-check 214 description: Check mov instruction moves i32 value from register to register. 215 cases: 216 - values: ['0'] 217 - values: ['1'] 218 - values: ['0x80'] 219 - values: ['0xff'] 220 - values: ['0x8000'] 221 - values: ['0xffff'] 222 - values: ['0x80000000'] 223 - values: ['0xffffffff'] 224 - values: ['0x12345678'] 225 - values: ['0x87654321'] 226 227 - file-name: "vals_pos_f32" 228 isa: 229 instructions: 230 - sig: mov v1:out:b32, v2:in:b32 231 acc: none 232 format: [op_v1_4_v2_4, op_v1_8_v2_8, op_v1_16_v2_16] 233 code-template: | 234 # 235 fmovi v0, %s 236 mov v1, v0 237 lda v0 238 fcmpg v1 239 jnez set_failure 240 ldai 0 241 return 242 set_failure: 243 ldai 1 244 return 245 check-type: no-check 246 description: Check mov instruction moves f32 value from register to register. 247 cases: 248 - values: ['1e1'] 249 - values: ['0.000314'] 250 251 - file-name: "vals_neg" 252 isa: 253 instructions: 254 - sig: mov v1:out:b32, v2:in:b32 255 acc: none 256 format: [op_v1_4_v2_4, op_v1_8_v2_8, op_v1_16_v2_16] 257 code-template: | 258 # 259 movi v0, %s 260 mov v1, v0 261 lda v0 262 jne v1, set_failure 263 ldai 0 264 return 265 set_failure: 266 ldai 1 267 return 268 check-type: no-check 269 description: Check mov instruction moves i32 values from register to register 270 cases: 271 - values: ['-1'] 272 - values: ['-0x80'] 273 - values: ['-0xff'] 274 - values: ['-0x8000'] 275 - values: ['-0xffff'] 276 - values: ['-0x80000000'] 277 - values: ['-0xffffffff'] 278 - values: ['-0x12345678'] 279 - values: ['-0x87654321'] 280 281 - file-name: "vals_neg_f32" 282 isa: 283 instructions: 284 - sig: mov v1:out:b32, v2:in:b32 285 acc: none 286 format: [op_v1_4_v2_4, op_v1_8_v2_8, op_v1_16_v2_16] 287 code-template: | 288 # 289 fmovi v0, %s 290 mov v1, v0 291 lda v0 292 fcmpg v1 293 jnez set_failure 294 ldai 0 295 return 296 set_failure: 297 ldai 1 298 return 299 check-type: no-check 300 description: Check mov instruction moves f32 values from register to register 301 cases: 302 - values: ['-0.01789'] 303 - values: ['-0.2e-2'] 304 305 - file-name: "type" 306 tags: ['verifier'] 307 isa: 308 instructions: 309 - sig: mov v1:out:b32, v2:in:b32 310 acc: none 311 format: [op_v1_4_v2_4, op_v1_8_v2_8, op_v1_16_v2_16] 312 verification: 313 - v2_type 314 runner-options: ['verifier-failure', 'verifier-config'] 315 header-template: [] 316 code-template: | 317 # 318 .record A {} 319 .record B {} 320 .record panda.String <external> 321 .record panda.Object <external> 322 .function i32 main() { 323 %s 324 *s 325 mov v0, v1 326 ldai 0 327 check-type: no-check 328 description: Check mov with incorrect source register type. Destination type is not checked. 329 template-cases: 330 - values: 331 - | 332 # 333 lda.type B 334 sta.obj v0 335 - values: 336 - | 337 # 338 lda.type B[] 339 sta.obj v0 340 - values: 341 - | 342 # 343 lda.type panda.String 344 sta.obj v0 345 - values: 346 - | 347 # 348 lda.type panda.Object 349 sta.obj v0 350 - values: 351 - | 352 # 353 movi v0, 10 354 newarr v0, v0, i32[] 355 - values: 356 - mov.null v0 357 - values: 358 - movi v0, 0 359 - values: 360 - movi.64 v0, 0 361 - values: 362 - fmovi.64 v0, 0 363 cases: 364 - values: 365 - movi.64 v1, 0 366 - values: 367 - fmovi.64 v1, 0 368 - values: 369 - | 370 # 371 lda.type A 372 sta.obj v1 373 - values: 374 - | 375 # 376 lda.type A[] 377 sta.obj v1 378 - values: 379 - | 380 # 381 lda.type panda.String 382 sta.obj v1 383 - values: 384 - | 385 # 386 lda.str "string" 387 sta.obj v1 388 - values: 389 - | 390 # 391 lda.type panda.Object 392 sta.obj v1 393 - values: 394 - | 395 # 396 movi v1, 10 397 newarr v1, v1, f64[] 398 - values: 399 - mov.null v1 400 401 - file-name: uninitialized_regs 402 isa: 403 instructions: 404 - sig: mov v1:out:b32, v2:in:b32 405 acc: none 406 format: [op_v1_4_v2_4, op_v1_8_v2_8, op_v1_16_v2_16] 407 description: Check mov with uninitialized registers. 408 tags: ['verifier'] 409 runner-options: ['verifier-failure', 'verifier-config'] 410 header-template: [] 411 code-template: | 412 # 413 .function u32 main() { 414 %s 415 *s 416 mov %s, *s 417 ldai 0 418 check-type: no-check 419 template-cases: 420 - values: ['', 'v0'] 421 - values: ['', 'v256'] 422 - values: ['', 'v65535'] 423 - values: 424 - movi.64 v2, 0 425 - v2 426 - values: 427 - | 428 # 429 fmovi.64 v1, 0 430 mov.64 v65534, v1 431 - v65534 432 - values: 433 - | 434 # 435 fmovi.64 v1, 0 436 mov.64 v257, v1 437 - v257 438 cases: 439 - values: 440 - '' 441 - v0 442 - values: 443 - '' 444 - v8 445 - values: 446 - '' 447 - v15 448 - values: 449 - '' 450 - v256 451 - values: 452 - '' 453 - v65535 454