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.64" 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.64 v:in:i64 28 acc: inout:i64 29 format: [op_v_8] 30 tags: ['irtoc_ignore'] 31 code-template: | 32 # 33 ldai.64 0 34 movi.64 v0, %s 35 div2.64 v0 36 movi.64 v0, 0 37 cmp.64 v0 38 description: Check div2.64 with zero and various values. 39 cases: 40 - values: 41 - "0" 42 runner-options: ['run-failure'] 43 description: Division by zero causes to exception. 44 - values: 45 - "1" 46 - values: 47 - "-1" 48 - values: 49 - "0x7FFFFFFFFFFFFFFF" 50 - values: 51 - "0x8000000000000000" 52 - values: 53 - "-0x7FFFFFFFFFFFFFFF" 54 - values: 55 - "-0x8000000000000000" 56 - values: 57 - "0xFFFFFFFFFFFFFFFF" 58 - values: 59 - "-0xFFFFFFFFFFFFFFFF" 60 61 - file-name: "op_vs_8_pone" 62 isa: 63 instructions: 64 - sig: div2.64 v:in:i64 65 acc: inout:i64 66 format: [op_v_8] 67 tags: ['irtoc_ignore'] 68 code-template: | 69 # 70 ldai.64 1 71 movi.64 v0, %s 72 div2.64 v0 73 movi.64 v0, %s 74 cmp.64 v0 75 description: Check div2.64 with +1 and various values. 76 cases: 77 - values: 78 - "0" 79 - "0x0" 80 runner-options: ['run-failure'] 81 description: Division by zero causes to exception. 82 - values: 83 - "1" 84 - "0x1" 85 - values: 86 - "-1" 87 - "0xFFFFFFFFFFFFFFFF" 88 - values: 89 - "0x7FFFFFFFFFFFFFFF" 90 - "0x0" 91 - values: 92 - "0x8000000000000000" 93 - "0x0" 94 - values: 95 - "-0x7FFFFFFFFFFFFFFF" 96 - "0x0" 97 - values: 98 - "-0x8000000000000000" 99 - "0x0" 100 - values: 101 - "0xFFFFFFFFFFFFFFFF" 102 - "0xFFFFFFFFFFFFFFFF" 103 - values: 104 - "-0xFFFFFFFFFFFFFFFF" 105 - "0x1" 106 107 - file-name: "op_vs_8_none" 108 isa: 109 instructions: 110 - sig: div2.64 v:in:i64 111 acc: inout:i64 112 format: [op_v_8] 113 tags: ['irtoc_ignore'] 114 code-template: | 115 # 116 ldai.64 -1 117 movi.64 v0, %s 118 div2.64 v0 119 movi.64 v0, %s 120 cmp.64 v0 121 description: Check div2.64 with -1 and various values. 122 cases: 123 - values: 124 - "0" 125 - "0x0" 126 runner-options: ['run-failure'] 127 description: Division by zero causes to exception. 128 - values: 129 - "1" 130 - "0xFFFFFFFFFFFFFFFF" 131 - values: 132 - "-1" 133 - "0x1" 134 - values: 135 - "0x7FFFFFFFFFFFFFFF" 136 - "0x0" 137 - values: 138 - "0x8000000000000000" 139 - "0x0" 140 - values: 141 - "-0x7FFFFFFFFFFFFFFF" 142 - "0x0" 143 - values: 144 - "-0x8000000000000000" 145 - "0x0" 146 - values: 147 - "0xFFFFFFFFFFFFFFFF" 148 - "0x1" 149 - values: 150 - "-0xFFFFFFFFFFFFFFFF" 151 - "0xFFFFFFFFFFFFFFFF" 152 153 - file-name: "op_vs_8_pmax" 154 isa: 155 instructions: 156 - sig: div2.64 v:in:i64 157 acc: inout:i64 158 format: [op_v_8] 159 tags: ['irtoc_ignore'] 160 code-template: | 161 # 162 ldai.64 0x7FFFFFFFFFFFFFFF 163 movi.64 v0, %s 164 div2.64 v0 165 movi.64 v0, %s 166 cmp.64 v0 167 description: Check div2.64 with +max1 and various values. 168 cases: 169 - values: 170 - "0" 171 - "0x0" 172 runner-options: ['run-failure'] 173 description: Division by zero causes to exception. 174 - values: 175 - "1" 176 - "0x7FFFFFFFFFFFFFFF" 177 - values: 178 - "-1" 179 - "0x8000000000000001" 180 - values: 181 - "0x7FFFFFFFFFFFFFFF" 182 - "0x1" 183 - values: 184 - "0x8000000000000000" 185 - "0x0" 186 - values: 187 - "-0x7FFFFFFFFFFFFFFF" 188 - "0xFFFFFFFFFFFFFFFF" 189 - values: 190 - "-0x8000000000000000" 191 - "0x0" 192 - values: 193 - "0xFFFFFFFFFFFFFFFF" 194 - "0x8000000000000001" 195 - values: 196 - "-0xFFFFFFFFFFFFFFFF" 197 - "0x7FFFFFFFFFFFFFFF" 198 199 - file-name: "op_vs_8_nmax" 200 isa: 201 instructions: 202 - sig: div2.64 v:in:i64 203 acc: inout:i64 204 format: [op_v_8] 205 tags: ['irtoc_ignore'] 206 code-template: | 207 # 208 ldai.64 -0x8000000000000000 209 movi.64 v0, %s 210 div2.64 v0 211 movi.64 v0, %s 212 cmp.64 v0 213 description: Check div2.64 with -max and various values. 214 cases: 215 - values: 216 - "0" 217 - "0x0" 218 runner-options: ['run-failure'] 219 description: Division by zero causes to exception. 220 - values: 221 - "1" 222 - "0x8000000000000000" 223 - values: 224 - "-1" 225 - "0x8000000000000000" 226 - values: 227 - "0x7FFFFFFFFFFFFFFF" 228 - "0xFFFFFFFFFFFFFFFF" 229 - values: 230 - "0x8000000000000000" 231 - "0x1" 232 - values: 233 - "-0x7FFFFFFFFFFFFFFF" 234 - "0x1" 235 - values: 236 - "-0x8000000000000000" 237 - "0x1" 238 - values: 239 - "0xFFFFFFFFFFFFFFFF" 240 - "0x8000000000000000" 241 - values: 242 - "-0xFFFFFFFFFFFFFFFF" 243 - "0x8000000000000000" 244 245 - file-name: "vals" 246 isa: 247 instructions: 248 - sig: div2.64 v:in:i64 249 acc: inout:i64 250 format: [op_v_8] 251 code-template: | 252 # 253 ldai.64 %s 254 movi.64 v0, %s 255 div2.64 v0 256 movi.64 v0, %s 257 cmp.64 v0 258 description: Check div2.64 with various values. 259 tags: ['tsan'] 260 cases: 261 - values: 262 - "0x17EAACD3255811A1" 263 - "0xE8E4A070A" 264 - "0x1A4A25D" 265 - values: 266 - "0x33E7A3F9C4EB40AC" 267 - "0xE2BBF826B" 268 - "0x3A9ABE7" 269 - values: 270 - "0x2F4D5E0722AF40CC" 271 - "0x2C94DC312" 272 - "0x10F9F8C8" 273 - values: 274 - "0x96E12447F0B72B46" 275 - "0xEEA31086D" 276 - "0xFFFFFFFFF8F3B214" 277 - values: 278 - "0xD40751B27C6EFFAE" 279 - "0x21862396D" 280 - "0xFFFFFFFFEB038548" 281 - values: 282 - "0x48F08991A9F4AA07" 283 - "0x48601B6E8" 284 - "0x101FEDDA" 285 - values: 286 - "0x31EF39B9FC101C37" 287 - "0xA19115513" 288 - "0x4F1ED2F" 289 - values: 290 - "0x745FF968D0103641" 291 - "0x8297D9DAB" 292 - "0xE420CCA" 293 - values: 294 - "0xECE3CBD68839EA0F" 295 - "0x5B6B86256" 296 - "0xFFFFFFFFFCA7C8C3" 297 - values: 298 - "0x68BC11164D46497D" 299 - "0xE6EBA2BD5" 300 - "0x741C0A9" 301 - values: ["0x8000000000000000", "-1", "0x8000000000000000"] 302 - values: ["-9223372036854775808", "-1", "-9223372036854775808"] 303 304 - file-name: "op_v_8_exception" 305 isa: 306 instructions: 307 - sig: div2.64 v:in:i64 308 acc: inout:i64 309 format: [op_v_8] 310 tags: ['irtoc_ignore'] 311 header-template: [ArithmeticException, main] 312 code-template: | 313 # 314 ldai.64 %s 315 movi.64 v0, 0 316 begin: 317 div2.64 v0 318 end: 319 ldai 1 # Should not reach this line 320 return 321 322 catch_AE: 323 ldai 0 # Expected panda.ArithmeticException 324 return 325 326 catch_all: 327 ldai 1 # Unexpected exception, test failed 328 return 329 330 .catch panda.ArithmeticException, begin, end, catch_AE 331 .catchall begin, end, catch_all 332 check-type: none 333 description: Check `div2.64` throws ArithmeticException when divides by zero. 334 cases: 335 - values: ["0"] 336 - values: ["1"] 337 - values: ["0x7FFFFFFF"] 338 - values: ["0x80000000"] 339 - values: ["0xFFFFFFFF"] 340 - values: ["0x100000000"] 341 - values: ["0x7FFFFFFFFFFFFFFF"] 342 - values: ["0x8000000000000000"] 343 - values: ["0xFFFFFFFFFFFFFFFF"] 344 - values: ["-1"] 345 - values: ["-0x7FFFFFFF"] 346 - values: ["-0x80000000"] 347 - values: ["-0xFFFFFFFF"] 348 - values: ["-0x100000000"] 349 - values: ["-0x7FFFFFFFFFFFFFFF"] 350 - values: ["-0x8000000000000000"] 351 - values: ["-0xFFFFFFFFFFFFFFFF"] 352 353 - file-name: "regs" 354 isa: 355 instructions: 356 - sig: div2.64 v:in:i64 357 acc: inout:i64 358 format: [op_v_8] 359 runner-options: ['compile-only'] 360 code-template: | 361 # 362 div2.64 %s 363 check-type: none 364 description: Check div2.64 with various register numbers. 365 cases: 366 - values: 367 - "v255" 368 - values: 369 - "v256" 370 runner-options: ['compile-failure'] 371 372 - file-name: "type" 373 tags: ["verifier"] 374 isa: 375 verification: 376 - acc_type 377 - v1_type 378 runner-options: ['verifier-failure', 'verifier-config'] 379 header-template: [] 380 code-template: | 381 .record T {} 382 .function i32 main() { 383 %s 384 *s 385 div2.64 v0 386 check-type: exit-positive 387 description: Check 'div2.64' with incorrect accumulator and/or register types. 388 cases: 389 - values: 390 - ldai 0 391 - values: 392 - ldai.64 0 393 id: acc_ok 394 - values: 395 - fldai 0 396 - values: 397 - fldai.64 0 398 - values: 399 - lda.null 400 - values: 401 - | 402 # 403 movi v1, 0 404 newarr v1, v1, i32[] 405 lda.obj v1 406 - values: 407 - lda.str "0" 408 - values: 409 - lda.type T 410 - values: 411 - | 412 # 413 newobj v1, T 414 lda.obj v1 415 template-cases: 416 - values: 417 - movi v0, 1 418 - values: 419 - movi.64 v0, 1 420 exclude: [acc_ok] 421 - values: 422 - fmovi v0, 1 423 - values: 424 - fmovi.64 v0, 1 425 - values: 426 - mov.null v0 427 - values: 428 - | 429 # 430 movi v0, 0 431 newarr v0, v0, i32[] 432 - values: 433 - | 434 # 435 lda.str "0" 436 sta.obj v0 437 - values: 438 - | 439 # 440 lda.type T 441 sta.obj v0 442 - values: 443 - newobj v0, T 444 445 446 - file-name: uninitialized_regs 447 isa: 448 instructions: 449 - sig: div2.64 v:in:i64 450 acc: inout:i64 451 format: [op_v_8] 452 description: Check 'div2.64' with uninitialized registers. 453 tags: ["verifier"] 454 runner-options: ['verifier-failure', 'verifier-config'] 455 code-template: | 456 # 457 %s 458 *s 459 div2.64 *s 460 check-type: exit-positive 461 template-cases: 462 - values: 463 - "" 464 - values: 465 - ldai.64 0 466 exclude: [init] 467 cases: 468 - values: 469 - "" 470 - v0 471 - values: 472 - movi.64 v1, 0 473 - v1 474 id: init 475 - values: 476 - "" 477 - v8 478 - values: 479 - "" 480 - v15 481 - values: 482 - movi.64 v15, 0 483 - v15 484 id: init 485