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: modi 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: modi imm:i32 30 acc: inout:i32 31 format: [op_imm_8] 32 code-template: | 33 # 34 ldai 0 35 modi %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 `modi` 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: modi imm:i32 63 acc: inout:i32 64 format: [op_imm_8] 65 code-template: | 66 # 67 ldai 1 68 modi %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 `modi` with +1 and various values. 77 cases: 78 - values: ["1", "0x0"] 79 - values: ["-1", "0x0"] 80 - values: ["0xF", "0x1"] 81 - values: ["-0xF", "0x1"] 82 - values: ["0x7F", "0x1"] 83 - values: ["-0x7F", "0x1"] 84 - values: ["0x80", "0x1"] 85 - values: ["-0x80", "0x1"] 86 - values: ["0xFF", "0x0"] 87 - values: ["-0xFF", "0x0"] 88 - values: ["0x7FFFFFFF", "0x0"] 89 - values: ["-0x7FFFFFFF", "0x0"] 90 - values: ["0xFFFFFFFF", "0x0"] 91 - values: ["-0xFFFFFFFF", "0x0"] 92 - file-name: op_imm_8_none 93 isa: 94 instructions: 95 - sig: modi imm:i32 96 acc: inout:i32 97 format: [op_imm_8] 98 code-template: | 99 # 100 ldai -1 101 modi %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 `modi` with -1 and various values. 110 cases: 111 - values: ["1", "0x0"] 112 - values: ["-1", "0x0"] 113 - values: ["0xF", "0xFFFFFFFF"] 114 - values: ["-0xF", "0xFFFFFFFF"] 115 - values: ["0x7F", "0xFFFFFFFF"] 116 - values: ["-0x7F", "0xFFFFFFFF"] 117 - values: ["0x80", "0xFFFFFFFF"] 118 - values: ["-0x80", "0xFFFFFFFF"] 119 - values: ["0xFF", "0x0"] 120 - values: ["-0xFF", "0x0"] 121 - values: ["0x7FFFFFFF", "0x0"] 122 - values: ["-0x7FFFFFFF", "0x0"] 123 - values: ["0xFFFFFFFF", "0x0"] 124 - values: ["-0xFFFFFFFF", "0x0"] 125 - file-name: op_imm_8_pmax 126 isa: 127 instructions: 128 - sig: modi imm:i32 129 acc: inout:i32 130 format: [op_imm_8] 131 code-template: | 132 # 133 ldai 0x7FFFFFFF 134 modi %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 `modi` with +max and various values. 143 cases: 144 - values: ["1", "0x0"] 145 - values: ["-1", "0x0"] 146 - values: ["0xF", "0x7"] 147 - values: ["-0xF", "0x7"] 148 - values: ["0x7F", "0x7"] 149 - values: ["-0x7F", "0x7"] 150 - values: ["0x80", "0x7F"] 151 - values: ["-0x80", "0x7F"] 152 - values: ["0xFF", "0x0"] 153 - values: ["-0xFF", "0x0"] 154 - values: ["0x7FFFFFFF", "0x0"] 155 - values: ["-0x7FFFFFFF", "0x0"] 156 - values: ["0xFFFFFFFF", "0x0"] 157 - values: ["-0xFFFFFFFF", "0x0"] 158 - file-name: op_imm_8_nmax 159 isa: 160 instructions: 161 - sig: modi imm:i32 162 acc: inout:i32 163 format: [op_imm_8] 164 code-template: | 165 # 166 ldai -0x80000000 167 modi %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 `modi` with -max and various values. 176 cases: 177 - values: ["1", "0x0"] 178 - values: ["-1", "0x0"] 179 - values: ["0xF", "0xFFFFFFF8"] 180 - values: ["-0xF", "0xFFFFFFF8"] 181 - values: ["0x7F", "0xFFFFFFF8"] 182 - values: ["-0x7F", "0xFFFFFFF8"] 183 - values: ["0x80", "0x0"] 184 - values: ["-0x80", "0x0"] 185 - values: ["0xFF", "0x0"] 186 - values: ["-0xFF", "0x0"] 187 - values: ["0x7FFFFFFF", "0x0"] 188 - values: ["-0x7FFFFFFF", "0x0"] 189 - values: ["0xFFFFFFFF", "0x0"] 190 - values: ["-0xFFFFFFFF", "0x0"] 191 192 - file-name: op_imm_8_exception 193 isa: 194 instructions: 195 - sig: modi 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 modi %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 `modi` 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 - file-name: vals 237 isa: 238 instructions: 239 - sig: modi imm:i32 240 acc: inout:i32 241 format: [op_imm_8] 242 code-template: | 243 # 244 ldai %s 245 modi %s 246 movi v0, %s 247 jne v0, set_failure 248 ldai 0 249 jmp fall_through 250 set_failure: 251 ldai 1 252 fall_through: 253 description: Check `modi` with various values. 254 tags: ['tsan'] 255 cases: 256 - values: ["0xB7B95C3B", "0x932CD46", "0xFFFFFFBD"] 257 - values: ["0x916AF28B", "0xE1D1026C", "0xFFFFFFCB"] 258 - values: ["0x3DF18885", "0x96EFD1F", "0xD"] 259 - values: ["0x23C4316E", "0x92E021CC", "0x1E"] 260 - values: ["0x217C7378", "0xAC168E51", "0x3B"] 261 - values: ["0x95022A5B", "0x42DBC8E5", "0xFFFFFFF2"] 262 - values: ["0x5C9E8AED", "0xEF92804", "0x1"] 263 - values: ["0xBED70106", "0x75B693E7", "0xFFFFFFFC"] 264 - values: ["0x4DE91F53", "0xFA761E03", "0x1"] 265 - values: ["0x6D79C474", "0xD2965C67", "0x4A"] 266 - values: ["0x80000000", "-1", "0"] 267 - values: ["-2147483648", "-1", "0"] 268 269 - file-name: type 270 bugid: ["964", "966"] 271 tags: ["verifier"] 272 isa: 273 instructions: 274 - sig: modi imm:i32 275 acc: inout:i32 276 format: [op_imm_8] 277 verification: 278 - acc_type 279 runner-options: ['verifier-failure', 'verifier-debug-config'] 280 code-template: | 281 # 282 %s 283 modi 1 284 ldai 0 285 return 286 check-type: no-check 287 description: Check `modi` with incorrect accumulator type. 288 cases: 289 - values: [fldai.64 0.0] 290 - values: [fldai.64 -0.0] 291 - values: [fldai.64 1.0] 292 - values: [fldai.64 -1.0] 293 - values: [fldai.64 0x7FF8000000000000] 294 - values: [fldai.64 0xFFFFFFFFFFFFFFFF] 295 - values: [fldai.64 0x7FF0000000000000] 296 - values: [fldai.64 0xFFF0000000000000] 297 - values: [fldai.64 0xFFEFFFFFFFFFFFFF] 298 - values: [fldai.64 0x7FEFFFFFFFFFFFFF] 299 - values: [fldai.64 0x0000000000000001] 300 - values: [fldai.64 0x8000000000000001] 301 - values: [fldai.64 3.14159265358979323846] 302 - values: [lda.str ""] 303 - values: [lda.str "some string"] 304 - values: [lda.null] 305 - values: [ldai.64 0] 306 - values: [ldai.64 1] 307 - values: [ldai.64 -1] 308 - values: [ldai.64 0x0000000100000000] 309 - values: [ldai.64 -0x0000000100000000] 310 - values: [ldai.64 0x0000000080000000] 311 - values: [ldai.64 -0x0000000080000000] 312 - values: [ldai.64 0x1000000000000000] 313 - values: [ldai.64 0x8000000000000000] 314 - values: [ldai.64 0xF000000000000000] 315 - values: [ldai.64 0xFFFFFFFF00000000] 316 - values: [ldai.64 0xFFFFFFFFFFFFFFFF] 317 - values: [ldai.64 -0x1000000000000000] 318 - values: [ldai.64 -0x8000000000000000] 319 - values: [ldai.64 -0xF000000000000000] 320 - values: [ldai.64 -0xFFFFFFFF00000000] 321 - values: [ldai.64 -0xFFFFFFFFFFFFFFFF] 322 - file-name: type_obj 323 bugid: ["964", "966"] 324 tags: ["verifier"] 325 isa: 326 instructions: 327 - sig: modi imm:i32 328 acc: inout:i32 329 format: [op_imm_8] 330 verification: 331 - acc_type 332 runner-options: ['verifier-failure', 'verifier-debug-config'] 333 description: Check `modi` with incorrect accumulator type. 334 code-template: | 335 # 336 .record Object {} 337 .function i32 main() { 338 %s 339 modi 1 340 ldai 0 341 return 342 check-type: none 343 header-template: [] 344 cases: 345 - values: [lda.type Object] 346 - values: 347 - | 348 newobj v0, Object 349 lda.obj v0 350 351