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