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