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 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 return 40 set_failure: 41 ldai 1 42 return 43 check-type: none 44 description: Check `divi` with zero and various values. 45 cases: 46 - values: ["1"] 47 - values: ["-1"] 48 - values: ["0xF"] 49 - values: ["-0xF"] 50 - values: ["0x7F"] 51 - values: ["-0x7F"] 52 - values: ["0x80"] 53 - values: ["-0x80"] 54 - values: ["0xFF"] 55 - values: ["-0xFF"] 56 57 58 - file-name: op_imm_8_pone 59 isa: 60 instructions: 61 - sig: divi imm:i32 62 acc: inout:i32 63 format: [op_imm_8] 64 code-template: | 65 # 66 ldai 1 67 divi %s 68 movi v0, %s 69 jne v0, set_failure 70 ldai 0 71 return 72 set_failure: 73 ldai 1 74 return 75 check-type: none 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 89 90 - file-name: op_imm_8_none 91 isa: 92 instructions: 93 - sig: divi imm:i32 94 acc: inout:i32 95 format: [op_imm_8] 96 code-template: | 97 # 98 ldai -1 99 divi %s 100 movi v0, %s 101 jne v0, set_failure 102 ldai 0 103 return 104 set_failure: 105 ldai 1 106 return 107 check-type: none 108 description: Check `divi` with -1 and various values. 109 cases: 110 - values: ["1", "0xFFFFFFFF"] 111 - values: ["-1", "0x1"] 112 - values: ["0xF", "0x0"] 113 - values: ["-0xF", "0x0"] 114 - values: ["0x7F", "0x0"] 115 - values: ["-0x7F", "0x0"] 116 - values: ["0x80", "0x0"] 117 - values: ["-0x80", "0x0"] 118 - values: ["0xFF", "0x1"] 119 - values: ["-0xFF", "0xFFFFFFFF"] 120 121 122 - file-name: op_imm_8_pmax 123 isa: 124 instructions: 125 - sig: divi imm:i32 126 acc: inout:i32 127 format: [op_imm_8] 128 code-template: | 129 # 130 ldai 0x7FFFFFFF 131 divi %s 132 movi v0, %s 133 jne v0, set_failure 134 ldai 0 135 return 136 set_failure: 137 ldai 1 138 return 139 check-type: none 140 description: Check `divi` with +max and various values. 141 cases: 142 - values: ["1", "0x7FFFFFFF"] 143 - values: ["-1", "0x80000001"] 144 - values: ["0xF", "0x8888888"] 145 - values: ["-0xF", "0xF7777778"] 146 - values: ["0x7F", "0x1020408"] 147 - values: ["-0x7F", "0xFEFDFBF8"] 148 - values: ["0x80", "0xFF000001"] 149 - values: ["-0x80", "0xFF000001"] 150 - values: ["0xFF", "0x80000001"] 151 - values: ["-0xFF", "0x7FFFFFFF"] 152 153 154 - file-name: op_imm_8_nmax 155 isa: 156 instructions: 157 - sig: divi imm:i32 158 acc: inout:i32 159 format: [op_imm_8] 160 code-template: | 161 # 162 ldai -0x80000000 163 divi %s 164 movi v0, %s 165 jne v0, set_failure 166 ldai 0 167 return 168 set_failure: 169 ldai 1 170 return 171 check-type: none 172 description: Check `divi` with -max and various values. 173 cases: 174 - values: ["1", "0x80000000"] 175 - values: ["-1", "0x80000000"] 176 - values: ["0xF", "0xF7777778"] 177 - values: ["-0xF", "0x8888888"] 178 - values: ["0x7F", "0xFEFDFBF8"] 179 - values: ["-0x7F", "0x1020408"] 180 - values: ["0x80", "0x1000000"] 181 - values: ["-0x80", "0x1000000"] 182 - values: ["0xFF", "0x80000000"] 183 - values: ["-0xFF", "0x80000000"] 184 185 186 - file-name: op_imm_8_exception 187 isa: 188 instructions: 189 - sig: divi imm:i32 190 acc: inout:i32 191 format: [op_imm_8] 192 header-template: [ArithmeticException, main] 193 tags: ['irtoc_ignore'] 194 195 code-template: | 196 # 197 ldai %s 198 begin: 199 divi %s 200 end: 201 ldai 1 # Should not reach this line 202 return 203 204 catch_AE: 205 ldai 0 # Expected panda.ArithmeticException 206 return 207 208 catch_all: 209 ldai 1 # Unexpected exception, test failed 210 return 211 212 .catch panda.ArithmeticException, begin, end, catch_AE 213 .catchall begin, end, catch_all 214 check-type: none 215 description: Check `divi` throws ArithmeticException when divides by zero. 216 cases: 217 - values: ["0", "0"] 218 - values: ["1", "0"] 219 - values: ["-1", "0"] 220 - values: ["0x7FFFFFFF", "0"] 221 - values: ["0x80000000", "0"] 222 - values: ["-0x7FFFFFFF", "0"] 223 - values: ["-0x80000000", "0"] 224 - values: ["0xFFFFFFFF", "0"] 225 - values: ["-0xFFFFFFFF", "0"] 226 227 228 - file-name: vals 229 isa: 230 instructions: 231 - sig: divi imm:i32 232 acc: inout:i32 233 format: [op_imm_8] 234 code-template: | 235 # 236 ldai %s 237 divi %s 238 movi v0, %s 239 jne v0, set_failure 240 ldai 0 241 return 242 set_failure: 243 ldai 1 244 return 245 check-type: none 246 description: Check `divi` with various values. 247 tags: ['tsan'] 248 cases: 249 - values: ["0x881A7B01", "0x8C", "0x108996C"] 250 - values: ["0xB915B8BD", "0x02", "0xDC8ADC5F"] 251 - values: ["0x336458D6", "0x02", "0x19B22C6B"] 252 - values: ["0x91958F96", "0x0A", "0xF4F55B29"] 253 - values: ["0x239216BB", "0x39", "0x9FC185"] 254 - values: ["0x91E75821", "0x74", "0xFF0D0762"] 255 - values: ["0x46CC7483", "0x2A", "0x1AF88DE"] 256 - values: ["0xEFC0B1E8", "0xFE", "0x81FA70C"] 257 - values: ["0x83BF5338", "0x2F", "0xFD5B383E"] 258 - values: ["0x9D9E74AF", "0x1A", "0xFC375342"] 259 - values: ["0x80000000", "-1", "0x80000000"] 260 - values: ["-2147483648", "-1", "-2147483648"] 261 262 263 - file-name: type 264 isa: 265 verification: 266 - acc_type 267 tags: ['verifier'] 268 runner-options: ['verifier-failure', 'verifier-config'] 269 header-template: [] 270 code-template: | 271 # 272 .record panda.Object <external> 273 .function i32 main() { 274 %s 275 divi 0 276 check-type: exit-positive 277 description: Check 'divi' with incorrect accumulator type. 278 cases: 279 - values: [ldai.64 0] 280 - values: [fldai 0] 281 bugid: ['7315'] 282 - values: [fldai.64 0] 283 - values: [lda.null] 284 - values: [lda.type panda.Object] 285 - values: ['lda.type i32[]'] 286 - values: [lda.str ""] 287 - values: 288 - | 289 # 290 newobj v0, panda.Object 291 lda.obj v0 292 - values: 293 - | 294 # 295 movi v0, 10 296 newarr v0, v0, i32[] 297 lda.obj v0 298 299 300 - file-name: uninitialized_acc 301 isa: 302 instructions: 303 - sig: divi imm:i32 304 acc: inout:i32 305 format: [op_imm_8] 306 description: Check 'divi' with uninitialized accumulator. 307 tags: ['verifier'] 308 runner-options: ['verifier-failure', 'verifier-config'] 309 code-template: | 310 # 311 divi 1 312 check-type: exit-positive 313