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 14--- 15definitions: 16 - name: java 17 template: > 18 .language Java 19 20tests: 21 - file-name: call 22 isa: 23 title: Static call 24 description: > 25 Call indicated static method, i.e. create new frame, pass values of arguments and 26 continue execution from the first instruction of a method. 27 Callee should treat accumulator value as undefined and cannot use it until accumulator 28 definition in the new frame. 29 Result (if any) is returned in accumulator (see 'Calling sequence' chapter for more details). 30 Method, its class and the number of argument is resolved by given method_id in 31 runtime constant-pool. 32 Arguments are passed in source registers in the same order as in method signature. 33 Non-range instructions can be used to pass up to 4 arguments (unused register slot values will 34 be discarded and corresponding registers will not be passed to the callee). 35 For methods with more arguments range kind of instruction is to be used, which takes the needed number 36 of arguments starting from 'vs' register. 37 exceptions: 38 - x_none 39 verification: 40 - method_id_static 41 - compatible_arguments 42 commands: 43 - file-name: op_v1_4_v2_4_v3_4_v4_4_id_16 44 isa: 45 instructions: 46 - sig: call method_id, v1:in:top, v2:in:top, v3:in:top, v4:in:top 47 acc: out:top 48 format: [op_v1_4_v2_4_v3_4_v4_4_id_16] 49 header-template: [] 50 description: Check that 'call' supports up to 4 arguments. 51 tags: ['tsan'] 52 code-template: | 53 .function void f1(%s) { 54 return.void 55 } 56 .function i32 main() { 57 %s 58 call f1%s 59 check-type: exit-positive 60 cases: 61 - values: 62 - '' 63 - '' 64 - '' 65 - values: 66 - 'i32 a0' 67 - 'movi v0, 0' 68 - ', v0' 69 - values: 70 - 'i32 a0, i32 a1' 71 - 'movi v0, 0' 72 - ', v0, v0' 73 - values: 74 - 'i32 a0, i32 a1' 75 - | 76 # 77 movi v0, 0 78 movi v1, 0 79 - ', v0, v1' 80 - values: 81 - 'i32 a0, i32 a1' 82 - | 83 # 84 movi v0, 0 85 movi v1, 0 86 - ', v1, v0' 87 - values: 88 - 'i64 a0, f64 a1' 89 - | 90 # 91 movi.64 v0, 0 92 fmovi.64 v1, 0 93 - ', v0, v1' 94 - values: 95 - 'i32 a0, i32 a1, i32 a2' 96 - 'movi v0, 0' 97 - ', v0, v0, v0' 98 - values: 99 - 'i32 a0, i32 a1, i32 a2, i32 a3' 100 - 'movi v0, 0' 101 - ', v0, v0, v0, v0' 102 - values: 103 - 'i32 a0, i32 a1, i32 a2, i32 a3, i32 a4' 104 - | 105 # 106 movi v0, 0 107 movi v1, 0 108 movi v2, 0 109 movi v3, 0 110 - ', v0, v1, v2, v3' 111 runner-options: [compile-failure] 112 - values: 113 - 'i32 a0, i32 a1, i32 a2, i32 a3, i32 a4' 114 - | 115 # 116 movi v0, 0 117 movi v1, 0 118 movi v2, 0 119 movi v3, 0 120 movi v4, 0 121 - ', v0, v1, v2, v3, v4' 122 runner-options: [compile-failure] 123 124 - file-name: str_arg 125 isa: 126 instructions: 127 - sig: call method_id, v1:in:top, v2:in:top, v3:in:top, v4:in:top 128 acc: out:top 129 format: [op_v1_4_v2_4_v3_4_v4_4_id_16] 130 header-template: [panda_string] 131 description: Check that 'call' works with String object. 132 code-template: | 133 .function void f1(panda.String a0) { 134 return.void 135 } 136 .function i32 main() { 137 %s 138 call f1%s 139 check-type: exit-positive 140 cases: 141 - values: 142 - '' 143 - '' 144 runner-options: [compile-failure] 145 - values: 146 - | 147 # 148 lda.str "some string" 149 sta.obj v0 150 - ', v0' 151 - values: 152 - ' mov.null v0' 153 - ', v0' 154 - values: 155 - '' 156 - ', "some string"' 157 runner-options: [compile-failure] 158 159 - file-name: uninitialized_values 160 bugid: ['1324'] 161 tags: ['verifier'] 162 runner-options: ['verifier-failure', 'verifier-debug-config'] 163 isa: 164 instructions: 165 - sig: call method_id, v1:in:top, v2:in:top, v3:in:top, v4:in:top 166 acc: out:top 167 format: [op_v1_4_v2_4_v3_4_v4_4_id_16] 168 description: Verifier should check usage of uninitialized arguments passed to function. 169 header-template: [] 170 code-template: | 171 .function void f1(%s) { 172 %s 173 return.void 174 } 175 .function i32 main() { 176 %s 177 call f1%s 178 check-type: exit-positive 179 180 # Template parameters: 181 # 1st argument is function arguments 182 # 2nd - usage of acc or reg 183 # 3rd - possible initialization of registers 184 # 4th - call parameters 185 cases: 186 - values: ['i32 a0', '', '', ', v0'] 187 - values: ['i32 a0, i32 a1, i32 a2, i32 a3', '', '', ', v0, v0, v0, v0'] 188 - values: ['i32 a0, f64 a1, i64 a2, i32 a3', '', '', ', v0, v1, v2, v3'] 189 - values: ['i32 a0, i32 a1', '', 'movi v0, 0', ', v0, v1'] 190 description: Check if several registers in 'call' is uninitialized. 191 - values: ['i32 a0, f64 a1, i64 a2, i32 a3', '', 'movi v0, 0', ', v0, v1, v2, v3'] 192 description: Check if several registers in 'call' is uninitialized. 193 - values: 194 - '' 195 - | 196 # 197 lda a3 198 lda a4 199 - '' 200 - '' 201 description: Check usage of undefined parameter. 202 runner-options: [compile-failure] 203 204 - file-name: uninitialized_reg_no_arg 205 bugid: ['1324'] 206 tags: ['verifier'] 207 runner-options: ['verifier-failure', 'verifier-debug-config'] 208 isa: 209 instructions: 210 - sig: call method_id, v1:in:top, v2:in:top, v3:in:top, v4:in:top 211 acc: out:top 212 format: [op_v1_4_v2_4_v3_4_v4_4_id_16] 213 description: Verifier should check usage of uninitialized registers in function. 214 header-template: [] 215 code-template: | 216 .function void f1() { 217 %s 218 return.void 219 } 220 .function i32 main() { 221 %s 222 call f1 223 check-type: exit-positive 224 cases: 225 - values: 226 - lda v0 227 - movi v0, 123 228 - values: 229 - lda v1 230 - movi v1, 123 231 - values: 232 - lda.64 v0 233 - movi.64 v0, 0xFFFFFFFFFFFFFFFF 234 - values: 235 - lda.64 v1 236 - movi.64 v1, 0xFFFFFFFFFFFFFFFF 237 - values: 238 - lda.64 v0 239 - fmovi.64 v0, 3.1415926535 240 - values: 241 - lda.64 v1 242 - movi.64 v1, 0xFFFFFFFFFFFFFFFF 243 - values: 244 - lda.obj v0 245 - | 246 # 247 lda.str "some string" 248 sta.obj v0 249 - values: 250 - lda.obj v1 251 - | 252 # 253 lda.str "some string" 254 sta.obj v1 255 256 - file-name: args_count_mismatch 257 runner-options: [compile-only] 258 isa: 259 instructions: 260 - sig: call method_id, v1:in:top, v2:in:top, v3:in:top, v4:in:top 261 acc: out:top 262 format: [op_v1_4_v2_4_v3_4_v4_4_id_16] 263 description: Check 'call' when arguments of function and instuction parameters mismatch. 264 header-template: [] 265 code-template: | 266 .function void f1(%s) { 267 return.void 268 } 269 .function i32 main() { 270 %s 271 call f1%s 272 check-type: exit-positive 273 274 # Template parameters: 275 # 1st - function arguments 276 # 2nd - possible initialization of registers 277 # 3rd - call parameters 278 cases: 279 - values: ['', '', ', v0'] 280 description: Check uninitialized register is ignored when its value is not used. 281 - values: ['', '', ', v0, v0, v0, v0'] 282 description: Check uninitialized register is ignored when its value is not used. 283 - values: ['i32 a0', '', ''] 284 runner-options: [compile-failure] 285 description: Mismatch function parameters. 286 - values: ['i32 a0, i32 a1, i32 a2, i32 a3', 'movi v0, 0', ', v0, v0, v0'] 287 runner-options: [compile-failure] 288 description: Mismatch function parameters. 289 - values: ['i32 a0, i32 a1, i32 a2, i32 a3', 'movi v0, 0', ', v0'] 290 runner-options: [compile-failure] 291 description: Mismatch function parameters. 292 - values: ['', 'movi v0, 0', ', v0'] 293 description: Check initialized register is ignored when its value is not used. 294 - values: ['i32 a0', 'movi v0, 0', ', v0, v0, v0, v0'] 295 description: Check initialized register is ignored when its value is not used. 296 - values: ['i32 a0, i32 a1, i32 a2', 'movi v0, 0', ', v0, v0, v0, v0'] 297 description: Check initialized register is ignored when its value is not used. 298 299 - file-name: args_type_mismatch 300 bugid: ['1324'] 301 tags: ['verifier'] 302 runner-options: ['verifier-failure', 'verifier-debug-config'] 303 isa: 304 instructions: 305 - sig: call method_id, v1:in:top, v2:in:top, v3:in:top, v4:in:top 306 acc: out:top 307 format: [op_v1_4_v2_4_v3_4_v4_4_id_16] 308 description: Check 'call' when argument type of function and instuction mismatch. 309 header-template: [] 310 code-template: | 311 %s 312 .function void f1(%s) { 313 return.void 314 } 315 .function i32 main() { 316 %s 317 call f1, v0 318 check-type: exit-positive 319 320 # Template parameters: 321 # 1 - type definitions 322 # 2 - function arguments 323 # 3 - possible initialization of registers 324 # 4 - call parameters 325 cases: 326 - values: ['', 'i32 a0', 'mov.null v0'] 327 - values: ['', 'i64 a0', 'mov.null v0'] 328 - values: ['', 'f64 a0', 'mov.null v0'] 329 - values: ['', 'i32 a0', 'movi.64 v0, 0'] 330 - values: ['', 'f64 a0', 'movi.64 v0, 0'] 331 - values: ['.record Obj {}', 'Obj a0', 'movi.64 v0, 0'] 332 - values: ['', 'i64 a0', 'movi v0, 0'] 333 - values: ['', 'f64 a0', 'movi v0, 0'] 334 - values: ['.record Obj {}', 'Obj a0', 'movi v0, 0'] 335 - values: 336 - | 337 # 338 .record Obj {} 339 340 .function void Obj.ctor(Obj a0) <ctor> { 341 return.void 342 } 343 - i32 a0 344 - | 345 # 346 initobj.short Obj.ctor 347 sta v0 348 349 - values: 350 - | 351 # 352 .record Obj {} 353 354 .function void Obj.ctor(Obj a0) <ctor> { 355 return.void 356 } 357 - i64 a0 358 - | 359 # 360 initobj.short Obj.ctor 361 sta v0 362 363 - file-name: reg 364 runner-options: [compile-only] 365 isa: 366 instructions: 367 - sig: call method_id, v1:in:top, v2:in:top, v3:in:top, v4:in:top 368 acc: out:top 369 format: [op_v1_4_v2_4_v3_4_v4_4_id_16] 370 description: Check 'call' register number width. 371 header-template: [] 372 code-template: | 373 .function void f1(i32 a0) { 374 return.void 375 } 376 .function i32 main() { 377 movi %s, 0 378 call f1, %s 379 check-type: exit-positive 380 cases: 381 - values: ['v0', 'v0'] 382 - values: ['v7', 'v7'] 383 - values: ['v8', 'v8'] 384 - values: ['v15', 'v15'] 385 - values: ['v16', 'v16'] 386 runner-options: [compile-failure] 387 - values: ['v127', 'v127'] 388 runner-options: [compile-failure] 389 - values: ['v0', '1'] 390 runner-options: [compile-failure] 391 - values: ['v0', '1.1'] 392 runner-options: [compile-failure] 393 - values: ['v0', '0xFFFFFFFFFFFFFFFF'] 394 runner-options: [compile-failure] 395 - values: ['v0', '"some string"'] 396 runner-options: [compile-failure] 397 398 - file-name: reg2 399 runner-options: [compile-only] 400 isa: 401 instructions: 402 - sig: call method_id, v1:in:top, v2:in:top, v3:in:top, v4:in:top 403 acc: out:top 404 format: [op_v1_4_v2_4_v3_4_v4_4_id_16] 405 description: Check 'call' register number width. 406 header-template: [] 407 code-template: | 408 .function void f1(i32 a0, i32 a1, i32 a2, i32 a3) { 409 return.void 410 } 411 .function i32 main() { 412 movi %s, 0 413 movi %s, 1 414 movi %s, 2 415 movi %s, 3 416 call f1, %s, %s, %s, %s 417 check-type: exit-positive 418 cases: 419 - values: ['v0', 'v1', 'v2', 'v3', 'v0', 'v1', 'v2', 'v3'] 420 - values: ['v12', 'v13', 'v14', 'v15', 'v13', 'v13', 'v14', 'v15'] 421 - values: ['v15', 'v15', 'v15', 'v15', 'v15', 'v15', 'v15', 'v15'] 422 - values: ['v15', 'v16', 'v15', 'v16', 'v15', 'v16', 'v15', 'v16'] 423 runner-options: [compile-failure] 424 - values: ['v16', 'v15', 'v16', 'v15', 'v16', 'v15', 'v16', 'v15'] 425 runner-options: [compile-failure] 426 - values: ['v16', 'v16', 'v16', 'v16', 'v16', 'v16', 'v16', 'v16'] 427 runner-options: [compile-failure] 428 - values: ['v127', 'v127', 'v127', 'v127', 'v127', 'v127', 'v127', 'v127'] 429 runner-options: [compile-failure] 430 431 - file-name: arg_1_i32_acc 432 isa: 433 instructions: 434 - sig: call method_id, v1:in:top, v2:in:top, v3:in:top, v4:in:top 435 acc: out:top 436 format: [op_v1_4_v2_4_v3_4_v4_4_id_16] 437 description: Check correctness of passed arguments. Load parameter to accumulator. Check i32 type of arguments. 438 tags: ['tsan'] 439 header-template: [] 440 code-template: | 441 .function i32 f1(i32 a0) { 442 lda a0 443 movi v1, %s 444 jne v1, exit_failure 445 ldai 0 446 return 447 exit_failure: 448 ldai 1 449 return 450 } 451 .function i32 main() { 452 movi v0, %s 453 call f1, v0 454 455 check-type: no-check 456 cases: 457 - values: ["0", "0"] 458 - values: ["1", "1"] 459 - values: ["1234567", "1234567"] 460 - values: ["0x7FFFFFFF", "0x7FFFFFFF"] 461 - values: ["0x80000000", "0x80000000"] 462 - values: ["0x9ABCDEF0", "0x9ABCDEF0"] 463 - values: ["0xFFFFFFFF", "0xFFFFFFFF"] 464 465 - file-name: arg_1_f64_acc 466 isa: 467 instructions: 468 - sig: call method_id, v1:in:top, v2:in:top, v3:in:top, v4:in:top 469 acc: out:top 470 format: [op_v1_4_v2_4_v3_4_v4_4_id_16] 471 description: Check correctness of passed arguments. Load parameter to accumulator. Check f64 type of arguments. 472 header-template: [] 473 code-template: | 474 .function i32 f1(f64 a0) { 475 lda.64 a0 476 fmovi.64 v1, %s 477 fcmpg.64 v1 478 return 479 } 480 .function i32 main() { 481 fmovi.64 v0, %s 482 call f1, v0 483 check-type: no-check 484 cases: 485 - values: ["0", "0"] 486 - values: ["1.1", "1.1"] 487 - values: ["0x7ff0000000000000", "0x7ff0000000000000"] 488 - values: ["0xfff0000000000000", "0xfff0000000000000"] 489 - values: ["0x7fefffffffffffff", "0x7fefffffffffffff"] 490 - values: ["0xffefffffffffffff", "0xffefffffffffffff"] 491 - values: ["100e100", "100e100"] 492 493 - file-name: arg_1_i32_reg 494 isa: 495 instructions: 496 - sig: call method_id, v1:in:top, v2:in:top, v3:in:top, v4:in:top 497 acc: out:top 498 format: [op_v1_4_v2_4_v3_4_v4_4_id_16] 499 description: Check correctness of passed arguments. Load parameter to register. Check i32 type of arguments. 500 header-template: [] 501 code-template: | 502 .function i32 f1(i32 a0) { 503 mov v1, a0 504 ldai %s 505 jne v1, exit_failure 506 ldai 0 507 return 508 exit_failure: 509 ldai 1 510 return 511 } 512 .function i32 main() { 513 movi v0, %s 514 call f1, v0 515 check-type: no-check 516 cases: 517 - values: ["0", "0"] 518 - values: ["1", "1"] 519 - values: ["1234567", "1234567"] 520 - values: ["0x7FFFFFFF", "0x7FFFFFFF"] 521 - values: ["0x80000000", "0x80000000"] 522 - values: ["0x9ABCDEF0", "0x9ABCDEF0"] 523 - values: ["0xFFFFFFFF", "0xFFFFFFFF"] 524 525 - file-name: arg_1_f64_reg 526 isa: 527 instructions: 528 - sig: call method_id, v1:in:top, v2:in:top, v3:in:top, v4:in:top 529 acc: out:top 530 format: [op_v1_4_v2_4_v3_4_v4_4_id_16] 531 description: Check correctness of passed arguments. Load parameter to register. Check f64 type of arguments. 532 header-template: [] 533 code-template: | 534 .function i32 f1(f64 a0) { 535 mov.64 v1, a0 536 fldai.64 %s 537 fcmpg.64 v1 538 return 539 } 540 .function i32 main() { 541 fmovi.64 v0, %s 542 call f1, v0 543 check-type: no-check 544 cases: 545 - values: ["0", "0"] 546 - values: ["1.1", "1.1"] 547 - values: ["0x7ff0000000000000", "0x7ff0000000000000"] 548 - values: ["0xfff0000000000000", "0xfff0000000000000"] 549 - values: ["0x7fefffffffffffff", "0x7fefffffffffffff"] 550 - values: ["0xffefffffffffffff", "0xffefffffffffffff"] 551 - values: ["100e100", "100e100"] 552 553 - file-name: arg_2_i32_acc 554 isa: 555 instructions: 556 - sig: call method_id, v1:in:top, v2:in:top, v3:in:top, v4:in:top 557 acc: out:top 558 format: [op_v1_4_v2_4_v3_4_v4_4_id_16] 559 description: Check correctness of passed arguments. Load parameter to accumulator. Check i32 type of arguments. 560 header-template: [] 561 code-template: | 562 .function i32 f1(i32 a0, i32 a1, i32 a2, i32 a3) { 563 lda a0 564 movi v1, %s 565 jeq v1, f1_check1 566 # 1st arg does not match, exit 567 ldai 1 568 return 569 f1_check1: 570 lda a1 571 movi v1, %s 572 jeq v1, f1_check2 573 ldai 1 574 return 575 f1_check2: 576 lda a2 577 movi v1, %s 578 jeq v1, f1_check3 579 ldai 1 580 return 581 f1_check3: 582 lda a3 583 movi v1, %s 584 jne v1, exit_failure 585 ldai 0 586 return 587 exit_failure: 588 ldai 1 589 return 590 } 591 .function i32 main() { 592 movi v0, %s 593 movi v1, %s 594 movi v2, %s 595 movi v3, %s 596 call f1, v0, v1, v2, v3 597 598 check-type: no-check 599 cases: 600 - values: ["0", "0", "0", "0", "0", "0", "0", "0"] 601 - values: ["0", "1", "2", "3", "0", "1", "2", "3"] 602 - values: ["-3", "-2", "-1", "0", "-3", "-2", "-1", "0"] 603 - values: ["0", "1234567", "89101112", "13141516", "0", "1234567", "89101112", "13141516"] 604 - values: ["0x7FFFFFFF", "0x7FFFFFFF", "0x7FFFFFFF", "0x7FFFFFFF", "0x7FFFFFFF", "0x7FFFFFFF", "0x7FFFFFFF", "0x7FFFFFFF"] 605 - values: ["0", "0x80000000", "0", "0x80000000", "0", "0x80000000", "0", "0x80000000"] 606 - values: ["0x80000000", "0", "0x80000000", "0", "0x80000000", "0", "0x80000000", "0"] 607 - values: ["0x80000000", "0x80000000", "0x80000000", "0x80000000", "0x80000000", "0x80000000", "0x80000000", "0x80000000"] 608 - values: ["0x9ABCDEF0", "0xFEDCBA09", "0x87654321", "0x12345678", "0x9ABCDEF0", "0xFEDCBA09", "0x87654321", "0x12345678"] 609 - values: ["0", "0xFFFFFFFF", "0", "0xFFFFFFFF", "0", "0xFFFFFFFF", "0", "0xFFFFFFFF"] 610 - values: ["0xFFFFFFFF", "0", "0xFFFFFFFF", "0", "0xFFFFFFFF", "0", "0xFFFFFFFF", "0"] 611 - values: ["0xFFFFFFFF", "0xFFFFFFFF", "0xFFFFFFFF", "0xFFFFFFFF", "0xFFFFFFFF", "0xFFFFFFFF", "0xFFFFFFFF", "0xFFFFFFFF"] 612 613 - file-name: arg_2_i32_reg 614 isa: 615 instructions: 616 - sig: call method_id, v1:in:top, v2:in:top, v3:in:top, v4:in:top 617 acc: out:top 618 format: [op_v1_4_v2_4_v3_4_v4_4_id_16] 619 description: Check correctness of passed arguments. Load parameter to register. Check i32 type of arguments. 620 header-template: [] 621 code-template: | 622 .function i32 f1(i32 a0, i32 a1, i32 a2, i32 a3) { 623 mov v1, a0 624 ldai %s 625 jeq v1, f1_check1 626 # 1st arg does not match, exit 627 ldai 1 628 return 629 f1_check1: 630 mov v1, a1 631 ldai %s 632 jeq v1, f1_check2 633 # 1st arg does not match, exit 634 ldai 1 635 return 636 f1_check2: 637 mov v1, a2 638 ldai %s 639 jeq v1, f1_check3 640 # 1st arg does not match, exit 641 ldai 1 642 return 643 f1_check3: 644 mov v1, a3 645 ldai %s 646 jne v1, exit_failure 647 ldai 0 648 return 649 exit_failure: 650 ldai 1 651 return 652 } 653 .function i32 main() { 654 movi v0, %s 655 movi v1, %s 656 movi v2, %s 657 movi v3, %s 658 call f1, v0, v1, v2, v3 659 check-type: no-check 660 cases: 661 - values: ["0", "0", "0", "0", "0", "0", "0", "0"] 662 - values: ["0", "1", "2", "3", "0", "1", "2", "3"] 663 - values: ["-3", "-2", "-1", "0", "-3", "-2", "-1", "0"] 664 - values: ["0", "1234567", "89101112", "13141516", "0", "1234567", "89101112", "13141516"] 665 - values: ["0x7FFFFFFF", "0x7FFFFFFF", "0x7FFFFFFF", "0x7FFFFFFF", "0x7FFFFFFF", "0x7FFFFFFF", "0x7FFFFFFF", "0x7FFFFFFF"] 666 - values: ["0", "0x80000000", "0", "0x80000000", "0", "0x80000000", "0", "0x80000000"] 667 - values: ["0x80000000", "0", "0x80000000", "0", "0x80000000", "0", "0x80000000", "0"] 668 - values: ["0x80000000", "0x80000000", "0x80000000", "0x80000000", "0x80000000", "0x80000000", "0x80000000", "0x80000000"] 669 - values: ["0x9ABCDEF0", "0xFEDCBA09", "0x87654321", "0x12345678", "0x9ABCDEF0", "0xFEDCBA09", "0x87654321", "0x12345678"] 670 - values: ["0", "0xFFFFFFFF", "0", "0xFFFFFFFF", "0", "0xFFFFFFFF", "0", "0xFFFFFFFF"] 671 - values: ["0xFFFFFFFF", "0", "0xFFFFFFFF", "0", "0xFFFFFFFF", "0", "0xFFFFFFFF", "0"] 672 - values: ["0xFFFFFFFF", "0xFFFFFFFF", "0xFFFFFFFF", "0xFFFFFFFF", "0xFFFFFFFF", "0xFFFFFFFF", "0xFFFFFFFF", "0xFFFFFFFF"] 673 674 - file-name: arg_2_f64_acc 675 isa: 676 instructions: 677 - sig: call method_id, v1:in:top, v2:in:top, v3:in:top, v4:in:top 678 acc: out:top 679 format: [op_v1_4_v2_4_v3_4_v4_4_id_16] 680 description: Check correctness of passed arguments. Load parameter to accumulator. Check f64 type of arguments. 681 header-template: [] 682 code-template: | 683 .function i32 f1(f64 a0, f64 a1, f64 a2, f64 a3) { 684 lda.64 a0 685 fmovi.64 v1, %s 686 fcmpg.64 v1 687 jeqz f1_check1 688 # 1st arg does not match, exit 689 ldai 1 690 return 691 f1_check1: 692 lda.64 a1 693 fmovi.64 v1, %s 694 fcmpg.64 v1 695 jeqz f1_check2 696 ldai 1 697 return 698 f1_check2: 699 lda.64 a2 700 fmovi.64 v1, %s 701 fcmpg.64 v1 702 jeqz f1_check3 703 ldai 1 704 return 705 f1_check3: 706 lda.64 a3 707 fmovi.64 v1, %s 708 fcmpg.64 v1 709 return 710 } 711 .function i32 main() { 712 fmovi.64 v0, %s 713 fmovi.64 v1, %s 714 fmovi.64 v2, %s 715 fmovi.64 v3, %s 716 call f1, v0, v1, v2, v3 717 718 check-type: no-check 719 cases: 720 - values: ["0", "0", "0", "0", "0", "0", "0", "0"] 721 - values: ["1.2", "1.1", "1.3", "1.4", "1.2", "1.1", "1.3", "1.4"] 722 - values: ["0x7ff0000000000000", "0xfff0000000000000", "0x0000000000000001", "0x8000000000000001", "0x7ff0000000000000", "0xfff0000000000000", "0x0000000000000001", "0x8000000000000001"] 723 - values: ["0xffefffffffffffff", "0x7fefffffffffffff", "3.1415926535", "3.1415926535e89", "0xffefffffffffffff", "0x7fefffffffffffff", "3.1415926535", "3.1415926535e89"] 724 - values: ["100e100", "200e200", "-50e-50", "123e123", "100e100", "200e200", "-50e-50", "123e123"] 725 726 - file-name: arg_2_f64_reg 727 isa: 728 instructions: 729 - sig: call method_id, v1:in:top, v2:in:top, v3:in:top, v4:in:top 730 acc: out:top 731 format: [op_v1_4_v2_4_v3_4_v4_4_id_16] 732 description: Check correctness of passed arguments. Load parameter to register. Check f64 type of arguments. 733 tags: ['tsan'] 734 header-template: [] 735 code-template: | 736 .function i32 f1(f64 a0, f64 a1, f64 a2, f64 a3) { 737 mov.64 v1, a0 738 fldai.64 %s 739 fcmpg.64 v1 740 jeqz f1_check1 741 # 1st arg does not match, exit 742 ldai 1 743 return 744 f1_check1: 745 mov.64 v1, a1 746 fldai.64 %s 747 fcmpg.64 v1 748 jeqz f1_check2 749 # 1st arg does not match, exit 750 ldai 1 751 return 752 f1_check2: 753 mov.64 v1, a2 754 fldai.64 %s 755 fcmpg.64 v1 756 jeqz f1_check3 757 # 1st arg does not match, exit 758 ldai 1 759 return 760 f1_check3: 761 mov.64 v1, a3 762 fldai.64 %s 763 fcmpg.64 v1 764 return 765 } 766 .function i32 main() { 767 fmovi.64 v0, %s 768 fmovi.64 v1, %s 769 fmovi.64 v2, %s 770 fmovi.64 v3, %s 771 call f1, v0, v1, v2, v3 772 check-type: no-check 773 cases: 774 - values: ["0", "0", "0", "0", "0", "0", "0", "0"] 775 - values: ["1.2", "1.1", "1.3", "1.4", "1.2", "1.1", "1.3", "1.4"] 776 - values: ["0x7ff0000000000000", "0xfff0000000000000", "0x0000000000000001", "0x8000000000000001", "0x7ff0000000000000", "0xfff0000000000000", "0x0000000000000001", "0x8000000000000001"] 777 - values: ["0xffefffffffffffff", "0x7fefffffffffffff", "3.1415926535", "3.1415926535e89", "0xffefffffffffffff", "0x7fefffffffffffff", "3.1415926535", "3.1415926535e89"] 778 - values: ["100e100", "200e200", "-50e-50", "123e123", "100e100", "200e200", "-50e-50", "123e123"] 779 780 - file-name: arg_1_i64_acc 781 isa: 782 instructions: 783 - sig: call method_id, v1:in:top, v2:in:top, v3:in:top, v4:in:top 784 acc: out:top 785 format: [op_v1_4_v2_4_v3_4_v4_4_id_16] 786 description: Check correctness of passed arguments. Load parameter to accumulator. Check i64 type of arguments. 787 header-template: [] 788 code-template: | 789 .function i32 f1(i64 a0) { 790 lda.64 a0 791 movi.64 v1, %s 792 cmp.64 v1 793 return 794 } 795 .function i32 main() { 796 movi.64 v0, %s 797 call f1, v0 798 799 check-type: no-check 800 cases: 801 - values: ["0", "0"] 802 - values: ["1", "1"] 803 - values: ["0x1234567890ABCDEF", "0x1234567890ABCDEF"] 804 - values: ["0x7FFFFFFFFFFFFFFF", "0x7FFFFFFFFFFFFFFF"] 805 - values: ["0x8000000000000000", "0x8000000000000000"] 806 - values: ["0xFEDCBA0987654321", "0xFEDCBA0987654321"] 807 - values: ["0xFFFFFFFFFFFFFFFF", "0xFFFFFFFFFFFFFFFF"] 808 809 - file-name: arg_1_i64_reg 810 isa: 811 instructions: 812 - sig: call method_id, v1:in:top, v2:in:top, v3:in:top, v4:in:top 813 acc: out:top 814 format: [op_v1_4_v2_4_v3_4_v4_4_id_16] 815 description: Check correctness of passed arguments. Load parameter to accumulator. Check i64 type of arguments. 816 header-template: [] 817 code-template: | 818 .function i32 f1(i64 a0) { 819 mov.64 v1, a0 820 ldai.64 %s 821 cmp.64 v1 822 return 823 } 824 .function i32 main() { 825 movi.64 v0, %s 826 call f1, v0 827 828 check-type: no-check 829 cases: 830 - values: ["0", "0"] 831 - values: ["1", "1"] 832 - values: ["0x1234567890ABCDEF", "0x1234567890ABCDEF"] 833 - values: ["0x7FFFFFFFFFFFFFFF", "0x7FFFFFFFFFFFFFFF"] 834 - values: ["0x8000000000000000", "0x8000000000000000"] 835 - values: ["0xFEDCBA0987654321", "0xFEDCBA0987654321"] 836 - values: ["0xFFFFFFFFFFFFFFFF", "0xFFFFFFFFFFFFFFFF"] 837 838 - file-name: arg_2_i64_acc 839 isa: 840 instructions: 841 - sig: call method_id, v1:in:top, v2:in:top, v3:in:top, v4:in:top 842 acc: out:top 843 format: [op_v1_4_v2_4_v3_4_v4_4_id_16] 844 description: Check correctness of passed arguments. Load parameter to accumulator. 845 header-template: [] 846 code-template: | 847 .function i32 f1(i64 a0, i64 a1, i64 a2, i64 a3) { 848 lda.64 a0 849 movi.64 v1, %s 850 cmp.64 v1 851 jeqz f1_check1 852 # 1st arg does not match, exit 853 ldai 1 854 return 855 f1_check1: 856 lda.64 a1 857 movi.64 v1, %s 858 cmp.64 v1 859 jeqz f1_check2 860 # 1st arg does not match, exit 861 ldai 1 862 return 863 f1_check2: 864 lda.64 a2 865 movi.64 v1, %s 866 cmp.64 v1 867 jeqz f1_check3 868 # 1st arg does not match, exit 869 ldai 1 870 return 871 f1_check3: 872 lda.64 a3 873 movi.64 v1, %s 874 cmp.64 v1 875 return 876 } 877 .function i32 main() { 878 movi.64 v0, %s 879 movi.64 v1, %s 880 movi.64 v2, %s 881 movi.64 v3, %s 882 call f1, v0, v1, v2, v3 883 884 check-type: no-check 885 cases: 886 - values: ["0", "0", "0", "0", "0", "0", "0", "0"] 887 - values: ["0", "1", "0", "1", "0", "1", "0", "1"] 888 - values: ["1", "0", "1", "0", "1", "0", "1", "0"] 889 - values: ["0x1234567890ABCDEF", "0x234567890ABCDEF1", "0x34567890ABCDEF12", "0x4567890ABCDEF123", "0x1234567890ABCDEF", "0x234567890ABCDEF1", "0x34567890ABCDEF12", "0x4567890ABCDEF123"] 890 - values: ["0x7FFFFFFFFFFFFFFF", "0", "0x7FFFFFFFFFFFFFFF", "0", "0x7FFFFFFFFFFFFFFF", "0", "0x7FFFFFFFFFFFFFFF", "0"] 891 - values: ["0x8000000000000000", "0x8000000000000000", "0x8000000000000000", "0x8000000000000000", "0x8000000000000000", "0x8000000000000000", "0x8000000000000000", "0x8000000000000000"] 892 - values: ["0xFEDCBA0987654321", "0xEDCBA0987654321F", "0xDCBA0987654321FE", "0xCBA0987654321FED", "0xFEDCBA0987654321", "0xEDCBA0987654321F", "0xDCBA0987654321FE", "0xCBA0987654321FED"] 893 894 - file-name: arg_2_i64_reg 895 isa: 896 instructions: 897 - sig: call method_id, v1:in:top, v2:in:top, v3:in:top, v4:in:top 898 acc: out:top 899 format: [op_v1_4_v2_4_v3_4_v4_4_id_16] 900 description: Check correctness of passed arguments. Load parameter to register. Check i64 type of arguments. 901 header-template: [] 902 code-template: | 903 .function i32 f1(i64 a0, i64 a1, i64 a2, i64 a3) { 904 mov.64 v1, a0 905 ldai.64 %s 906 cmp.64 v1 907 jeqz f1_check1 908 # 1st arg does not match, exit 909 ldai 1 910 return 911 f1_check1: 912 mov.64 v1, a1 913 ldai.64 %s 914 cmp.64 v1 915 jeqz f1_check2 916 # 1st arg does not match, exit 917 ldai 1 918 return 919 f1_check2: 920 mov.64 v1, a2 921 ldai.64 %s 922 cmp.64 v1 923 jeqz f1_check3 924 # 1st arg does not match, exit 925 ldai 1 926 return 927 f1_check3: 928 929 mov.64 v1, a3 930 ldai.64 %s 931 cmp.64 v1 932 return 933 } 934 .function i32 main() { 935 movi.64 v0, %s 936 movi.64 v1, %s 937 movi.64 v2, %s 938 movi.64 v3, %s 939 call f1, v0, v1, v2, v3 940 941 check-type: no-check 942 cases: 943 - values: ["0", "0", "0", "0", "0", "0", "0", "0"] 944 - values: ["0", "1", "0", "1", "0", "1", "0", "1"] 945 - values: ["1", "0", "1", "0", "1", "0", "1", "0"] 946 - values: ["0x1234567890ABCDEF", "0x234567890ABCDEF1", "0x34567890ABCDEF12", "0x4567890ABCDEF123", "0x1234567890ABCDEF", "0x234567890ABCDEF1", "0x34567890ABCDEF12", "0x4567890ABCDEF123"] 947 - values: ["0x7FFFFFFFFFFFFFFF", "0", "0x7FFFFFFFFFFFFFFF", "0", "0x7FFFFFFFFFFFFFFF", "0", "0x7FFFFFFFFFFFFFFF", "0"] 948 - values: ["0x8000000000000000", "0x8000000000000000", "0x8000000000000000", "0x8000000000000000", "0x8000000000000000", "0x8000000000000000", "0x8000000000000000", "0x8000000000000000"] 949 - values: ["0xFEDCBA0987654321", "0xEDCBA0987654321F", "0xDCBA0987654321FE", "0xCBA0987654321FED", "0xFEDCBA0987654321", "0xEDCBA0987654321F", "0xDCBA0987654321FE", "0xCBA0987654321FED"] 950 951 - file-name: arg_1_obj_acc 952 isa: 953 instructions: 954 - sig: call method_id, v1:in:top, v2:in:top, v3:in:top, v4:in:top 955 acc: out:top 956 format: [op_v1_4_v2_4_v3_4_v4_4_id_16] 957 description: Check correctness of passed arguments. Load parameter to accumulator. Check object type of arguments. 958 header-template: [obj_ctor] 959 code-template: | 960 .function Obj fnc(Obj a0) { 961 lda.obj a0 962 return.obj 963 } 964 965 .function i32 main() { 966 %s 967 sta.obj v0 968 ldai 0 # acc is i32 969 call fnc, v0 # acc contains returned Obj 970 jne.obj v0, return_ne_num 971 ldai 0 972 return 973 return_ne_num: 974 ldai 1 975 return 976 977 check-type: no-check 978 cases: 979 - values: 980 - "lda.null" 981 - values: 982 - "initobj Obj.ctor" 983 984 - file-name: arg_2_obj_acc 985 isa: 986 instructions: 987 - sig: call method_id, v1:in:top, v2:in:top, v3:in:top, v4:in:top 988 acc: out:top 989 format: [op_v1_4_v2_4_v3_4_v4_4_id_16] 990 description: Check correctness of passed arguments. Load parameter to accumulator. Check object type. 991 tags: ['tsan'] 992 header-template: [obj_ctor] 993 code-template: | 994 .record ObjTuple { 995 Obj o0 996 Obj o1 997 Obj o2 998 Obj o3 999 } 1000 1001 .function void ObjTuple.ctor(ObjTuple a0, Obj a1, Obj a2, Obj a3, Obj a4) <ctor> { 1002 lda.obj a1 1003 stobj.obj a0, ObjTuple.o0 1004 lda.obj a2 1005 stobj.obj a0, ObjTuple.o1 1006 lda.obj a3 1007 stobj.obj a0, ObjTuple.o2 1008 lda.obj a4 1009 stobj.obj a0, ObjTuple.o3 1010 return.void 1011 } 1012 1013 .function ObjTuple getObjTuple(Obj a0, Obj a1, Obj a2, Obj a3) { 1014 mov.obj v0, a0 1015 mov.obj v1, a1 1016 mov.obj v2, a2 1017 mov.obj v3, a3 1018 initobj ObjTuple.ctor, v0, v1, v2, v3 1019 return.obj 1020 } 1021 1022 .function i32 main() { 1023 %s 1024 call getObjTuple, v0, v1, v2, v3 1025 sta.obj v4 1026 1027 # check ObjTuple.o0 contains correct value (v0) 1028 ldobj.obj v4, ObjTuple.o0 1029 jeq.obj v0, tuple_2_check_1 1030 ldai 1 1031 return 1032 tuple_2_check_1: 1033 # check ObjTuple.o1 contains correct value (v1) 1034 ldobj.obj v4, ObjTuple.o1 1035 jeq.obj v1, tuple_2_check_2 1036 ldai 1 1037 return 1038 tuple_2_check_2: 1039 # check ObjTuple.o2 contains correct value (v2) 1040 ldobj.obj v4, ObjTuple.o2 1041 jeq.obj v2, tuple_2_check_3 1042 ldai 1 1043 return 1044 tuple_2_check_3: 1045 # check ObjTuple.o3 contains correct value (v3) 1046 ldobj.obj v4, ObjTuple.o3 1047 jne.obj v3, return_ne_num 1048 ldai 0 1049 return 1050 return_ne_num: 1051 ldai 1 1052 return 1053 1054 check-type: no-check 1055 cases: 1056 - values: 1057 - | 1058 # 1059 mov.null v0 1060 mov.null v1 1061 mov.null v2 1062 mov.null v3 1063 - values: 1064 - | 1065 # 1066 initobj.short Obj.ctor 1067 sta.obj v0 1068 initobj.short Obj.ctor 1069 sta.obj v1 1070 initobj.short Obj.ctor 1071 sta.obj v2 1072 initobj.short Obj.ctor 1073 sta.obj v3 1074 - values: 1075 - | 1076 # 1077 mov.null v0 1078 initobj.short Obj.ctor 1079 sta.obj v1 1080 initobj.short Obj.ctor 1081 sta.obj v2 1082 initobj.short Obj.ctor 1083 sta.obj v3 1084 - values: 1085 - | 1086 # 1087 initobj.short Obj.ctor 1088 sta.obj v0 1089 mov.null v1 1090 initobj.short Obj.ctor 1091 sta.obj v2 1092 initobj.short Obj.ctor 1093 sta.obj v3 1094 - values: 1095 - | 1096 # 1097 initobj.short Obj.ctor 1098 sta.obj v0 1099 initobj.short Obj.ctor 1100 sta.obj v1 1101 mov.null v2 1102 initobj.short Obj.ctor 1103 sta.obj v3 1104 - values: 1105 - | 1106 # 1107 initobj.short Obj.ctor 1108 sta.obj v0 1109 initobj.short Obj.ctor 1110 sta.obj v1 1111 initobj.short Obj.ctor 1112 sta.obj v2 1113 mov.null v3 1114 1115 - file-name: arg_2_str_acc 1116 isa: 1117 instructions: 1118 - sig: call method_id, v1:in:top, v2:in:top, v3:in:top, v4:in:top 1119 acc: out:top 1120 format: [op_v1_4_v2_4_v3_4_v4_4_id_16] 1121 description: Check correctness of passed arguments. Load parameter to accumulator. Check String type. 1122 header-template: [panda_string] 1123 code-template: | 1124 .record ObjTuple { 1125 panda.String o1 1126 panda.String o2 1127 } 1128 1129 .function void ObjTuple.ctor(ObjTuple a0, panda.String a1, panda.String a2) <ctor> { 1130 lda.obj a1 1131 stobj.obj a0, ObjTuple.o1 1132 lda.obj a2 1133 stobj.obj a0, ObjTuple.o2 1134 return.void 1135 } 1136 1137 .function ObjTuple getObjTuple(panda.String a0, panda.String a1) { 1138 mov.obj v0, a0 1139 mov.obj v1, a1 1140 initobj.short ObjTuple.ctor, v0, v1 1141 return.obj 1142 } 1143 1144 .function i32 main() { 1145 %s 1146 call getObjTuple, v0, v1 1147 sta.obj v2 1148 1149 # check ObjTuple.o1 contains correct value (v0) 1150 ldobj.obj v2, ObjTuple.o1 1151 jeq.obj v0, tuple_2_check 1152 ldai 1 1153 return 1154 tuple_2_check: 1155 # check ObjTuple.o2 contains correct value (v1) 1156 ldobj.obj v2, ObjTuple.o2 1157 jeq.obj v1, tuple_2_check_passed 1158 ldai 1 1159 return 1160 tuple_2_check_passed: 1161 ldai 0 1162 1163 check-type: no-check 1164 cases: 1165 - values: 1166 - | 1167 # 1168 mov.null v0 1169 mov.null v1 1170 - values: 1171 - | 1172 # 1173 lda.str "some string 1" 1174 sta.obj v0 1175 lda.str "some string 2" 1176 sta.obj v1 1177 - values: 1178 - | 1179 # 1180 mov.null v0 1181 lda.str "some string 2" 1182 sta.obj v1 1183 - values: 1184 - | 1185 # 1186 lda.str "some string 1" 1187 sta.obj v0 1188 mov.null v1 1189 1190 1191 - file-name: method_id_not_static_p 1192 tags: ['verifier'] 1193 bugid: ['3247'] 1194 runner-options: ['verifier-failure', 'verifier-debug-config'] 1195 isa: 1196 instructions: 1197 - sig: call method_id, v1:in:top, v2:in:top, v3:in:top, v4:in:top 1198 acc: out:top 1199 format: [op_v1_4_v2_4_v3_4_v4_4_id_16] 1200 verification: 1201 - method_id_static 1202 - method_id_non_abstract 1203 description: Method_id must resolve to a static method in Panda Assembly context. Not static methods should be rejected by verifier. 1204 header-template: [] 1205 code-template: | 1206 .record A {} 1207 1208 .function void A.ctor(A a0) <ctor> { 1209 return.void 1210 } 1211 1212 .function i32 A.foo(A a0%s) *s 1213 1214 .function i32 main() { 1215 initobj A.ctor 1216 sta.obj v0 1217 %s 1218 call A.foo, v0%s 1219 check-type: exit-positive 1220 cases: 1221 - values: 1222 - | 1223 { 1224 ldai 0 1225 return 1226 } 1227 ignore: true 1228 - values: ['<noimpl>'] 1229 ignore: true 1230 - values: 1231 - | 1232 <static> { 1233 ldai 0 1234 return 1235 } 1236 runner-options: ['verifier-only', 'verifier-debug-config'] 1237 template-cases: 1238 - values: ['', '##-', ''] 1239 - values: [', A a1', 'mov.obj v1, v0', ', v1'] 1240 1241 - file-name: amount_of_args 1242 isa: 1243 instructions: 1244 - sig: call method_id, v1:in:top, v2:in:top, v3:in:top, v4:in:top 1245 acc: out:top 1246 format: [op_v1_4_v2_4_v3_4_v4_4_id_16] 1247 header-template: [] 1248 description: Compiler should check amount of `call.short` argument and function parameters. 1249 code-template: | 1250 .function void f1(i32 a0%s) { 1251 return.void 1252 } 1253 .function i32 main() { 1254 call f1%s 1255 check-type: none 1256 runner-options: [compile-failure] 1257 cases: 1258 - values: ['', ''] 1259 - values: [', i32 a1', ''] 1260 - values: [', i32 a1', ', v0'] 1261 - values: [', i32 a1, i32 a2', ''] 1262 - values: [', i32 a1, i32 a2', ', v0'] 1263 - values: [', i32 a1, i32 a2', ', v0, v0'] 1264 - values: [', i32 a1, i32 a2, i32 a3', ''] 1265 - values: [', i32 a1, i32 a2, i32 a3', ', v0'] 1266 - values: [', i32 a1, i32 a2, i32 a3', ', v0, v0'] 1267 - values: [', i32 a1, i32 a2, i32 a3', ', v0, v0, v0'] 1268 - values: [', i32 a1, i32 a2, i32 a3, i32 a4', ''] 1269 - values: [', i32 a1, i32 a2, i32 a3, i32 a4', ', v0'] 1270 - values: [', i32 a1, i32 a2, i32 a3, i32 a4', ', v0, v0, v0, v0'] 1271 1272 - file-name: unused_regs 1273 isa: 1274 description: > 1275 Non-range instructions can be used to pass up to 4 arguments (unused register slot values will 1276 be discarded and corresponding registers will not be passed to the callee). 1277 header-template: [] 1278 description: Verifier should ignore unused register slots. 1279 code-template: | 1280 .function i32 foo(%s) { 1281 ldai 0 1282 return 1283 } 1284 .function i32 main() { 1285 %s 1286 call foo%s 1287 check-type: no-check 1288 cases: 1289 - values: 1290 - "" 1291 - "" 1292 - ", v5, v4, v3, v2" 1293 - values: 1294 - "i32 a0" 1295 - | 1296 # 1297 movi v5, 123 1298 - ", v5, v4, v3" 1299 - values: 1300 - "i64 a0, i32 a1" 1301 - | 1302 # 1303 movi v2, 1 1304 movi.64 v6, 123456789 1305 - ", v6, v2, v0" 1306 - values: 1307 - "f64 a0, i64 a1, i32 a2" 1308 - | 1309 # 1310 movi v7, 1 1311 movi.64 v0, 123456789 1312 fmovi.64 v8, 1.1 1313 - ", v8, v0, v7, v9" 1314