1# Copyright (c) 2021 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:i32, v2:in:i32 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:i32, v2:in:i32 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:i32, v2:in:i32 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:i32, v2:in:i32 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:i32, v2:in:i32 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-debug-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:i32, v2:in:i32 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 jmp fall_through 210 set_failure: 211 ldai 1 212 fall_through: 213 description: Check mov instruction moves value from register to register. 214 cases: 215 - values: ['0'] 216 - values: ['1'] 217 - values: ['0x80'] 218 - values: ['0xff'] 219 - values: ['0x8000'] 220 - values: ['0xffff'] 221 - values: ['0x80000000'] 222 - values: ['0xffffffff'] 223 - values: ['0x12345678'] 224 - values: ['0x87654321'] 225 226 - file-name: "vals_neg" 227 isa: 228 instructions: 229 - sig: mov v1:out:i32, v2:in:i32 230 acc: none 231 format: [op_v1_4_v2_4, op_v1_8_v2_8, op_v1_16_v2_16] 232 code-template: | 233 # 234 movi v0, %s 235 mov v1, v0 236 lda v0 237 jne v1, set_failure 238 ldai 0 239 jmp fall_through 240 set_failure: 241 ldai 1 242 fall_through: 243 description: Check mov instruction moves values from register to register 244 cases: 245 - values: ['-1'] 246 - values: ['-0x80'] 247 - values: ['-0xff'] 248 - values: ['-0x8000'] 249 - values: ['-0xffff'] 250 - values: ['-0x80000000'] 251 - values: ['-0xffffffff'] 252 - values: ['-0x12345678'] 253 - values: ['-0x87654321'] 254 255 - file-name: "type" 256 tags: ['verifier'] 257 isa: 258 instructions: 259 - sig: mov v1:out:i32, v2:in:i32 260 acc: none 261 format: [op_v1_4_v2_4, op_v1_8_v2_8, op_v1_16_v2_16] 262 verification: 263 - v2_type 264 runner-options: ['verifier-failure', 'verifier-debug-config'] 265 header-template: [] 266 code-template: | 267 # 268 .record A {} 269 .record B {} 270 .record panda.String <external> 271 .record panda.Object <external> 272 .function i32 main() { 273 %s 274 *s 275 mov v0, v1 276 ldai 0 277 check-type: no-check 278 description: Check mov with incorrect source register type. Destination type is not checked. 279 template-cases: 280 - values: 281 - | 282 # 283 lda.type B 284 sta.obj v0 285 - values: 286 - | 287 # 288 lda.type B[] 289 sta.obj v0 290 - values: 291 - | 292 # 293 lda.type panda.String 294 sta.obj v0 295 - values: 296 - | 297 # 298 lda.type panda.Object 299 sta.obj v0 300 - values: 301 - | 302 # 303 movi v0, 10 304 newarr v0, v0, i32[] 305 - values: 306 - mov.null v0 307 - values: 308 - movi v0, 0 309 - values: 310 - movi.64 v0, 0 311 - values: 312 - fmovi.64 v0, 0 313 cases: 314 - values: 315 - movi.64 v1, 0 316 - values: 317 - fmovi.64 v1, 0 318 - values: 319 - | 320 # 321 lda.type A 322 sta.obj v1 323 - values: 324 - | 325 # 326 lda.type A[] 327 sta.obj v1 328 - values: 329 - | 330 # 331 lda.type panda.String 332 sta.obj v1 333 - values: 334 - | 335 # 336 lda.str "string" 337 sta.obj v1 338 - values: 339 - | 340 # 341 lda.type panda.Object 342 sta.obj v1 343 - values: 344 - | 345 # 346 movi v1, 10 347 newarr v1, v1, f64[] 348 - values: 349 - mov.null v1 350 351 - file-name: uninitialized_regs 352 isa: 353 instructions: 354 - sig: mov v1:out:i32, v2:in:i32 355 acc: none 356 format: [op_v1_4_v2_4, op_v1_8_v2_8, op_v1_16_v2_16] 357 description: Check mov with uninitialized registers. 358 tags: ['verifier'] 359 runner-options: ['verifier-failure', 'verifier-debug-config'] 360 header-template: [] 361 code-template: | 362 # 363 .function u32 main() { 364 %s 365 *s 366 mov %s, *s 367 ldai 0 368 check-type: no-check 369 template-cases: 370 - values: ['', 'v0'] 371 - values: ['', 'v256'] 372 - values: ['', 'v65535'] 373 - values: 374 - movi.64 v2, 0 375 - v2 376 - values: 377 - | 378 # 379 fmovi.64 v1, 0 380 mov.64 v65534, v1 381 - v65534 382 - values: 383 - | 384 # 385 fmovi.64 v1, 0 386 mov.64 v257, v1 387 - v257 388 cases: 389 - values: 390 - '' 391 - v0 392 - values: 393 - '' 394 - v8 395 - values: 396 - '' 397 - v15 398 - values: 399 - '' 400 - v256 401 - values: 402 - '' 403 - v65535 404