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: "div2" 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: div2 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 div2 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 div2 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: div2 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 div2 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 div2 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 - "0x1" 95 - values: 96 - "-1" 97 - "0xFFFFFFFF" 98 - values: 99 - "0x7FFFFFFF" 100 - "0x0" 101 - values: 102 - "0x80000000" 103 - "0x0" 104 - values: 105 - "-0x7FFFFFFF" 106 - "0x0" 107 - values: 108 - "-0x80000000" 109 - "0x0" 110 - values: 111 - "0xFFFFFFFF" 112 - "0xFFFFFFFF" 113 - values: 114 - "-0xFFFFFFFF" 115 - "0x1" 116 117 - file-name: "op_vs_8_none" 118 isa: 119 instructions: 120 - sig: div2 v:in:i32 121 acc: inout:i32 122 format: [op_v_8] 123 tags: ['irtoc_ignore'] 124 code-template: | 125 # 126 ldai -1 127 movi v0, %s 128 div2 v0 129 movi v0, %s 130 jne v0, set_failure 131 ldai 0 132 jmp fall_through 133 set_failure: 134 ldai 1 135 fall_through: 136 description: Check div2 with -1 and various values. 137 cases: 138 - values: 139 - "0" 140 - "0x0" 141 runner-options: ['run-failure'] 142 description: Division by zero causes to exception. 143 - values: 144 - "1" 145 - "0xFFFFFFFF" 146 - values: 147 - "-1" 148 - "0x1" 149 - values: 150 - "0x7FFFFFFF" 151 - "0x0" 152 - values: 153 - "0x80000000" 154 - "0x0" 155 - values: 156 - "-0x7FFFFFFF" 157 - "0x0" 158 - values: 159 - "-0x80000000" 160 - "0x0" 161 - values: 162 - "0xFFFFFFFF" 163 - "0x1" 164 - values: 165 - "-0xFFFFFFFF" 166 - "0xFFFFFFFF" 167 168 - file-name: "op_vs_8_pmax" 169 isa: 170 instructions: 171 - sig: div2 v:in:i32 172 acc: inout:i32 173 format: [op_v_8] 174 tags: ['irtoc_ignore'] 175 code-template: | 176 # 177 ldai 0x7FFFFFFF 178 movi v0, %s 179 div2 v0 180 movi v0, %s 181 jne v0, set_failure 182 ldai 0 183 jmp fall_through 184 set_failure: 185 ldai 1 186 fall_through: 187 description: Check div2 with +max and various values. 188 cases: 189 - values: 190 - "0" 191 - "0x0" 192 runner-options: ['run-failure'] 193 description: Division by zero causes to exception. 194 - values: 195 - "1" 196 - "0x7FFFFFFF" 197 - values: 198 - "-1" 199 - "0x80000001" 200 - values: 201 - "0x7FFFFFFF" 202 - "0x1" 203 - values: 204 - "0x80000000" 205 - "0x0" 206 - values: 207 - "-0x7FFFFFFF" 208 - "0xFFFFFFFF" 209 - values: 210 - "-0x80000000" 211 - "0x0" 212 - values: 213 - "0xFFFFFFFF" 214 - "0x80000001" 215 - values: 216 - "-0xFFFFFFFF" 217 - "0x7FFFFFFF" 218 219 - file-name: "op_vs_8_nmax" 220 isa: 221 instructions: 222 - sig: div2 v:in:i32 223 acc: inout:i32 224 format: [op_v_8] 225 tags: ['irtoc_ignore'] 226 code-template: | 227 # 228 ldai -0x80000000 229 movi v0, %s 230 div2 v0 231 movi v0, %s 232 jne v0, set_failure 233 ldai 0 234 jmp fall_through 235 set_failure: 236 ldai 1 237 fall_through: 238 description: Check div2 with -max and various values. 239 cases: 240 - values: 241 - "0" 242 - "0x0" 243 runner-options: ['run-failure'] 244 description: Division by zero causes to exception. 245 - values: 246 - "1" 247 - "0x80000000" 248 - values: 249 - "-1" 250 - "0x80000000" 251 - values: 252 - "0x7FFFFFFF" 253 - "0xFFFFFFFF" 254 - values: 255 - "0x80000000" 256 - "0x1" 257 - values: 258 - "-0x7FFFFFFF" 259 - "0x1" 260 - values: 261 - "-0x80000000" 262 - "0x1" 263 - values: 264 - "0xFFFFFFFF" 265 - "0x80000000" 266 - values: 267 - "-0xFFFFFFFF" 268 - "0x80000000" 269 270 - file-name: "vals" 271 isa: 272 instructions: 273 - sig: div2 v:in:i32 274 acc: inout:i32 275 format: [op_v_8] 276 code-template: | 277 # 278 ldai %s 279 movi v0, %s 280 div2 v0 281 movi v0, %s 282 jne v0, set_failure 283 ldai 0 284 jmp fall_through 285 set_failure: 286 ldai 1 287 fall_through: 288 description: Check div2 with various values. 289 tags: ['tsan'] 290 cases: 291 - values: 292 - "0x5A2A7A20" 293 - "0x92C42" 294 - "0x9D4" 295 - values: 296 - "0x723F999F" 297 - "0x6C589" 298 - "0x10DF" 299 - values: 300 - "0x5B39A21C" 301 - "0xDFD2A" 302 - "0x685" 303 - values: 304 - "0xEC29B76A" 305 - "0x6126B" 306 - "0xFFFFFCBC" 307 - values: 308 - "0x9617582D" 309 - "0x2BD45" 310 - "0xFFFFD957" 311 - values: 312 - "0x9B35145B" 313 - "0x9014F" 314 - "0xFFFFF4CF" 315 - values: 316 - "0xA9D5C5AB" 317 - "0xA2323" 318 - "0xFFFFF781" 319 - values: 320 - "0xD90A7511" 321 - "0x64F85" 322 - "0xFFFFF9D4" 323 - values: 324 - "0x97C40EB3" 325 - "0x7670F" 326 - "0xFFFFF1EC" 327 - values: 328 - "0x3D0C14FE" 329 - "0x89837" 330 - "0x71A" 331 - values: ["0x80000000", "-1", "0x80000000"] 332 - values: ["-2147483648", "-1", "-2147483648"] 333 334 335 - file-name: "op_v_8_exception" 336 isa: 337 instructions: 338 - sig: div2 v:in:i32 339 acc: inout:i32 340 format: [op_v_8] 341 tags: ['irtoc_ignore'] 342 header-template: [ArithmeticException, main] 343 code-template: | 344 # 345 ldai %s 346 movi v0, 0 347 begin: 348 div2 v0 349 end: 350 ldai 1 # Should not reach this line 351 return 352 353 catch_AE: 354 ldai 0 # Expected panda.ArithmeticException 355 return 356 357 catch_all: 358 ldai 1 # Unexpected exception, test failed 359 return 360 361 .catch panda.ArithmeticException, begin, end, catch_AE 362 .catchall begin, end, catch_all 363 check-type: none 364 description: Check `div2` throws ArithmeticException when divides by zero. 365 cases: 366 - values: ["0"] 367 - values: ["1"] 368 - values: ["0x7FFF"] 369 - values: ["0xFFFF"] 370 - values: ["0x7FFFFFFF"] 371 - values: ["0x80000000"] 372 - values: ["0xFFFFFFFF"] 373 - values: ["-1"] 374 - values: ["-0x7FFF"] 375 - values: ["-0xFFFF"] 376 - values: ["-0x7FFFFFFF"] 377 - values: ["-0x80000000"] 378 - values: ["-0xFFFFFFFF"] 379 380 - file-name: "vals_mod32_1" 381 bugid: ['1324', '2072'] 382 tags: ['verifier'] 383 runner-options: ['verifier-failure', 'verifier-config'] 384 isa: 385 instructions: 386 - sig: div2 v:in:i32 387 acc: inout:i32 388 format: [op_v_8] 389 code-template: | 390 # 391 ldai %s 392 movi v0, %s 393 div2 v0 394 movi.64 v0, %s 395 cmp.64 v0 396 description: Check div2 with incorrect type of accumulator and register. 397 cases: 398 - values: 399 - "0xFFFFFFFF" 400 - "1" 401 - "0xFFFFFFFFFFFFFFFF" 402 - values: 403 - "0x7FFFFFFF" 404 - "-1" 405 - "0xFFFFFFFF80000001" 406 - values: 407 - "0x80000000" 408 - "-1" 409 - "0xFFFFFFFF80000000" 410 411 - file-name: "vals_mod32_2" 412 bugid: ['1324'] 413 tags: ['verifier'] 414 runner-options: ['verifier-failure', 'verifier-config'] 415 isa: 416 instructions: 417 - sig: div2 v:in:i32 418 acc: inout:i32 419 format: [op_v_8] 420 code-template: | 421 # 422 ldai.64 %s 423 movi.64 v0, %s 424 div2 v0 425 movi.64 v0, %s 426 cmp.64 v0 427 description: Check div2 with incorrect type of accumulator and register. 428 cases: 429 - values: 430 - "0x1FFFFFFFF" 431 - "0xFFFFFFFF" 432 - "1" 433 - values: 434 - "0x777777777FFFFFFF" 435 - "0x11111111FFFFFFFF" 436 - "0xFFFFFFFF80000001" 437 - values: 438 - "0x180000000" 439 - "0x100000001" 440 - "0xFFFFFFFF80000000" 441 442 - file-name: "regs" 443 isa: 444 instructions: 445 - sig: div2 v:in:i32 446 acc: inout:i32 447 format: [op_v_8] 448 runner-options: ['compile-only'] 449 code-template: | 450 # 451 div2 %s 452 check-type: none 453 description: Check div2 with various register numbers. 454 cases: 455 - values: 456 - "v255" 457 - values: 458 - "v256" 459 runner-options: ['compile-failure'] 460 461 - file-name: "type" 462 tags: ["verifier"] 463 isa: 464 verification: 465 - acc_type 466 - v1_type 467 runner-options: ['verifier-failure', 'verifier-config'] 468 header-template: [] 469 code-template: | 470 .record T {} 471 .function i32 main() { 472 %s 473 *s 474 div2 v0 475 check-type: exit-positive 476 description: Check 'div2' with incorrect accumulator and/or register types. 477 cases: 478 - values: 479 - ldai 0 480 id: acc_ok 481 - values: 482 - ldai.64 0 483 - values: 484 - fldai 0 485 - values: 486 - fldai.64 0 487 - values: 488 - lda.null 489 - values: 490 - | 491 # 492 movi v1, 0 493 newarr v1, v1, i32[] 494 lda.obj v1 495 - values: 496 - lda.str "0" 497 - values: 498 - lda.type T 499 - values: 500 - | 501 # 502 newobj v1, T 503 lda.obj v1 504 template-cases: 505 - values: 506 - movi v0, 1 507 exclude: [acc_ok] 508 - values: 509 - movi.64 v0, 1 510 - values: 511 - fmovi v0, 1 512 - values: 513 - fmovi.64 v0, 1 514 - values: 515 - mov.null v0 516 - values: 517 - | 518 # 519 movi v0, 0 520 newarr v0, v0, i32[] 521 - values: 522 - | 523 # 524 lda.str "0" 525 sta.obj v0 526 - values: 527 - | 528 # 529 lda.type T 530 sta.obj v0 531 - values: 532 - newobj v0, T 533 534 535 - file-name: uninitialized_regs 536 isa: 537 instructions: 538 - sig: div2 v:in:i32 539 acc: inout:i32 540 format: [op_v_8] 541 description: Check 'div2' with uninitialized registers. 542 tags: ['verifier'] 543 runner-options: ['verifier-failure', 'verifier-config'] 544 code-template: | 545 # 546 %s 547 *s 548 div2 *s 549 check-type: exit-positive 550 template-cases: 551 - values: 552 - '' 553 - values: 554 - ldai 0 555 exclude: [init] 556 cases: 557 - values: 558 - '' 559 - v0 560 - values: 561 - movi v1, 0 562 - v1 563 id: init 564 - values: 565 - '' 566 - v8 567 - values: 568 - '' 569 - v15 570 - values: 571 - movi v15, 0 572 - v15 573 id: init 574