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 14--- 15definitions: [] 16tests: 17 - file-name: divi 18 isa: 19 title: Two address integer division or modulo with immediate on accumulator 20 description: > 21 Perform two address integer division or modulo on accumulator and immediate and store result into accumulator. 22 Immediate is sign extended to operand size. 23 exceptions: 24 - x_arith 25 commands: 26 - file-name: op_imm_8_zero 27 isa: 28 instructions: 29 - sig: divi imm:i32 30 acc: inout:i32 31 format: [op_imm_8] 32 code-template: | 33 # 34 ldai 0 35 divi %s 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 `divi` with zero and various values. 44 cases: 45 - values: ["1"] 46 - values: ["-1"] 47 - values: ["0xF"] 48 - values: ["-0xF"] 49 - values: ["0x7F"] 50 - values: ["-0x7F"] 51 - values: ["0x80"] 52 - values: ["-0x80"] 53 - values: ["0xFF"] 54 - values: ["-0xFF"] 55 - values: ["0x7FFFFFFF"] 56 - values: ["-0x7FFFFFFF"] 57 - values: ["0xFFFFFFFF"] 58 - values: ["-0xFFFFFFFF"] 59 - file-name: op_imm_8_pone 60 isa: 61 instructions: 62 - sig: divi imm:i32 63 acc: inout:i32 64 format: [op_imm_8] 65 code-template: | 66 # 67 ldai 1 68 divi %s 69 movi v0, %s 70 jne v0, set_failure 71 ldai 0 72 jmp fall_through 73 set_failure: 74 ldai 1 75 fall_through: 76 description: Check `divi` with +1 and various values. 77 cases: 78 - values: ["1", "0x1"] 79 - values: ["-1", "0xFFFFFFFF"] 80 - values: ["0xF", "0x0"] 81 - values: ["-0xF", "0x0"] 82 - values: ["0x7F", "0x0"] 83 - values: ["-0x7F", "0x0"] 84 - values: ["0x80", "0x0"] 85 - values: ["-0x80", "0x0"] 86 - values: ["0xFF", "0xFFFFFFFF"] 87 - values: ["-0xFF", "0x1"] 88 - values: ["0x7FFFFFFF", "0xFFFFFFFF"] 89 - values: ["-0x7FFFFFFF", "0x1"] 90 - values: ["0xFFFFFFFF", "0xFFFFFFFF"] 91 - values: ["-0xFFFFFFFF", "0x1"] 92 - file-name: op_imm_8_none 93 isa: 94 instructions: 95 - sig: divi imm:i32 96 acc: inout:i32 97 format: [op_imm_8] 98 code-template: | 99 # 100 ldai -1 101 divi %s 102 movi v0, %s 103 jne v0, set_failure 104 ldai 0 105 jmp fall_through 106 set_failure: 107 ldai 1 108 fall_through: 109 description: Check `divi` with -1 and various values. 110 cases: 111 - values: ["1", "0xFFFFFFFF"] 112 - values: ["-1", "0x1"] 113 - values: ["0xF", "0x0"] 114 - values: ["-0xF", "0x0"] 115 - values: ["0x7F", "0x0"] 116 - values: ["-0x7F", "0x0"] 117 - values: ["0x80", "0x0"] 118 - values: ["-0x80", "0x0"] 119 - values: ["0xFF", "0x1"] 120 - values: ["-0xFF", "0xFFFFFFFF"] 121 - values: ["0x7FFFFFFF", "0x1"] 122 - values: ["-0x7FFFFFFF", "0xFFFFFFFF"] 123 - values: ["0xFFFFFFFF", "0x1"] 124 - values: ["-0xFFFFFFFF", "0xFFFFFFFF"] 125 - file-name: op_imm_8_pmax 126 isa: 127 instructions: 128 - sig: divi imm:i32 129 acc: inout:i32 130 format: [op_imm_8] 131 code-template: | 132 # 133 ldai 0x7FFFFFFF 134 divi %s 135 movi v0, %s 136 jne v0, set_failure 137 ldai 0 138 jmp fall_through 139 set_failure: 140 ldai 1 141 fall_through: 142 description: Check `divi` with +max and various values. 143 cases: 144 - values: ["1", "0x7FFFFFFF"] 145 - values: ["-1", "0x80000001"] 146 - values: ["0xF", "0x8888888"] 147 - values: ["-0xF", "0xF7777778"] 148 - values: ["0x7F", "0x1020408"] 149 - values: ["-0x7F", "0xFEFDFBF8"] 150 - values: ["0x80", "0xFF000001"] 151 - values: ["-0x80", "0xFF000001"] 152 - values: ["0xFF", "0x80000001"] 153 - values: ["-0xFF", "0x7FFFFFFF"] 154 - values: ["0x7FFFFFFF", "0x80000001"] 155 - values: ["-0x7FFFFFFF", "0x7FFFFFFF"] 156 - values: ["0xFFFFFFFF", "0x80000001"] 157 - values: ["-0xFFFFFFFF", "0x7FFFFFFF"] 158 - file-name: op_imm_8_nmax 159 isa: 160 instructions: 161 - sig: divi imm:i32 162 acc: inout:i32 163 format: [op_imm_8] 164 code-template: | 165 # 166 ldai -0x80000000 167 divi %s 168 movi v0, %s 169 jne v0, set_failure 170 ldai 0 171 jmp fall_through 172 set_failure: 173 ldai 1 174 fall_through: 175 description: Check `divi` with -max and various values. 176 cases: 177 - values: ["1", "0x80000000"] 178 - values: ["-1", "0x80000000"] 179 - values: ["0xF", "0xF7777778"] 180 - values: ["-0xF", "0x8888888"] 181 - values: ["0x7F", "0xFEFDFBF8"] 182 - values: ["-0x7F", "0x1020408"] 183 - values: ["0x80", "0x1000000"] 184 - values: ["-0x80", "0x1000000"] 185 - values: ["0xFF", "0x80000000"] 186 - values: ["-0xFF", "0x80000000"] 187 - values: ["0x7FFFFFFF", "0x80000000"] 188 - values: ["-0x7FFFFFFF", "0x80000000"] 189 - values: ["0xFFFFFFFF", "0x80000000"] 190 - values: ["-0xFFFFFFFF", "0x80000000"] 191 192 - file-name: op_imm_8_exception 193 isa: 194 instructions: 195 - sig: divi imm:i32 196 acc: inout:i32 197 format: [op_imm_8] 198 header-template: [ArithmeticException, main] 199 200 code-template: | 201 # 202 ldai %s 203 begin: 204 divi %s 205 end: 206 ldai 1 # Should not reach this line 207 return 208 209 catch_AE: 210 ldai 0 # Expected panda.ArithmeticException 211 return 212 213 catch_all: 214 ldai 1 # Unexpected exception, test failed 215 return 216 217 .catch panda.ArithmeticException, begin, end, catch_AE 218 .catchall begin, end, catch_all 219 check-type: none 220 description: Check `divi` throws ArithmeticException when divides by zero. 221 cases: 222 - values: ["0", "0"] 223 - values: ["1", "0"] 224 - values: ["-1", "0"] 225 - values: ["0x7FFFFFFF", "0"] 226 - values: ["0x80000000", "0"] 227 - values: ["-0x7FFFFFFF", "0"] 228 - values: ["-0x80000000", "0"] 229 - values: ["0xFFFFFFFF", "0"] 230 - values: ["-0xFFFFFFFF", "0"] 231 - values: ["1", "0x100"] 232 - values: ["1", "0x200"] 233 - values: ["1", "0xFFFFFF00"] 234 - values: ["1", "0x12345600"] 235 - values: ["1", "0xFEDCBA00"] 236 237 - file-name: vals 238 isa: 239 instructions: 240 - sig: divi imm:i32 241 acc: inout:i32 242 format: [op_imm_8] 243 code-template: | 244 # 245 ldai %s 246 divi %s 247 movi v0, %s 248 jne v0, set_failure 249 ldai 0 250 jmp fall_through 251 set_failure: 252 ldai 1 253 fall_through: 254 description: Check `divi` with various values. 255 tags: ['tsan'] 256 cases: 257 - values: ["0x881A7B01", "0xBBBC58C", "0x108996C"] 258 - values: ["0xB915B8BD", "0xB5977802", "0xDC8ADC5F"] 259 - values: ["0x336458D6", "0xD358B202", "0x19B22C6B"] 260 - values: ["0x91958F96", "0xFF3E070A", "0xF4F55B29"] 261 - values: ["0x239216BB", "0xFEEF4239", "0x9FC185"] 262 - values: ["0x91E75821", "0x4C3DAF74", "0xFF0D0762"] 263 - values: ["0x46CC7483", "0x2491642A", "0x1AF88DE"] 264 - values: ["0xEFC0B1E8", "0x4A8736FE", "0x81FA70C"] 265 - values: ["0x83BF5338", "0x7994102F", "0xFD5B383E"] 266 - values: ["0x9D9E74AF", "0xADBE6B1A", "0xFC375342"] 267 - values: ["0x80000000", "-1", "0x80000000"] 268 - values: ["-2147483648", "-1", "-2147483648"] 269 270 - file-name: type 271 bugid: ["964", "966"] 272 tags: ["verifier"] 273 isa: 274 instructions: 275 - sig: divi imm:i32 276 acc: inout:i32 277 format: [op_imm_8] 278 verification: 279 - acc_type 280 runner-options: ['verifier-failure', 'verifier-debug-config'] 281 code-template: | 282 # 283 %s 284 divi 1 285 ldai 0 286 return 287 check-type: no-check 288 description: Check `divi` with incorrect accumulator type. 289 cases: 290 - values: [fldai.64 0.0] 291 - values: [fldai.64 -0.0] 292 - values: [fldai.64 1.0] 293 - values: [fldai.64 -1.0] 294 - values: [fldai.64 0x7FF8000000000000] 295 - values: [fldai.64 0xFFFFFFFFFFFFFFFF] 296 - values: [fldai.64 0x7FF0000000000000] 297 - values: [fldai.64 0xFFF0000000000000] 298 - values: [fldai.64 0xFFEFFFFFFFFFFFFF] 299 - values: [fldai.64 0x7FEFFFFFFFFFFFFF] 300 - values: [fldai.64 0x0000000000000001] 301 - values: [fldai.64 0x8000000000000001] 302 - values: [fldai.64 3.14159265358979323846] 303 - values: [lda.str ""] 304 - values: [lda.str "some string"] 305 - values: [lda.null] 306 - values: [ldai.64 0] 307 - values: [ldai.64 1] 308 - values: [ldai.64 -1] 309 - values: [ldai.64 0x0000000100000000] 310 - values: [ldai.64 -0x0000000100000000] 311 - values: [ldai.64 0x0000000080000000] 312 - values: [ldai.64 -0x0000000080000000] 313 - values: [ldai.64 0x1000000000000000] 314 - values: [ldai.64 0x8000000000000000] 315 - values: [ldai.64 0xF000000000000000] 316 - values: [ldai.64 0xFFFFFFFF00000000] 317 - values: [ldai.64 0xFFFFFFFFFFFFFFFF] 318 - values: [ldai.64 -0x1000000000000000] 319 - values: [ldai.64 -0x8000000000000000] 320 - values: [ldai.64 -0xF000000000000000] 321 - values: [ldai.64 -0xFFFFFFFF00000000] 322 - values: [ldai.64 -0xFFFFFFFFFFFFFFFF] 323 - file-name: type_obj 324 bugid: ["964", "966"] 325 tags: ["verifier"] 326 isa: 327 instructions: 328 - sig: divi imm:i32 329 acc: inout:i32 330 format: [op_imm_8] 331 verification: 332 - acc_type 333 runner-options: ['verifier-failure', 'verifier-debug-config'] 334 description: Check `divi` with incorrect accumulator type. 335 code-template: | 336 # 337 .record Object {} 338 .function i32 main() { 339 %s 340 divi 1 341 ldai 0 342 return 343 check-type: none 344 header-template: [] 345 cases: 346 - values: [lda.type Object] 347 - values: 348 - | 349 newobj v0, Object 350 lda.obj v0 351 352