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: "div" 17 isa: 18 title: Three address integer division or modulo 19 description: Perform integer division or modulo on two registers and store result into accumulator 20 commands: 21 - file-name: "op_v1_4_v2_4_zero" 22 isa: 23 instructions: 24 - sig: div v1:in:i32, v2:in:i32 25 acc: out:i32 26 format: [op_v1_4_v2_4] 27 code-template: | 28 # 29 movi v0, 0 30 movi v1, %s 31 div v0, v1 32 movi v0, 0 33 jne v0, set_failure 34 ldai 0 35 jmp fall_through 36 set_failure: 37 ldai 1 38 fall_through: 39 description: Check div with zero and various values. 40 cases: 41 - values: ["1"] 42 - values: ["-1"] 43 - values: ["0x7FFFFFFF"] 44 - values: ["0x80000000"] 45 - values: ["-0x7FFFFFFF"] 46 - values: ["-0x80000000"] 47 - values: ["0xFFFFFFFF"] 48 - values: ["-0xFFFFFFFF"] 49 50 - file-name: "op_vs_8_pone" 51 isa: 52 instructions: 53 - sig: div v1:in:i32, v2:in:i32 54 acc: out:i32 55 format: [op_v1_4_v2_4] 56 code-template: | 57 # 58 movi v0, 1 59 movi v1, %s 60 div v0, v1 61 movi v0, %s 62 jne v0, set_failure 63 ldai 0 64 jmp fall_through 65 set_failure: 66 ldai 1 67 fall_through: 68 description: Check div with +1 and various values. 69 cases: 70 - values: ["1", "0x1"] 71 - values: ["-1", "0xFFFFFFFF"] 72 - values: ["0x7FFFFFFF", "0x0"] 73 - values: ["0x80000000", "0x0"] 74 - values: ["-0x7FFFFFFF", "0x0"] 75 - values: ["-0x80000000", "0x0"] 76 - values: ["0xFFFFFFFF", "0xFFFFFFFF"] 77 - values: ["-0xFFFFFFFF", "0x1"] 78 79 - file-name: "op_vs_8_none" 80 isa: 81 instructions: 82 - sig: div v1:in:i32, v2:in:i32 83 acc: out:i32 84 format: [op_v1_4_v2_4] 85 code-template: | 86 # 87 movi v0, -1 88 movi v1, %s 89 div v0, v1 90 movi v0, %s 91 jne v0, set_failure 92 ldai 0 93 jmp fall_through 94 set_failure: 95 ldai 1 96 fall_through: 97 description: Check div with -1 and various values. 98 cases: 99 - values: ["1", "0xFFFFFFFF"] 100 - values: ["-1", "0x1"] 101 - values: ["0x7FFFFFFF", "0x0"] 102 - values: ["0x80000000", "0x0"] 103 - values: ["-0x7FFFFFFF", "0x0"] 104 - values: ["-0x80000000", "0x0"] 105 - values: ["0xFFFFFFFF", "0x1"] 106 - values: ["-0xFFFFFFFF", "0xFFFFFFFF"] 107 108 - file-name: "op_vs_8_pmax" 109 isa: 110 instructions: 111 - sig: div v1:in:i32, v2:in:i32 112 acc: out:i32 113 format: [op_v1_4_v2_4] 114 code-template: | 115 # 116 movi v0, 0x7FFFFFFF 117 movi v1, %s 118 div v0, v1 119 movi v0, %s 120 jne v0, set_failure 121 ldai 0 122 jmp fall_through 123 set_failure: 124 ldai 1 125 fall_through: 126 description: Check div with +max and various values. 127 cases: 128 - values: ["1", "0x7FFFFFFF"] 129 - values: ["-1", "0x80000001"] 130 - values: ["0x7FFFFFFF", "0x1"] 131 - values: ["0x80000000", "0x0"] 132 - values: ["-0x7FFFFFFF", "0xFFFFFFFF"] 133 - values: ["-0x80000000", "0x0"] 134 - values: ["0xFFFFFFFF", "0x80000001"] 135 - values: ["-0xFFFFFFFF", "0x7FFFFFFF"] 136 137 - file-name: "op_vs_8_nmax" 138 isa: 139 instructions: 140 - sig: div v1:in:i32, v2:in:i32 141 acc: out:i32 142 format: [op_v1_4_v2_4] 143 code-template: | 144 # 145 movi v0, -0x80000000 146 movi v1, %s 147 div v0, v1 148 movi v0, %s 149 jne v0, set_failure 150 ldai 0 151 jmp fall_through 152 set_failure: 153 ldai 1 154 fall_through: 155 description: Check div with -max and various values. 156 cases: 157 - values: ["1", "0x80000000"] 158 - values: ["-1", "0x80000000"] 159 - values: ["0x7FFFFFFF", "0xFFFFFFFF"] 160 - values: ["0x80000000", "0x1"] 161 - values: ["-0x7FFFFFFF", "0x1"] 162 - values: ["-0x80000000", "0x1"] 163 - values: ["0xFFFFFFFF", "0x80000000"] 164 - values: ["-0xFFFFFFFF", "0x80000000"] 165 166 - file-name: "vals" 167 isa: 168 instructions: 169 - sig: div v1:in:i32, v2:in:i32 170 acc: out:i32 171 format: [op_v1_4_v2_4] 172 code-template: | 173 # 174 movi v0, %s 175 movi v1, %s 176 div v0, v1 177 movi v0, %s 178 jne v0, set_failure 179 ldai 0 180 jmp fall_through 181 set_failure: 182 ldai 1 183 fall_through: 184 description: Check div with various values. 185 tags: ['tsan'] 186 cases: 187 - values: ["0x5A2A7A20", "0x92C42", "0x9D4"] 188 - values: ["0x723F999F", "0x6C589", "0x10DF"] 189 - values: ["0x5B39A21C", "0xDFD2A", "0x685"] 190 - values: ["0xEC29B76A", "0x6126B", "0xFFFFFCBC"] 191 - values: ["0x9617582D", "0x2BD45", "0xFFFFD957"] 192 - values: ["0x9B35145B", "0x9014F", "0xFFFFF4CF"] 193 - values: ["0xA9D5C5AB", "0xA2323", "0xFFFFF781"] 194 - values: ["0xD90A7511", "0x64F85", "0xFFFFF9D4"] 195 - values: ["0x97C40EB3", "0x7670F", "0xFFFFF1EC"] 196 - values: ["0x3D0C14FE", "0x89837", "0x71A"] 197 - values: ["0x80000000", "-1", "0x80000000"] 198 - values: ["-2147483648", "-1", "-2147483648"] 199 200 - file-name: "op_v1_4_v2_4_exception" 201 isa: 202 instructions: 203 - sig: div v1:in:i32, v2:in:i32 204 acc: out:i32 205 format: [op_v1_4_v2_4] 206 exceptions: 207 - x_arith 208 header-template: [ArithmeticException, main] 209 tags: ['irtoc_ignore'] 210 code-template: | 211 # 212 movi v0, %s 213 movi v1, 0 214 begin: 215 div v0, v1 216 end: 217 ldai 1 # Should not reach this line 218 return 219 220 catch_AE: 221 ldai 0 # Expected panda.ArithmeticException 222 return 223 224 catch_all: 225 ldai 1 # Unexpected exception, test failed 226 return 227 228 .catch panda.ArithmeticException, begin, end, catch_AE 229 .catchall begin, end, catch_all 230 check-type: none 231 description: Check `div` throws ArithmeticException when divides by zero. 232 cases: 233 - values: ["0"] 234 - values: ["1"] 235 - values: ["0x7FFFFFFF"] 236 - values: ["0x80000000"] 237 - values: ["0xFFFFFFFF"] 238 - values: ["-1"] 239 - values: ["-0x7FFFFFFF"] 240 - values: ["-0x80000000"] 241 - values: ["-0xFFFFFFFF"] 242 243 - file-name: "regs" 244 isa: 245 instructions: 246 - sig: div v1:in:i32, v2:in:i32 247 acc: out:i32 248 format: [op_v1_4_v2_4] 249 runner-options: ['compile-only'] 250 code-template: | 251 # 252 div %s, %s 253 check-type: none 254 description: Check div with various register numbers. 255 cases: 256 - values: ["v15", "v15"] 257 - values: ["v0", "v15"] 258 - values: ["v15", "v0"] 259 - values: ["v15", "v16"] 260 runner-options: ['compile-failure'] 261 - values: ["v16", "v15"] 262 runner-options: ['compile-failure'] 263 - values: ["v16", "v16"] 264 runner-options: ['compile-failure'] 265 266 - file-name: type 267 isa: 268 verification: 269 - v1_type 270 - v2_type 271 tags: ['verifier'] 272 runner-options: ['verifier-failure', 'verifier-config'] 273 header-template: [] 274 code-template: | 275 # 276 .record A {} 277 .record B {} 278 .record panda.String <external> 279 .record panda.Object <external> 280 .function i32 main() { 281 %s 282 *s 283 div v0, v1 284 check-type: exit-positive 285 description: Check 'div' with incorrect register types. 286 template-cases: 287 - values: 288 - movi v0, 0 289 exclude: [val] 290 - values: 291 - movi.64 v0, 0 292 - values: 293 - fmovi v0, 0 294 - values: 295 - fmovi.64 v0, 0 296 - values: 297 - | 298 # 299 lda.type B 300 sta.obj v0 301 - values: 302 - | 303 # 304 lda.type B[] 305 sta.obj v0 306 - values: 307 - | 308 # 309 lda.type panda.String 310 sta.obj v0 311 - values: 312 - | 313 # 314 lda.type panda.Object 315 sta.obj v0 316 - values: 317 - | 318 # 319 movi v0, 10 320 newarr v0, v0, i32[] 321 - values: 322 - mov.null v0 323 cases: 324 - values: 325 - movi v1, 0 326 id: val 327 - values: 328 - movi.64 v1, 0 329 - values: 330 - fmovi v1, 0 331 - values: 332 - fmovi.64 v1, 0 333 - values: 334 - | 335 # 336 lda.type A 337 sta.obj v1 338 - values: 339 - | 340 # 341 lda.type A[] 342 sta.obj v1 343 - values: 344 - | 345 # 346 lda.type panda.String 347 sta.obj v1 348 - values: 349 - | 350 # 351 lda.type panda.Object 352 sta.obj v1 353 - values: 354 - | 355 # 356 movi v1, 10 357 newarr v1, v1, i32[] 358 - values: 359 - mov.null v1 360 361 362 - file-name: uninitialized_regs 363 isa: 364 instructions: 365 - sig: div v1:in:i32, v2:in:i32 366 acc: out:i32 367 format: [op_v1_4_v2_4] 368 description: Check 'div' with uninitialized registers. 369 tags: ['verifier'] 370 runner-options: ['verifier-failure', 'verifier-config'] 371 code-template: | 372 # 373 %s 374 *s 375 div %s, *s 376 check-type: exit-positive 377 template-cases: 378 - values: 379 - '' 380 - v0 381 - values: 382 - movi v0, 0 383 - v0 384 exclude: [init] 385 - values: 386 - '' 387 - v7 388 - values: 389 - '' 390 - v15 391 - values: 392 - 'movi v15, 0' 393 - v15 394 exclude: [init] 395 cases: 396 - values: 397 - '' 398 - v1 399 - values: 400 - movi v1, 0 401 - v1 402 id: init 403 - values: 404 - '' 405 - v8 406 - values: 407 - '' 408 - v14 409