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: "mod2" 17 isa: 18 title: Two address integer division and modulo on accumulator 19 description: > 20 Perform integer division or modulo on accumulator and register and store result into accumulator 21 exceptions: 22 - x_arith 23 commands: 24 - file-name: "op_vs_8_zero" 25 isa: 26 instructions: 27 - sig: mod2 v:in:i32 28 acc: inout:i32 29 format: [op_v_8] 30 tags: ['irtoc_ignore'] 31 code-template: | 32 # 33 ldai 0 34 movi v0, %s 35 mod2 v0 36 movi v0, 0 37 jne v0, set_failure 38 ldai 0 39 jmp fall_through 40 set_failure: 41 ldai 1 42 fall_through: 43 description: Check mod2 with zero and various values. 44 cases: 45 - values: 46 - "0" 47 runner-options: ['run-failure'] 48 description: Division by zero causes to exception. 49 - values: 50 - "1" 51 - values: 52 - "-1" 53 - values: 54 - "0x7FFFFFFF" 55 - values: 56 - "0x80000000" 57 - values: 58 - "-0x7FFFFFFF" 59 - values: 60 - "-0x80000000" 61 - values: 62 - "0xFFFFFFFF" 63 - values: 64 - "-0xFFFFFFFF" 65 66 - file-name: "op_vs_8_pone" 67 isa: 68 instructions: 69 - sig: mod2 v:in:i32 70 acc: inout:i32 71 format: [op_v_8] 72 tags: ['irtoc_ignore'] 73 code-template: | 74 # 75 ldai 1 76 movi v0, %s 77 mod2 v0 78 movi v0, %s 79 jne v0, set_failure 80 ldai 0 81 jmp fall_through 82 set_failure: 83 ldai 1 84 fall_through: 85 description: Check mod2 with +1 and various values. 86 cases: 87 - values: 88 - "0" 89 - "0x0" 90 runner-options: ['run-failure'] 91 description: Division by zero causes to exception. 92 - values: 93 - "1" 94 - "0" 95 - values: 96 - "-1" 97 - "0" 98 - "0x7FFFFFFF" 99 - "1" 100 - values: 101 - "0x80000000" 102 - "1" 103 - values: 104 - "-0x7FFFFFFF" 105 - "1" 106 - values: 107 - "-0x80000000" 108 - "1" 109 - values: 110 - "0xFFFFFFFF" 111 - "0" 112 - values: 113 - "-0xFFFFFFFF" 114 - "0" 115 116 - file-name: "op_vs_8_none" 117 isa: 118 instructions: 119 - sig: mod2 v:in:i32 120 acc: inout:i32 121 format: [op_v_8] 122 tags: ['irtoc_ignore'] 123 code-template: | 124 # 125 ldai -1 126 movi v0, %s 127 mod2 v0 128 movi v0, %s 129 jne v0, set_failure 130 ldai 0 131 jmp fall_through 132 set_failure: 133 ldai 1 134 fall_through: 135 description: Check mod2 with -1 and various values. 136 cases: 137 - values: 138 - "0" 139 - "0" 140 runner-options: ['run-failure'] 141 description: Division by zero causes to exception. 142 - values: 143 - "1" 144 - "0" 145 - values: 146 - "-1" 147 - "0" 148 - values: 149 - "0x7FFFFFFF" 150 - "-1" 151 - values: 152 - "0x80000000" 153 - "-1" 154 - values: 155 - "-0x7FFFFFFF" 156 - "0xFFFFFFFF" 157 - values: 158 - "-0x80000000" 159 - "-1" 160 - values: 161 - "0xFFFFFFFF" 162 - "0" 163 - values: 164 - "-0xFFFFFFFF" 165 - "0" 166 167 - file-name: "op_vs_8_pmax" 168 isa: 169 instructions: 170 - sig: mod2 v:in:i32 171 acc: inout:i32 172 format: [op_v_8] 173 tags: ['irtoc_ignore'] 174 code-template: | 175 # 176 ldai 0x7FFFFFFF 177 movi v0, %s 178 mod2 v0 179 movi v0, %s 180 jne v0, set_failure 181 ldai 0 182 jmp fall_through 183 set_failure: 184 ldai 1 185 fall_through: 186 description: Check mod2 with +max and various values. 187 cases: 188 - values: 189 - "0" 190 - "0" 191 runner-options: ['run-failure'] 192 description: Division by zero causes to exception. 193 - values: 194 - "1" 195 - "0" 196 - values: 197 - "-1" 198 - "0" 199 - values: 200 - "0x7FFFFFFF" 201 - "0" 202 - values: 203 - "0x80000000" 204 - "0x7FFFFFFF" 205 - values: 206 - "-0x7FFFFFFF" 207 - "0" 208 - values: 209 - "-0x80000000" 210 - "0x7FFFFFFF" 211 - values: 212 - "0xFFFFFFFF" 213 - "0" 214 - values: 215 - "-0xFFFFFFFF" 216 - "0" 217 218 - file-name: "op_vs_8_nmax" 219 isa: 220 instructions: 221 - sig: mod2 v:in:i32 222 acc: inout:i32 223 format: [op_v_8] 224 tags: ['irtoc_ignore'] 225 code-template: | 226 # 227 ldai -0x80000000 228 movi v0, %s 229 mod2 v0 230 movi v0, %s 231 jne v0, set_failure 232 ldai 0 233 jmp fall_through 234 set_failure: 235 ldai 1 236 fall_through: 237 description: Check mod2 with -max and various values. 238 cases: 239 - values: 240 - "0" 241 - "0" 242 runner-options: ['run-failure'] 243 description: Division by zero causes to exception. 244 - values: 245 - "1" 246 - "0" 247 - values: 248 - "-1" 249 - "0" 250 - values: 251 - "0x7FFFFFFF" 252 - "0xFFFFFFFF" 253 - values: 254 - "0x80000000" 255 - "0" 256 - values: 257 - "-0x7FFFFFFF" 258 - "-1" 259 - values: 260 - "-0x80000000" 261 - "0" 262 - values: 263 - "0xFFFFFFFF" 264 - "0" 265 - values: 266 - "-0xFFFFFFFF" 267 - "0" 268 269 - file-name: "vals" 270 isa: 271 instructions: 272 - sig: mod2 v:in:i32 273 acc: inout:i32 274 format: [op_v_8] 275 code-template: | 276 # 277 ldai %s 278 movi v0, %s 279 mod2 v0 280 movi v0, %s 281 jne v0, set_failure 282 ldai 0 283 jmp fall_through 284 set_failure: 285 ldai 1 286 fall_through: 287 description: Check mod2 with various values. 288 tags: ['tsan'] 289 cases: 290 - values: 291 - "0x3E3DF59E" 292 - "0x322AA" 293 - "0x2F584" 294 - values: 295 - "0xF646A65A" 296 - "0x1BD55" 297 - "0xFFFFFC7D" 298 - values: 299 - "0x87401053" 300 - "0xEBDD6" 301 - "0xFFF25873" 302 - values: 303 - "0x85C0E3B6" 304 - "0xAE2F3" 305 - "0xFFF8BFC4" 306 - values: 307 - "0x5FE777B5" 308 - "0x21AF6" 309 - "0x16037" 310 - values: 311 - "0x4B743F04" 312 - "0x6F4BC" 313 - "0x66864" 314 - values: 315 - "0x3BCA351F" 316 - "0x6EA69" 317 - "0x1D772" 318 - values: 319 - "0xFE56E34" 320 - "0xCF88E" 321 - "0x98896" 322 - values: 323 - "0x1F1BE487" 324 - "0x875CE" 325 - "0x2DE51" 326 - values: 327 - "0xC43C42DC" 328 - "0x3992C" 329 - "0xFFFCC080" 330 - values: ["0x80000000", "-1", "0"] 331 - values: ["-2147483648", "-1", "0"] 332 333 - file-name: "op_v_8_exception" 334 isa: 335 instructions: 336 - sig: mod2 v:in:i32 337 acc: inout:i32 338 format: [op_v_8] 339 tags: ['irtoc_ignore'] 340 header-template: [ArithmeticException, main] 341 code-template: | 342 # 343 ldai %s 344 movi v0, 0 345 begin: 346 mod2 v0 347 end: 348 ldai 1 # Should not reach this line 349 return 350 351 catch_AE: 352 ldai 0 # Expected panda.ArithmeticException 353 return 354 355 catch_all: 356 ldai 1 # Unexpected exception, test failed 357 return 358 359 .catch panda.ArithmeticException, begin, end, catch_AE 360 .catchall begin, end, catch_all 361 check-type: none 362 description: Check `mod2` throws ArithmeticException when divides by zero. 363 cases: 364 - values: ["0"] 365 - values: ["1"] 366 - values: ["0x7FFF"] 367 - values: ["0xFFFF"] 368 - values: ["0x7FFFFFFF"] 369 - values: ["0x80000000"] 370 - values: ["0xFFFFFFFF"] 371 - values: ["-1"] 372 - values: ["-0x7FFF"] 373 - values: ["-0xFFFF"] 374 - values: ["-0x7FFFFFFF"] 375 - values: ["-0x80000000"] 376 - values: ["-0xFFFFFFFF"] 377 378 - file-name: "vals_mod32_1" 379 bugid: ['1324', '2072'] 380 tags: ['verifier'] 381 runner-options: ['verifier-failure', 'verifier-config'] 382 isa: 383 instructions: 384 - sig: mod2 v:in:i32 385 acc: inout:i32 386 format: [op_v_8] 387 code-template: | 388 # 389 ldai %s 390 movi v0, %s 391 mod2 v0 392 movi.64 v0, %s 393 cmp.64 v0 394 description: Check mod2 with incorrect accumulator and register type. 395 cases: 396 - values: 397 - "0xFFFFFFFF" 398 - "2" 399 - "0xFFFFFFFFFFFFFFFF" 400 - values: 401 - "-0x7FFFFFFF" 402 - "-0x7FFFFFFE" 403 - "0xFFFFFFFFFFFFFFFF" 404 - values: 405 - "0x80000001" 406 - "2" 407 - "0xFFFFFFFFFFFFFFFF" 408 409 - file-name: "vals_mod32_2" 410 bugid: ['1324'] 411 tags: ['verifier'] 412 runner-options: ['verifier-failure', 'verifier-config'] 413 isa: 414 instructions: 415 - sig: mod2 v:in:i32 416 acc: inout:i32 417 format: [op_v_8] 418 code-template: | 419 # 420 ldai.64 %s 421 movi.64 v0, %s 422 mod2 v0 423 movi.64 v0, %s 424 cmp.64 v0 425 description: Check mod2 with incorrect accumulator and register type. 426 cases: 427 - values: 428 - "0x180000001" 429 - "0xF00000002" 430 - "0xFFFFFFFFFFFFFFFF" 431 - values: 432 - "0x777777777FFFFFFF" 433 - "0x11111111FFFFFFFE" 434 - "1" 435 - values: 436 - "0xFEDCBA8780000001" 437 - "0x1234567800000002" 438 - "0xFFFFFFFFFFFFFFFF" 439 440 - file-name: "regs" 441 isa: 442 instructions: 443 - sig: mod2 v:in:i32 444 acc: inout:i32 445 format: [op_v_8] 446 runner-options: ['compile-only'] 447 code-template: | 448 # 449 mod2 %s 450 check-type: none 451 description: Check mod2 with various register numbers. 452 cases: 453 - values: 454 - "v255" 455 - values: 456 - "v256" 457 runner-options: ['compile-failure'] 458 459 - file-name: "type" 460 tags: ["verifier"] 461 isa: 462 verification: 463 - acc_type 464 - v1_type 465 runner-options: ['verifier-failure', 'verifier-config'] 466 header-template: [] 467 code-template: | 468 .record T {} 469 .function i32 main() { 470 %s 471 *s 472 mod2 v0 473 check-type: exit-positive 474 description: Check 'mod2' with incorrect accumulator and/or register types. 475 cases: 476 - values: 477 - ldai 0 478 id: acc_ok 479 - values: 480 - ldai.64 0 481 - values: 482 - fldai 0 483 - values: 484 - fldai.64 0 485 - values: 486 - lda.null 487 - values: 488 - | 489 # 490 movi v1, 0 491 newarr v1, v1, i32[] 492 lda.obj v1 493 - values: 494 - lda.str "0" 495 - values: 496 - lda.type T 497 - values: 498 - | 499 # 500 newobj v1, T 501 lda.obj v1 502 template-cases: 503 - values: 504 - movi v0, 1 505 exclude: [acc_ok] 506 - values: 507 - movi.64 v0, 1 508 - values: 509 - fmovi v0, 1 510 - values: 511 - fmovi.64 v0, 1 512 - values: 513 - mov.null v0 514 - values: 515 - | 516 # 517 movi v0, 0 518 newarr v0, v0, i32[] 519 - values: 520 - | 521 # 522 lda.str "0" 523 sta.obj v0 524 - values: 525 - | 526 # 527 lda.type T 528 sta.obj v0 529 - values: 530 - newobj v0, T 531 532 533 - file-name: uninitialized_regs 534 isa: 535 instructions: 536 - sig: mod2 v:in:i32 537 acc: inout:i32 538 format: [op_v_8] 539 description: Check 'mod2' with uninitialized registers. 540 tags: ['verifier'] 541 runner-options: ['verifier-failure', 'verifier-config'] 542 code-template: | 543 # 544 %s 545 *s 546 mod2 *s 547 check-type: exit-positive 548 template-cases: 549 - values: 550 - '' 551 - values: 552 - ldai 0 553 exclude: [init] 554 cases: 555 - values: 556 - '' 557 - v0 558 - values: 559 - movi v1, 0 560 - v1 561 id: init 562 - values: 563 - '' 564 - v8 565 - values: 566 - '' 567 - v15 568 - values: 569 - movi v15, 0 570 - v15 571 id: init 572