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: 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 return 40 set_failure: 41 ldai 1 42 return 43 check-type: none 44 description: Check `modi` 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: modi imm:i32 62 acc: inout:i32 63 format: [op_imm_8] 64 code-template: | 65 # 66 ldai 1 67 modi %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 `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 89 90 - file-name: op_imm_8_none 91 isa: 92 instructions: 93 - sig: modi imm:i32 94 acc: inout:i32 95 format: [op_imm_8] 96 code-template: | 97 # 98 ldai -1 99 modi %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 `modi` with -1 and various values. 109 cases: 110 - values: ["1", "0x0"] 111 - values: ["-1", "0x0"] 112 - values: ["0xF", "0xFFFFFFFF"] 113 - values: ["-0xF", "0xFFFFFFFF"] 114 - values: ["0x7F", "0xFFFFFFFF"] 115 - values: ["-0x7F", "0xFFFFFFFF"] 116 - values: ["0x80", "0xFFFFFFFF"] 117 - values: ["-0x80", "0xFFFFFFFF"] 118 - values: ["0xFF", "0x0"] 119 - values: ["-0xFF", "0x0"] 120 121 122 - file-name: op_imm_8_pmax 123 isa: 124 instructions: 125 - sig: modi imm:i32 126 acc: inout:i32 127 format: [op_imm_8] 128 code-template: | 129 # 130 ldai 0x7FFFFFFF 131 modi %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 `modi` with +max and various values. 141 cases: 142 - values: ["1", "0x0"] 143 - values: ["-1", "0x0"] 144 - values: ["0xF", "0x7"] 145 - values: ["-0xF", "0x7"] 146 - values: ["0x7F", "0x7"] 147 - values: ["-0x7F", "0x7"] 148 - values: ["0x80", "0x7F"] 149 - values: ["-0x80", "0x7F"] 150 - values: ["0xFF", "0x0"] 151 - values: ["-0xFF", "0x0"] 152 153 154 - file-name: op_imm_8_nmax 155 isa: 156 instructions: 157 - sig: modi imm:i32 158 acc: inout:i32 159 format: [op_imm_8] 160 code-template: | 161 # 162 ldai -0x80000000 163 modi %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 `modi` with -max and various values. 173 cases: 174 - values: ["1", "0x0"] 175 - values: ["-1", "0x0"] 176 - values: ["0xF", "0xFFFFFFF8"] 177 - values: ["-0xF", "0xFFFFFFF8"] 178 - values: ["0x7F", "0xFFFFFFF8"] 179 - values: ["-0x7F", "0xFFFFFFF8"] 180 - values: ["0x80", "0x0"] 181 - values: ["-0x80", "0x0"] 182 - values: ["0xFF", "0x0"] 183 - values: ["-0xFF", "0x0"] 184 185 186 - file-name: op_imm_8_exception 187 isa: 188 instructions: 189 - sig: modi imm:i32 190 acc: inout:i32 191 format: [op_imm_8] 192 tags: ['irtoc_ignore'] 193 header-template: [ArithmeticException, main] 194 195 code-template: | 196 # 197 ldai %s 198 begin: 199 modi %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 `modi` 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: modi imm:i32 232 acc: inout:i32 233 format: [op_imm_8] 234 code-template: | 235 # 236 ldai %s 237 modi %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 `modi` with various values. 247 tags: ['tsan'] 248 cases: 249 - values: ["0xB7B95C3B", "0x46", "0xFFFFFFBD"] 250 - values: ["0x916AF28B", "0x6C", "0xFFFFFFCB"] 251 - values: ["0x3DF18885", "0x1F", "0xD"] 252 - values: ["0x23C4316E", "0xCC", "0x1E"] 253 - values: ["0x217C7378", "0x51", "0x3B"] 254 - values: ["0x95022A5B", "0xE5", "0xFFFFFFF2"] 255 - values: ["0x5C9E8AED", "0x04", "0x1"] 256 - values: ["0xBED70106", "0xE7", "0xFFFFFFFC"] 257 - values: ["0x4DE91F53", "0x03", "0x1"] 258 - values: ["0x6D79C474", "0x67", "0x4A"] 259 - values: ["0x80000000", "-1", "0"] 260 - values: ["-2147483648", "-1", "0"] 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 modi 0 276 check-type: exit-positive 277 description: Check 'modi' 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: modi imm:i32 304 acc: inout:i32 305 format: [op_imm_8] 306 description: Check 'modi' with uninitialized accumulator. 307 tags: ['verifier'] 308 runner-options: ['verifier-failure', 'verifier-config'] 309 code-template: | 310 modi 1 311 check-type: exit-positive 312