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--- 14definitions: 15 - name: java 16 template: > 17 .language Java 18 19tests: 20 - file-name: call.range 21 isa: 22 title: Static call 23 description: > 24 Call indicated static method, i.e. create new frame, pass values of arguments and 25 continue execution from the first instruction of a method. 26 Callee should treat accumulator value as undefined and cannot use it until accumulator 27 definition in the new frame. 28 Result (if any) is returned in accumulator (see 'Calling sequence' chapter for more details). 29 Method, its class and the number of argument is resolved by given method_id in 30 runtime constant-pool. 31 Arguments are passed in source registers in the same order as in method signature. 32 Non-range instructions can be used to pass up to 4 arguments (unused register slot values will 33 be discarded and corresponding registers will not be passed to the callee). 34 For methods with more arguments range kind of instruction is to be used, which takes the needed number 35 of arguments starting from 'vs' register. 36 exceptions: 37 - x_none 38 verification: 39 - method_id_static 40 - compatible_arguments 41 42 commands: 43 - file-name: op_v_8_id_32_args 44 isa: 45 instructions: 46 - sig: call.range method_id, v:in:top 47 acc: out:top 48 format: [op_v_8_id_16] 49 header-template: [] 50 description: Check that 'call.range' invokes function with different amount of args. 51 tags: ['tsan'] 52 code-template: | 53 .function void f1(%s) { 54 return.void 55 } 56 .function i32 main() { 57 %s 58 call.range f1, v0 59 check-type: exit-positive 60 cases: 61 - values: ['', ''] 62 - values: 63 - 'i32 a0' 64 - 'movi v0, 0' 65 - values: 66 - 'i32 a0, i32 a1' 67 - | 68 # 69 movi v0, 0 70 movi v1, 0 71 72 - values: 73 - 'i32 a0, i32 a1, i32 a2, i32 a3' 74 - | 75 # 76 movi v0, 0 77 movi v1, 0 78 movi v2, 0 79 movi v3, 0 80 - values: 81 - 'i32 a0, i32 a1, i32 a2, i32 a3, i32 a4, i32 a5, i32 a6, i32 a7, i32 a8, i32 a9, i32 a10, i32 a11, i32 a12, i32 a13, i32 a14, i32 a15, i32 a16, i32 a17, i32 a18, i32 a19, i32 a20, i32 a21, i32 a22, i32 a23, i32 a24, i32 a25, i32 a26, i32 a27, i32 a28, i32 a29, i32 a30, i32 a31, i32 a32, i32 a33, i32 a34, i32 a35, i32 a36, i32 a37, i32 a38, i32 a39, i32 a40, i32 a41, i32 a42, i32 a43, i32 a44, i32 a45, i32 a46, i32 a47, i32 a48, i32 a49, i32 a50, i32 a51, i32 a52, i32 a53, i32 a54, i32 a55, i32 a56, i32 a57, i32 a58, i32 a59, i32 a60, i32 a61, i32 a62, i32 a63, i32 a64, i32 a65, i32 a66, i32 a67, i32 a68, i32 a69, i32 a70, i32 a71, i32 a72, i32 a73, i32 a74, i32 a75, i32 a76, i32 a77, i32 a78, i32 a79, i32 a80, i32 a81, i32 a82, i32 a83, i32 a84, i32 a85, i32 a86, i32 a87, i32 a88, i32 a89, i32 a90, i32 a91, i32 a92, i32 a93, i32 a94, i32 a95, i32 a96, i32 a97, i32 a98, i32 a99, i32 a100, i32 a101, i32 a102, i32 a103, i32 a104, i32 a105, i32 a106, i32 a107, i32 a108, i32 a109, i32 a110, i32 a111, i32 a112, i32 a113, i32 a114, i32 a115, i32 a116, i32 a117, i32 a118, i32 a119, i32 a120, i32 a121, i32 a122, i32 a123, i32 a124, i32 a125, i32 a126, i32 a127, i32 a128, i32 a129, i32 a130, i32 a131, i32 a132, i32 a133, i32 a134, i32 a135, i32 a136, i32 a137, i32 a138, i32 a139, i32 a140, i32 a141, i32 a142, i32 a143, i32 a144, i32 a145, i32 a146, i32 a147, i32 a148, i32 a149, i32 a150, i32 a151, i32 a152, i32 a153, i32 a154, i32 a155, i32 a156, i32 a157, i32 a158, i32 a159, i32 a160, i32 a161, i32 a162, i32 a163, i32 a164, i32 a165, i32 a166, i32 a167, i32 a168, i32 a169, i32 a170, i32 a171, i32 a172, i32 a173, i32 a174, i32 a175, i32 a176, i32 a177, i32 a178, i32 a179, i32 a180, i32 a181, i32 a182, i32 a183, i32 a184, i32 a185, i32 a186, i32 a187, i32 a188, i32 a189, i32 a190, i32 a191, i32 a192, i32 a193, i32 a194, i32 a195, i32 a196, i32 a197, i32 a198, i32 a199, i32 a200, i32 a201, i32 a202, i32 a203, i32 a204, i32 a205, i32 a206, i32 a207, i32 a208, i32 a209, i32 a210, i32 a211, i32 a212, i32 a213, i32 a214, i32 a215, i32 a216, i32 a217, i32 a218, i32 a219, i32 a220, i32 a221, i32 a222, i32 a223, i32 a224, i32 a225, i32 a226, i32 a227, i32 a228, i32 a229, i32 a230, i32 a231, i32 a232, i32 a233, i32 a234, i32 a235, i32 a236, i32 a237, i32 a238, i32 a239, i32 a240, i32 a241, i32 a242, i32 a243, i32 a244, i32 a245, i32 a246, i32 a247, i32 a248, i32 a249, i32 a250, i32 a251, i32 a252, i32 a253, i32 a254, i32 a255' 82 - '' 83 runner-options: [compile-only] 84 - values: 85 - 'i32 a0, i32 a1, i32 a2, i32 a3, i32 a4, i32 a5, i32 a6, i32 a7, i32 a8, i32 a9, i32 a10, i32 a11, i32 a12, i32 a13, i32 a14, i32 a15, i32 a16, i32 a17, i32 a18, i32 a19, i32 a20, i32 a21, i32 a22, i32 a23, i32 a24, i32 a25, i32 a26, i32 a27, i32 a28, i32 a29, i32 a30, i32 a31, i32 a32, i32 a33, i32 a34, i32 a35, i32 a36, i32 a37, i32 a38, i32 a39, i32 a40, i32 a41, i32 a42, i32 a43, i32 a44, i32 a45, i32 a46, i32 a47, i32 a48, i32 a49, i32 a50, i32 a51, i32 a52, i32 a53, i32 a54, i32 a55, i32 a56, i32 a57, i32 a58, i32 a59, i32 a60, i32 a61, i32 a62, i32 a63, i32 a64, i32 a65, i32 a66, i32 a67, i32 a68, i32 a69, i32 a70, i32 a71, i32 a72, i32 a73, i32 a74, i32 a75, i32 a76, i32 a77, i32 a78, i32 a79, i32 a80, i32 a81, i32 a82, i32 a83, i32 a84, i32 a85, i32 a86, i32 a87, i32 a88, i32 a89, i32 a90, i32 a91, i32 a92, i32 a93, i32 a94, i32 a95, i32 a96, i32 a97, i32 a98, i32 a99, i32 a100, i32 a101, i32 a102, i32 a103, i32 a104, i32 a105, i32 a106, i32 a107, i32 a108, i32 a109, i32 a110, i32 a111, i32 a112, i32 a113, i32 a114, i32 a115, i32 a116, i32 a117, i32 a118, i32 a119, i32 a120, i32 a121, i32 a122, i32 a123, i32 a124, i32 a125, i32 a126, i32 a127, i32 a128, i32 a129, i32 a130, i32 a131, i32 a132, i32 a133, i32 a134, i32 a135, i32 a136, i32 a137, i32 a138, i32 a139, i32 a140, i32 a141, i32 a142, i32 a143, i32 a144, i32 a145, i32 a146, i32 a147, i32 a148, i32 a149, i32 a150, i32 a151, i32 a152, i32 a153, i32 a154, i32 a155, i32 a156, i32 a157, i32 a158, i32 a159, i32 a160, i32 a161, i32 a162, i32 a163, i32 a164, i32 a165, i32 a166, i32 a167, i32 a168, i32 a169, i32 a170, i32 a171, i32 a172, i32 a173, i32 a174, i32 a175, i32 a176, i32 a177, i32 a178, i32 a179, i32 a180, i32 a181, i32 a182, i32 a183, i32 a184, i32 a185, i32 a186, i32 a187, i32 a188, i32 a189, i32 a190, i32 a191, i32 a192, i32 a193, i32 a194, i32 a195, i32 a196, i32 a197, i32 a198, i32 a199, i32 a200, i32 a201, i32 a202, i32 a203, i32 a204, i32 a205, i32 a206, i32 a207, i32 a208, i32 a209, i32 a210, i32 a211, i32 a212, i32 a213, i32 a214, i32 a215, i32 a216, i32 a217, i32 a218, i32 a219, i32 a220, i32 a221, i32 a222, i32 a223, i32 a224, i32 a225, i32 a226, i32 a227, i32 a228, i32 a229, i32 a230, i32 a231, i32 a232, i32 a233, i32 a234, i32 a235, i32 a236, i32 a237, i32 a238, i32 a239, i32 a240, i32 a241, i32 a242, i32 a243, i32 a244, i32 a245, i32 a246, i32 a247, i32 a248, i32 a249, i32 a250, i32 a251, i32 a252, i32 a253, i32 a254, i32 a255, i32 a256' 86 - '' 87 runner-options: [compile-only] 88 89 - file-name: str_args 90 isa: 91 instructions: 92 - sig: call.range method_id, v:in:top 93 acc: out:top 94 format: [op_v_8_id_16] 95 header-template: [panda_string] 96 description: Check that 'call.range' works with String object. 97 tags: ['tsan'] 98 code-template: | 99 .function void f1(panda.String a0) { 100 return.void 101 } 102 .function i32 main() { 103 %s 104 call.range f1%s 105 check-type: exit-positive 106 cases: 107 - values: 108 - '' 109 - '' 110 runner-options: [compile-failure] 111 - values: 112 - | 113 # 114 lda.str "some string" 115 sta.obj v0 116 - ', v0' 117 - values: 118 - ' mov.null v0' 119 - ', v0' 120 - values: 121 - '' 122 - ', "some string"' 123 runner-options: [compile-failure] 124 125 - file-name: reg 126 isa: 127 instructions: 128 - sig: call.range method_id, v:in:top 129 acc: out:top 130 format: [op_v_8_id_16] 131 header-template: [] 132 description: Check 'call.range' available register number width. 133 code-template: | 134 .function void f1() { 135 return.void 136 } 137 .function i32 main() { 138 call.range f1, %s 139 check-type: exit-positive 140 cases: 141 - values: 142 - 'v0' 143 - values: 144 - 'v1' 145 - values: 146 - 'v127' 147 - values: 148 - 'v255' 149 - values: 150 - 'v256' 151 runner-options: [compile-failure] 152 - values: 153 - '0' 154 runner-options: [compile-failure] 155 - values: 156 - '0x7fffffff' 157 runner-options: [compile-failure] 158 - values: 159 - '1.1' 160 runner-options: [compile-failure] 161 - values: 162 - '"some string"' 163 runner-options: [compile-failure] 164 - case-template: | 165 .function void f1(i32 a0, i32 a1, i32 a2, i32 a3, i32 a4, i32 a5, i32 a6, i32 a7, i32 a8, i32 a9, i32 a10, i32 a11, i32 a12, i32 a13, i32 a14, i32 a15, i32 a16, i32 a17, i32 a18, i32 a19, i32 a20, i32 a21, i32 a22, i32 a23, i32 a24, i32 a25, i32 a26, i32 a27, i32 a28, i32 a29, i32 a30, i32 a31, i32 a32, i32 a33, i32 a34, i32 a35, i32 a36, i32 a37, i32 a38, i32 a39, i32 a40, i32 a41, i32 a42, i32 a43, i32 a44, i32 a45, i32 a46, i32 a47, i32 a48, i32 a49, i32 a50, i32 a51, i32 a52, i32 a53, i32 a54, i32 a55, i32 a56, i32 a57, i32 a58, i32 a59, i32 a60, i32 a61, i32 a62, i32 a63, i32 a64, i32 a65, i32 a66, i32 a67, i32 a68, i32 a69, i32 a70, i32 a71, i32 a72, i32 a73, i32 a74, i32 a75, i32 a76, i32 a77, i32 a78, i32 a79, i32 a80, i32 a81, i32 a82, i32 a83, i32 a84, i32 a85, i32 a86, i32 a87, i32 a88, i32 a89, i32 a90, i32 a91, i32 a92, i32 a93, i32 a94, i32 a95, i32 a96, i32 a97, i32 a98, i32 a99, i32 a100, i32 a101, i32 a102, i32 a103, i32 a104, i32 a105, i32 a106, i32 a107, i32 a108, i32 a109, i32 a110, i32 a111, i32 a112, i32 a113, i32 a114, i32 a115, i32 a116, i32 a117, i32 a118, i32 a119, i32 a120, i32 a121, i32 a122, i32 a123, i32 a124, i32 a125, i32 a126, i32 a127, i32 a128, i32 a129, i32 a130, i32 a131, i32 a132, i32 a133, i32 a134, i32 a135, i32 a136, i32 a137, i32 a138, i32 a139, i32 a140, i32 a141, i32 a142, i32 a143, i32 a144, i32 a145, i32 a146, i32 a147, i32 a148, i32 a149, i32 a150, i32 a151, i32 a152, i32 a153, i32 a154, i32 a155, i32 a156, i32 a157, i32 a158, i32 a159, i32 a160, i32 a161, i32 a162, i32 a163, i32 a164, i32 a165, i32 a166, i32 a167, i32 a168, i32 a169, i32 a170, i32 a171, i32 a172, i32 a173, i32 a174, i32 a175, i32 a176, i32 a177, i32 a178, i32 a179, i32 a180, i32 a181, i32 a182, i32 a183, i32 a184, i32 a185, i32 a186, i32 a187, i32 a188, i32 a189, i32 a190, i32 a191, i32 a192, i32 a193, i32 a194, i32 a195, i32 a196, i32 a197, i32 a198, i32 a199, i32 a200, i32 a201, i32 a202, i32 a203, i32 a204, i32 a205, i32 a206, i32 a207, i32 a208, i32 a209, i32 a210, i32 a211, i32 a212, i32 a213, i32 a214, i32 a215, i32 a216, i32 a217, i32 a218, i32 a219, i32 a220, i32 a221, i32 a222, i32 a223, i32 a224, i32 a225, i32 a226, i32 a227, i32 a228, i32 a229, i32 a230, i32 a231, i32 a232, i32 a233, i32 a234, i32 a235, i32 a236, i32 a237, i32 a238, i32 a239, i32 a240, i32 a241, i32 a242, i32 a243, i32 a244, i32 a245, i32 a246, i32 a247, i32 a248, i32 a249, i32 a250, i32 a251, i32 a252, i32 a253, i32 a254, i32 a255, i32 a256) { 166 return.void 167 } 168 .function i32 main() { 169 call.range f1, v255 170 runner-options: [compile-only] 171 172 - file-name: uninitialized_values 173 bugid: ['1324'] 174 tags: ['verifier'] 175 runner-options: ['verifier-failure', 'verifier-debug-config'] 176 isa: 177 instructions: 178 - sig: call.range method_id, v:in:top 179 acc: out:top 180 format: [op_v_8_id_16] 181 description: Verifier should check usage of uninitialized arguments passed to function. 182 header-template: [] 183 code-template: | 184 .function void f1(%s) { 185 %s 186 return.void 187 } 188 .function i32 main() { 189 %s 190 call.range f1%s 191 check-type: exit-positive 192 193 # Template parameters: 194 # 1st argument is function arguments 195 # 2nd - usage of acc or reg 196 # 3rd - possible initialization of registers 197 # 4th - call parameters 198 cases: 199 - values: ['i32 a0', '', '', ', v0'] 200 - values: ['i32 a0, i32 a1, i32 a2, i32 a3', '', '', ', v0'] 201 - values: ['i32 a0, f64 a1, i64 a2, i32 a3', '', '', ', v0'] 202 - values: ['i32 a0, i32 a1', '', 'movi v0, 0', ', v0'] 203 description: Check if several registers in 'call.range' is uninitialized. 204 - values: ['i32 a0, f64 a1, i64 a2, i32 a3', '', 'movi v0, 0', ', v0'] 205 description: Check if several registers in 'call.range' is uninitialized. 206 - values: 207 - '' 208 - | 209 # 210 lda a3 211 lda a4 212 - '' 213 - '' 214 description: Check usage of undefined parameter. 215 runner-options: [compile-failure] 216 217 - file-name: uninitialized_reg_no_arg 218 bugid: ['1324'] 219 tags: ['verifier'] 220 runner-options: ['verifier-failure', 'verifier-debug-config'] 221 isa: 222 instructions: 223 - sig: call.range method_id, v:in:top 224 acc: out:top 225 format: [op_v_8_id_16] 226 description: Verifier should check usage of uninitialized registers in function. 227 header-template: [] 228 code-template: | 229 .function void f1() { 230 %s 231 return.void 232 } 233 .function i32 main() { 234 %s 235 movi v2, 0 236 call.range f1, v2 237 check-type: exit-positive 238 cases: 239 - values: 240 - lda v0 241 - movi v0, 123 242 - values: 243 - lda v1 244 - movi v1, 123 245 - values: 246 - lda.64 v0 247 - movi.64 v0, 0xFFFFFFFFFFFFFFFF 248 - values: 249 - lda.64 v1 250 - movi.64 v1, 0xFFFFFFFFFFFFFFFF 251 - values: 252 - lda.64 v0 253 - fmovi.64 v0, 3.1415926535 254 - values: 255 - lda.64 v1 256 - movi.64 v1, 0xFFFFFFFFFFFFFFFF 257 - values: 258 - lda.obj v0 259 - | 260 # 261 lda.str "some string" 262 sta.obj v0 263 - values: 264 - lda.obj v1 265 - | 266 # 267 lda.str "some string" 268 sta.obj v1 269 270 - file-name: args_type_mismatch 271 bugid: ['1324'] 272 tags: ['verifier'] 273 runner-options: ['verifier-failure', 'verifier-debug-config'] 274 isa: 275 instructions: 276 - sig: call.range method_id, v:in:top 277 acc: out:top 278 format: [op_v_8_id_16] 279 description: Check 'call.range' when argument type of function and instuction mismatch. 280 header-template: [] 281 code-template: | 282 %s 283 .function void f1(%s) { 284 return.void 285 } 286 .function i32 main() { 287 %s 288 call.range f1, v0 289 check-type: exit-positive 290 291 # Template parameters: 292 # 1 - type definitions 293 # 2 - function arguments 294 # 3 - possible initialization of registers 295 cases: 296 - values: ['', 'i32 a0', 'mov.null v0'] 297 - values: ['', 'i64 a0', 'mov.null v0'] 298 - values: ['', 'f64 a0', 'mov.null v0'] 299 - values: ['', 'i32 a0', 'movi.64 v0, 0'] 300 - values: ['', 'f64 a0', 'movi.64 v0, 0'] 301 - values: ['.record Obj {}', 'Obj a0', 'movi.64 v0, 0'] 302 - values: ['', 'i64 a0', 'movi v0, 0'] 303 - values: ['', 'f64 a0', 'movi v0, 0'] 304 - values: ['.record Obj {}', 'Obj a0', 'movi v0, 0'] 305 - values: 306 - | 307 # 308 .record Obj {} 309 310 .function void Obj.ctor(Obj a0) <ctor> { 311 return.void 312 } 313 - i32 a0 314 - | 315 # 316 initobj.short Obj.ctor 317 sta.obj v0 318 319 - values: 320 - | 321 # 322 .record Obj {} 323 324 .function void Obj.ctor(Obj a0) <ctor> { 325 return.void 326 } 327 - i64 a0 328 - | 329 # 330 initobj.short Obj.ctor 331 sta.obj v0 332 333 - file-name: reg_err 334 runner-options: [compile-failure] 335 isa: 336 instructions: 337 - sig: call.range method_id, v:in:top 338 acc: out:top 339 format: [op_v_8_id_16] 340 description: Check 'call.range' register number width. 341 header-template: [] 342 code-template: | 343 .function void f1(i32 a0) { 344 return.void 345 } 346 .function i32 main() { 347 call.range f1, %s 348 check-type: exit-positive 349 cases: 350 - values: ['1'] 351 - values: ['1.1'] 352 - values: ['0xFFFFFFFFFFFFFFFF'] 353 - values: ['"some string"'] 354 355 - file-name: arg_1_i32_acc 356 isa: 357 instructions: 358 - sig: call.range method_id, v:in:top 359 acc: out:top 360 format: [op_v_8_id_16] 361 description: Check correctness of passed arguments. Load parameter to accumulator. Check i32 type of arguments. 362 header-template: [] 363 code-template: | 364 .function i32 f1(i32 a0) { 365 lda a0 366 movi v1, %s 367 jne v1, exit_failure 368 ldai 0 369 return 370 exit_failure: 371 ldai 1 372 return 373 } 374 .function i32 main() { 375 movi v0, %s 376 call.range f1, v0 377 378 check-type: no-check 379 cases: 380 - values: ["0", "0"] 381 - values: ["1", "1"] 382 - values: ["1234567", "1234567"] 383 - values: ["0x7FFFFFFF", "0x7FFFFFFF"] 384 - values: ["0x80000000", "0x80000000"] 385 - values: ["0x9ABCDEF0", "0x9ABCDEF0"] 386 - values: ["0xFFFFFFFF", "0xFFFFFFFF"] 387 388 - file-name: arg_1_f64_acc 389 isa: 390 instructions: 391 - sig: call.range method_id, v:in:top 392 acc: out:top 393 format: [op_v_8_id_16] 394 description: Check correctness of passed arguments. Load parameter to accumulator. Check f64 type of arguments. 395 header-template: [] 396 code-template: | 397 .function i32 f1(f64 a0) { 398 lda.64 a0 399 fmovi.64 v1, %s 400 fcmpg.64 v1 401 return 402 } 403 .function i32 main() { 404 fmovi.64 v0, %s 405 call.range f1, v0 406 check-type: no-check 407 cases: 408 - values: ["0", "0"] 409 - values: ["1.1", "1.1"] 410 - values: ["0x7ff0000000000000", "0x7ff0000000000000"] 411 - values: ["0xfff0000000000000", "0xfff0000000000000"] 412 - values: ["0x7fefffffffffffff", "0x7fefffffffffffff"] 413 - values: ["0xffefffffffffffff", "0xffefffffffffffff"] 414 - values: ["100e100", "100e100"] 415 416 - file-name: arg_1_i32_reg 417 isa: 418 instructions: 419 - sig: call.range method_id, v:in:top 420 acc: out:top 421 format: [op_v_8_id_16] 422 description: Check correctness of passed arguments. Load parameter to register. Check i32 type of arguments. 423 header-template: [] 424 code-template: | 425 .function i32 f1(i32 a0) { 426 mov v1, a0 427 ldai %s 428 jne v1, exit_failure 429 ldai 0 430 return 431 exit_failure: 432 ldai 1 433 return 434 } 435 .function i32 main() { 436 movi v0, %s 437 call.range f1, v0 438 check-type: no-check 439 cases: 440 - values: ["0", "0"] 441 - values: ["1", "1"] 442 - values: ["1234567", "1234567"] 443 - values: ["0x7FFFFFFF", "0x7FFFFFFF"] 444 - values: ["0x80000000", "0x80000000"] 445 - values: ["0x9ABCDEF0", "0x9ABCDEF0"] 446 - values: ["0xFFFFFFFF", "0xFFFFFFFF"] 447 448 - file-name: arg_1_f64_reg 449 isa: 450 instructions: 451 - sig: call.range method_id, v:in:top 452 acc: out:top 453 format: [op_v_8_id_16] 454 description: Check correctness of passed arguments. Load parameter to register. Check f64 type of arguments. 455 header-template: [] 456 code-template: | 457 .function i32 f1(f64 a0) { 458 mov.64 v1, a0 459 fldai.64 %s 460 fcmpg.64 v1 461 return 462 } 463 .function i32 main() { 464 fmovi.64 v0, %s 465 call.range f1, v0 466 check-type: no-check 467 cases: 468 - values: ["0", "0"] 469 - values: ["1.1", "1.1"] 470 - values: ["0x7ff0000000000000", "0x7ff0000000000000"] 471 - values: ["0xfff0000000000000", "0xfff0000000000000"] 472 - values: ["0x7fefffffffffffff", "0x7fefffffffffffff"] 473 - values: ["0xffefffffffffffff", "0xffefffffffffffff"] 474 - values: ["100e100", "100e100"] 475 476 - file-name: arg_2_i32_acc 477 isa: 478 instructions: 479 - sig: call.range method_id, v:in:top 480 acc: out:top 481 format: [op_v_8_id_16] 482 description: Check correctness of passed arguments. Load parameter to accumulator. Check i32 type of arguments. 483 header-template: [] 484 code-template: | 485 .function i32 f1(i32 a0, i32 a1, i32 a2, i32 a3) { 486 lda a0 487 movi v1, %s 488 jeq v1, f1_check1 489 # 1st arg does not match, exit 490 ldai 1 491 return 492 f1_check1: 493 lda a1 494 movi v1, %s 495 jeq v1, f1_check2 496 ldai 1 497 return 498 f1_check2: 499 lda a2 500 movi v1, %s 501 jeq v1, f1_check3 502 ldai 1 503 return 504 f1_check3: 505 lda a3 506 movi v1, %s 507 jne v1, exit_failure 508 ldai 0 509 return 510 exit_failure: 511 ldai 1 512 return 513 } 514 .function i32 main() { 515 movi v0, %s 516 movi v1, %s 517 movi v2, %s 518 movi v3, %s 519 call.range f1, v0 520 521 check-type: no-check 522 cases: 523 - values: ["0", "0", "0", "0", "0", "0", "0", "0"] 524 - values: ["0", "1", "2", "3", "0", "1", "2", "3"] 525 - values: ["-3", "-2", "-1", "0", "-3", "-2", "-1", "0"] 526 - values: ["0", "1234567", "89101112", "13141516", "0", "1234567", "89101112", "13141516"] 527 - values: ["0x7FFFFFFF", "0x7FFFFFFF", "0x7FFFFFFF", "0x7FFFFFFF", "0x7FFFFFFF", "0x7FFFFFFF", "0x7FFFFFFF", "0x7FFFFFFF"] 528 - values: ["0", "0x80000000", "0", "0x80000000", "0", "0x80000000", "0", "0x80000000"] 529 - values: ["0x80000000", "0", "0x80000000", "0", "0x80000000", "0", "0x80000000", "0"] 530 - values: ["0x80000000", "0x80000000", "0x80000000", "0x80000000", "0x80000000", "0x80000000", "0x80000000", "0x80000000"] 531 - values: ["0x9ABCDEF0", "0xFEDCBA09", "0x87654321", "0x12345678", "0x9ABCDEF0", "0xFEDCBA09", "0x87654321", "0x12345678"] 532 - values: ["0", "0xFFFFFFFF", "0", "0xFFFFFFFF", "0", "0xFFFFFFFF", "0", "0xFFFFFFFF"] 533 - values: ["0xFFFFFFFF", "0", "0xFFFFFFFF", "0", "0xFFFFFFFF", "0", "0xFFFFFFFF", "0"] 534 - values: ["0xFFFFFFFF", "0xFFFFFFFF", "0xFFFFFFFF", "0xFFFFFFFF", "0xFFFFFFFF", "0xFFFFFFFF", "0xFFFFFFFF", "0xFFFFFFFF"] 535 536 - file-name: arg_2_i32_reg 537 isa: 538 instructions: 539 - sig: call.range method_id, v:in:top 540 acc: out:top 541 format: [op_v_8_id_16] 542 description: Check correctness of passed arguments. Load parameter to register. Check i32 type of arguments. 543 header-template: [] 544 code-template: | 545 .function i32 f1(i32 a0, i32 a1, i32 a2, i32 a3) { 546 mov v1, a0 547 ldai %s 548 jeq v1, f1_check1 549 # 1st arg does not match, exit 550 ldai 1 551 return 552 f1_check1: 553 mov v1, a1 554 ldai %s 555 jeq v1, f1_check2 556 # 1st arg does not match, exit 557 ldai 1 558 return 559 f1_check2: 560 mov v1, a2 561 ldai %s 562 jeq v1, f1_check3 563 # 1st arg does not match, exit 564 ldai 1 565 return 566 f1_check3: 567 mov v1, a3 568 ldai %s 569 jne v1, exit_failure 570 ldai 0 571 return 572 exit_failure: 573 ldai 1 574 return 575 } 576 .function i32 main() { 577 movi v0, %s 578 movi v1, %s 579 movi v2, %s 580 movi v3, %s 581 call.range f1, v0 582 check-type: no-check 583 cases: 584 - values: ["0", "0", "0", "0", "0", "0", "0", "0"] 585 - values: ["0", "1", "2", "3", "0", "1", "2", "3"] 586 - values: ["-3", "-2", "-1", "0", "-3", "-2", "-1", "0"] 587 - values: ["0", "1234567", "89101112", "13141516", "0", "1234567", "89101112", "13141516"] 588 - values: ["0x7FFFFFFF", "0x7FFFFFFF", "0x7FFFFFFF", "0x7FFFFFFF", "0x7FFFFFFF", "0x7FFFFFFF", "0x7FFFFFFF", "0x7FFFFFFF"] 589 - values: ["0", "0x80000000", "0", "0x80000000", "0", "0x80000000", "0", "0x80000000"] 590 - values: ["0x80000000", "0", "0x80000000", "0", "0x80000000", "0", "0x80000000", "0"] 591 - values: ["0x80000000", "0x80000000", "0x80000000", "0x80000000", "0x80000000", "0x80000000", "0x80000000", "0x80000000"] 592 - values: ["0x9ABCDEF0", "0xFEDCBA09", "0x87654321", "0x12345678", "0x9ABCDEF0", "0xFEDCBA09", "0x87654321", "0x12345678"] 593 - values: ["0", "0xFFFFFFFF", "0", "0xFFFFFFFF", "0", "0xFFFFFFFF", "0", "0xFFFFFFFF"] 594 - values: ["0xFFFFFFFF", "0", "0xFFFFFFFF", "0", "0xFFFFFFFF", "0", "0xFFFFFFFF", "0"] 595 - values: ["0xFFFFFFFF", "0xFFFFFFFF", "0xFFFFFFFF", "0xFFFFFFFF", "0xFFFFFFFF", "0xFFFFFFFF", "0xFFFFFFFF", "0xFFFFFFFF"] 596 597 - file-name: arg_2_f64_acc 598 isa: 599 instructions: 600 - sig: call.range method_id, v:in:top 601 acc: out:top 602 format: [op_v_8_id_16] 603 description: Check correctness of passed arguments. Load parameter to accumulator. Check f64 type of arguments. 604 header-template: [] 605 code-template: | 606 .function i32 f1(f64 a0, f64 a1, f64 a2, f64 a3) { 607 lda.64 a0 608 fmovi.64 v1, %s 609 fcmpg.64 v1 610 jeqz f1_check1 611 # 1st arg does not match, exit 612 ldai 1 613 return 614 f1_check1: 615 lda.64 a1 616 fmovi.64 v1, %s 617 fcmpg.64 v1 618 jeqz f1_check2 619 ldai 1 620 return 621 f1_check2: 622 lda.64 a2 623 fmovi.64 v1, %s 624 fcmpg.64 v1 625 jeqz f1_check3 626 ldai 1 627 return 628 f1_check3: 629 lda.64 a3 630 fmovi.64 v1, %s 631 fcmpg.64 v1 632 return 633 } 634 .function i32 main() { 635 fmovi.64 v0, %s 636 fmovi.64 v1, %s 637 fmovi.64 v2, %s 638 fmovi.64 v3, %s 639 call.range f1, v0 640 check-type: no-check 641 cases: 642 - values: ["0", "0", "0", "0", "0", "0", "0", "0"] 643 - values: ["1.2", "1.1", "1.3", "1.4", "1.2", "1.1", "1.3", "1.4"] 644 - values: ["0x7ff0000000000000", "0xfff0000000000000", "0x0000000000000001", "0x8000000000000001", "0x7ff0000000000000", "0xfff0000000000000", "0x0000000000000001", "0x8000000000000001"] 645 - values: ["0xffefffffffffffff", "0x7fefffffffffffff", "3.1415926535", "3.1415926535e89", "0xffefffffffffffff", "0x7fefffffffffffff", "3.1415926535", "3.1415926535e89"] 646 - values: ["100e100", "200e200", "-50e-50", "123e123", "100e100", "200e200", "-50e-50", "123e123"] 647 648 - file-name: arg_2_f64_reg 649 isa: 650 instructions: 651 - sig: call.range method_id, v:in:top 652 acc: out:top 653 format: [op_v_8_id_16] 654 description: Check correctness of passed arguments. Load parameter to register. Check f64 type of arguments. 655 tags: ['tsan'] 656 header-template: [] 657 code-template: | 658 .function i32 f1(f64 a0, f64 a1, f64 a2, f64 a3) { 659 mov.64 v1, a0 660 fldai.64 %s 661 fcmpg.64 v1 662 jeqz f1_check1 663 # 1st arg does not match, exit 664 ldai 1 665 return 666 f1_check1: 667 mov.64 v1, a1 668 fldai.64 %s 669 fcmpg.64 v1 670 jeqz f1_check2 671 # 1st arg does not match, exit 672 ldai 1 673 return 674 f1_check2: 675 mov.64 v1, a2 676 fldai.64 %s 677 fcmpg.64 v1 678 jeqz f1_check3 679 # 1st arg does not match, exit 680 ldai 1 681 return 682 f1_check3: 683 mov.64 v1, a3 684 fldai.64 %s 685 fcmpg.64 v1 686 return 687 } 688 .function i32 main() { 689 fmovi.64 v0, %s 690 fmovi.64 v1, %s 691 fmovi.64 v2, %s 692 fmovi.64 v3, %s 693 call.range f1, v0 694 check-type: no-check 695 cases: 696 - values: ["0", "0", "0", "0", "0", "0", "0", "0"] 697 - values: ["1.2", "1.1", "1.3", "1.4", "1.2", "1.1", "1.3", "1.4"] 698 - values: ["0x7ff0000000000000", "0xfff0000000000000", "0x0000000000000001", "0x8000000000000001", "0x7ff0000000000000", "0xfff0000000000000", "0x0000000000000001", "0x8000000000000001"] 699 - values: ["0xffefffffffffffff", "0x7fefffffffffffff", "3.1415926535", "3.1415926535e89", "0xffefffffffffffff", "0x7fefffffffffffff", "3.1415926535", "3.1415926535e89"] 700 - values: ["100e100", "200e200", "-50e-50", "123e123", "100e100", "200e200", "-50e-50", "123e123"] 701 702 - file-name: arg_1_i64_acc 703 isa: 704 instructions: 705 - sig: call.range method_id, v:in:top 706 acc: out:top 707 format: [op_v_8_id_16] 708 description: Check correctness of passed arguments. Load parameter to accumulator. Check i64 type of arguments. 709 header-template: [] 710 code-template: | 711 .function i32 f1(i64 a0) { 712 lda.64 a0 713 movi.64 v1, %s 714 cmp.64 v1 715 return 716 } 717 .function i32 main() { 718 movi.64 v0, %s 719 call.range f1, v0 720 721 check-type: no-check 722 cases: 723 - values: ["0", "0"] 724 - values: ["1", "1"] 725 - values: ["0x1234567890ABCDEF", "0x1234567890ABCDEF"] 726 - values: ["0x7FFFFFFFFFFFFFFF", "0x7FFFFFFFFFFFFFFF"] 727 - values: ["0x8000000000000000", "0x8000000000000000"] 728 - values: ["0xFEDCBA0987654321", "0xFEDCBA0987654321"] 729 - values: ["0xFFFFFFFFFFFFFFFF", "0xFFFFFFFFFFFFFFFF"] 730 731 - file-name: arg_1_i64_reg 732 isa: 733 instructions: 734 - sig: call.range method_id, v:in:top 735 acc: out:top 736 format: [op_v_8_id_16] 737 description: Check correctness of passed arguments. Load parameter to accumulator. Check i64 type of arguments. 738 header-template: [] 739 code-template: | 740 .function i32 f1(i64 a0) { 741 mov.64 v1, a0 742 ldai.64 %s 743 cmp.64 v1 744 return 745 } 746 .function i32 main() { 747 movi.64 v0, %s 748 call.range f1, v0 749 750 check-type: no-check 751 cases: 752 - values: ["0", "0"] 753 - values: ["1", "1"] 754 - values: ["0x1234567890ABCDEF", "0x1234567890ABCDEF"] 755 - values: ["0x7FFFFFFFFFFFFFFF", "0x7FFFFFFFFFFFFFFF"] 756 - values: ["0x8000000000000000", "0x8000000000000000"] 757 - values: ["0xFEDCBA0987654321", "0xFEDCBA0987654321"] 758 - values: ["0xFFFFFFFFFFFFFFFF", "0xFFFFFFFFFFFFFFFF"] 759 760 - file-name: arg_2_i64_acc 761 isa: 762 instructions: 763 - sig: call.range method_id, v:in:top 764 acc: out:top 765 format: [op_v_8_id_16] 766 description: Check correctness of passed arguments. Load parameter to accumulator. 767 header-template: [] 768 code-template: | 769 .function i32 f1(i64 a0, i64 a1, i64 a2, i64 a3) { 770 lda.64 a0 771 movi.64 v1, %s 772 cmp.64 v1 773 jeqz f1_check1 774 # 1st arg does not match, exit 775 ldai 1 776 return 777 f1_check1: 778 lda.64 a1 779 movi.64 v1, %s 780 cmp.64 v1 781 jeqz f1_check2 782 # 1st arg does not match, exit 783 ldai 1 784 return 785 f1_check2: 786 lda.64 a2 787 movi.64 v1, %s 788 cmp.64 v1 789 jeqz f1_check3 790 # 1st arg does not match, exit 791 ldai 1 792 return 793 f1_check3: 794 lda.64 a3 795 movi.64 v1, %s 796 cmp.64 v1 797 return 798 } 799 .function i32 main() { 800 movi.64 v0, %s 801 movi.64 v1, %s 802 movi.64 v2, %s 803 movi.64 v3, %s 804 call.range f1, v0 805 806 check-type: no-check 807 cases: 808 - values: ["0", "0", "0", "0", "0", "0", "0", "0"] 809 - values: ["0", "1", "0", "1", "0", "1", "0", "1"] 810 - values: ["1", "0", "1", "0", "1", "0", "1", "0"] 811 - values: ["0x1234567890ABCDEF", "0x234567890ABCDEF1", "0x34567890ABCDEF12", "0x4567890ABCDEF123", "0x1234567890ABCDEF", "0x234567890ABCDEF1", "0x34567890ABCDEF12", "0x4567890ABCDEF123"] 812 - values: ["0x7FFFFFFFFFFFFFFF", "0", "0x7FFFFFFFFFFFFFFF", "0", "0x7FFFFFFFFFFFFFFF", "0", "0x7FFFFFFFFFFFFFFF", "0"] 813 - values: ["0x8000000000000000", "0x8000000000000000", "0x8000000000000000", "0x8000000000000000", "0x8000000000000000", "0x8000000000000000", "0x8000000000000000", "0x8000000000000000"] 814 - values: ["0xFEDCBA0987654321", "0xEDCBA0987654321F", "0xDCBA0987654321FE", "0xCBA0987654321FED", "0xFEDCBA0987654321", "0xEDCBA0987654321F", "0xDCBA0987654321FE", "0xCBA0987654321FED"] 815 816 - file-name: arg_2_i64_reg 817 isa: 818 instructions: 819 - sig: call.range method_id, v:in:top 820 acc: out:top 821 format: [op_v_8_id_16] 822 description: Check correctness of passed arguments. Load parameter to register. Check i64 type of arguments. 823 tags: ['tsan'] 824 header-template: [] 825 code-template: | 826 .function i32 f1(i64 a0, i64 a1, i64 a2, i64 a3) { 827 mov.64 v1, a0 828 ldai.64 %s 829 cmp.64 v1 830 jeqz f1_check1 831 # 1st arg does not match, exit 832 ldai 1 833 return 834 f1_check1: 835 mov.64 v1, a1 836 ldai.64 %s 837 cmp.64 v1 838 jeqz f1_check2 839 # 1st arg does not match, exit 840 ldai 1 841 return 842 f1_check2: 843 mov.64 v1, a2 844 ldai.64 %s 845 cmp.64 v1 846 jeqz f1_check3 847 # 1st arg does not match, exit 848 ldai 1 849 return 850 f1_check3: 851 852 mov.64 v1, a3 853 ldai.64 %s 854 cmp.64 v1 855 return 856 } 857 .function i32 main() { 858 movi.64 v0, %s 859 movi.64 v1, %s 860 movi.64 v2, %s 861 movi.64 v3, %s 862 call.range f1, v0 863 864 check-type: no-check 865 cases: 866 - values: ["0", "0", "0", "0", "0", "0", "0", "0"] 867 - values: ["0", "1", "0", "1", "0", "1", "0", "1"] 868 - values: ["1", "0", "1", "0", "1", "0", "1", "0"] 869 - values: ["0x1234567890ABCDEF", "0x234567890ABCDEF1", "0x34567890ABCDEF12", "0x4567890ABCDEF123", "0x1234567890ABCDEF", "0x234567890ABCDEF1", "0x34567890ABCDEF12", "0x4567890ABCDEF123"] 870 - values: ["0x7FFFFFFFFFFFFFFF", "0", "0x7FFFFFFFFFFFFFFF", "0", "0x7FFFFFFFFFFFFFFF", "0", "0x7FFFFFFFFFFFFFFF", "0"] 871 - values: ["0x8000000000000000", "0x8000000000000000", "0x8000000000000000", "0x8000000000000000", "0x8000000000000000", "0x8000000000000000", "0x8000000000000000", "0x8000000000000000"] 872 - values: ["0xFEDCBA0987654321", "0xEDCBA0987654321F", "0xDCBA0987654321FE", "0xCBA0987654321FED", "0xFEDCBA0987654321", "0xEDCBA0987654321F", "0xDCBA0987654321FE", "0xCBA0987654321FED"] 873 874 - file-name: arg_1_obj_acc 875 isa: 876 instructions: 877 - sig: call.range method_id, v:in:top 878 acc: out:top 879 format: [op_v_8_id_16] 880 description: Check correctness of passed arguments. Load parameter to accumulator. Check object type of arguments. 881 tags: ['tsan'] 882 header-template: [obj_ctor] 883 code-template: | 884 .function Obj fnc(Obj a0) { 885 lda.obj a0 886 return.obj 887 } 888 889 .function i32 main() { 890 %s 891 sta.obj v0 892 ldai 0 # acc is i32 893 call.range fnc, v0 # acc contains returned Obj 894 jne.obj v0, return_ne_num 895 ldai 0 896 return 897 return_ne_num: 898 ldai 1 899 return 900 901 check-type: no-check 902 cases: 903 - values: 904 - "lda.null" 905 - values: 906 - "initobj Obj.ctor" 907 908 - file-name: arg_2_obj_acc 909 isa: 910 instructions: 911 - sig: call.range method_id, v:in:top 912 acc: out:top 913 format: [op_v_8_id_16] 914 description: Check correctness of passed arguments. Load parameter to accumulator. Check object type. 915 header-template: [obj_ctor] 916 code-template: | 917 .record ObjTuple { 918 Obj o0 919 Obj o1 920 Obj o2 921 Obj o3 922 } 923 924 .function void ObjTuple.ctor(ObjTuple a0, Obj a1, Obj a2, Obj a3, Obj a4) <ctor> { 925 lda.obj a1 926 stobj.obj a0, ObjTuple.o0 927 lda.obj a2 928 stobj.obj a0, ObjTuple.o1 929 lda.obj a3 930 stobj.obj a0, ObjTuple.o2 931 lda.obj a4 932 stobj.obj a0, ObjTuple.o3 933 return.void 934 } 935 936 .function ObjTuple getObjTuple(Obj a0, Obj a1, Obj a2, Obj a3) { 937 mov.obj v0, a0 938 mov.obj v1, a1 939 mov.obj v2, a2 940 mov.obj v3, a3 941 initobj ObjTuple.ctor, v0, v1, v2, v3 942 return.obj 943 } 944 945 .function i32 main() { 946 %s 947 call.range getObjTuple, v0 948 sta.obj v4 949 950 # check ObjTuple.o0 contains correct value (v0) 951 ldobj.obj v4, ObjTuple.o0 952 jeq.obj v0, tuple_2_check_1 953 ldai 1 954 return 955 tuple_2_check_1: 956 # check ObjTuple.o1 contains correct value (v1) 957 ldobj.obj v4, ObjTuple.o1 958 jeq.obj v1, tuple_2_check_2 959 ldai 1 960 return 961 tuple_2_check_2: 962 # check ObjTuple.o2 contains correct value (v2) 963 ldobj.obj v4, ObjTuple.o2 964 jeq.obj v2, tuple_2_check_3 965 ldai 1 966 return 967 tuple_2_check_3: 968 # check ObjTuple.o3 contains correct value (v3) 969 ldobj.obj v4, ObjTuple.o3 970 jne.obj v3, return_ne_num 971 ldai 0 972 return 973 return_ne_num: 974 ldai 1 975 return 976 977 check-type: no-check 978 cases: 979 - values: 980 - | 981 # 982 mov.null v0 983 mov.null v1 984 mov.null v2 985 mov.null v3 986 - values: 987 - | 988 # 989 initobj.short Obj.ctor 990 sta.obj v0 991 initobj.short Obj.ctor 992 sta.obj v1 993 initobj.short Obj.ctor 994 sta.obj v2 995 initobj.short Obj.ctor 996 sta.obj v3 997 - values: 998 - | 999 # 1000 mov.null v0 1001 initobj.short Obj.ctor 1002 sta.obj v1 1003 initobj.short Obj.ctor 1004 sta.obj v2 1005 initobj.short Obj.ctor 1006 sta.obj v3 1007 - values: 1008 - | 1009 # 1010 initobj.short Obj.ctor 1011 sta.obj v0 1012 mov.null v1 1013 initobj.short Obj.ctor 1014 sta.obj v2 1015 initobj.short Obj.ctor 1016 sta.obj v3 1017 - values: 1018 - | 1019 # 1020 initobj.short Obj.ctor 1021 sta.obj v0 1022 initobj.short Obj.ctor 1023 sta.obj v1 1024 mov.null v2 1025 initobj.short Obj.ctor 1026 sta.obj v3 1027 - values: 1028 - | 1029 # 1030 initobj.short Obj.ctor 1031 sta.obj v0 1032 initobj.short Obj.ctor 1033 sta.obj v1 1034 initobj.short Obj.ctor 1035 sta.obj v2 1036 mov.null v3 1037 1038 - file-name: arg_2_str_acc 1039 isa: 1040 instructions: 1041 - sig: call.range method_id, v:in:top 1042 acc: out:top 1043 format: [op_v_8_id_16] 1044 description: Check correctness of passed arguments. Load parameter to accumulator. Check String type. 1045 tags: ['tsan'] 1046 header-template: [panda_string] 1047 code-template: | 1048 .record ObjTuple { 1049 panda.String o0 1050 panda.String o1 1051 panda.String o2 1052 panda.String o3 1053 } 1054 1055 .function void ObjTuple.ctor(ObjTuple a0, panda.String a1, panda.String a2, panda.String a3, panda.String a4) <ctor> { 1056 lda.obj a1 1057 stobj.obj a0, ObjTuple.o0 1058 lda.obj a2 1059 stobj.obj a0, ObjTuple.o1 1060 lda.obj a3 1061 stobj.obj a0, ObjTuple.o2 1062 lda.obj a4 1063 stobj.obj a0, ObjTuple.o3 1064 return.void 1065 } 1066 1067 .function ObjTuple getObjTuple(panda.String a0, panda.String a1, panda.String a2, panda.String a3) { 1068 mov.obj v0, a0 1069 mov.obj v1, a1 1070 mov.obj v2, a2 1071 mov.obj v3, a3 1072 initobj ObjTuple.ctor, v0, v1, v2, v3 1073 return.obj 1074 } 1075 1076 .function i32 main() { 1077 %s 1078 call.range getObjTuple, v0 1079 sta.obj v4 1080 1081 # check ObjTuple.o0 contains correct value (v0) 1082 ldobj.obj v4, ObjTuple.o0 1083 jeq.obj v0, tuple_2_check_1 1084 ldai 1 1085 return 1086 tuple_2_check_1: 1087 # check ObjTuple.o1 contains correct value (v1) 1088 ldobj.obj v4, ObjTuple.o1 1089 jeq.obj v1, tuple_2_check_2 1090 ldai 1 1091 return 1092 tuple_2_check_2: 1093 # check ObjTuple.o2 contains correct value (v2) 1094 ldobj.obj v4, ObjTuple.o2 1095 jeq.obj v2, tuple_2_check_3 1096 ldai 1 1097 return 1098 tuple_2_check_3: 1099 # check ObjTuple.o3 contains correct value (v3) 1100 ldobj.obj v4, ObjTuple.o3 1101 jne.obj v3, return_ne_num 1102 ldai 0 1103 return 1104 return_ne_num: 1105 ldai 1 1106 return 1107 1108 check-type: no-check 1109 cases: 1110 - values: 1111 - | 1112 # 1113 mov.null v0 1114 mov.null v1 1115 mov.null v2 1116 mov.null v3 1117 - values: 1118 - | 1119 # 1120 lda.str "some string 1" 1121 sta.obj v0 1122 lda.str "some string 2" 1123 sta.obj v1 1124 lda.str "some string 3" 1125 sta.obj v2 1126 lda.str "some string 4" 1127 sta.obj v3 1128 - values: 1129 - | 1130 # 1131 mov.null v0 1132 lda.str "some string 2" 1133 sta.obj v1 1134 lda.str "some string 3" 1135 sta.obj v2 1136 lda.str "some string 4" 1137 sta.obj v3 1138 - values: 1139 - | 1140 # 1141 lda.str "some string 1" 1142 sta.obj v0 1143 mov.null v1 1144 lda.str "some string 3" 1145 sta.obj v2 1146 lda.str "some string 4" 1147 sta.obj v3 1148 - values: 1149 - | 1150 # 1151 lda.str "some string 1" 1152 sta.obj v0 1153 lda.str "some string 2" 1154 sta.obj v1 1155 mov.null v2 1156 lda.str "some string 4" 1157 sta.obj v3 1158 - values: 1159 - | 1160 # 1161 lda.str "some string 1" 1162 sta.obj v0 1163 lda.str "some string 2" 1164 sta.obj v1 1165 lda.str "some string 3" 1166 sta.obj v2 1167 mov.null v3 1168 1169 - file-name: method_id_not_static_p 1170 tags: ['verifier'] 1171 bugid: ['3247'] 1172 runner-options: ['verifier-failure', 'verifier-debug-config'] 1173 isa: 1174 instructions: 1175 - sig: call.range method_id, v:in:top 1176 acc: out:top 1177 format: [op_v_8_id_16] 1178 verification: 1179 - method_id_static 1180 - method_id_non_abstract 1181 description: Method_id must resolve to a static method in Panda Assembly context. Not static methods should be rejected by verifier. 1182 header-template: [] 1183 code-template: | 1184 .record A {} 1185 1186 .function void A.ctor(A a0) <ctor> { 1187 return.void 1188 } 1189 1190 .function i32 A.foo(A a0%s) *s 1191 1192 .function i32 main() { 1193 initobj A.ctor 1194 sta.obj v0 1195 %s 1196 call.range A.foo, v0 1197 check-type: exit-positive 1198 cases: 1199 - values: 1200 - | 1201 { 1202 ldai 0 1203 return 1204 } 1205 ignore: true 1206 - values: ['<noimpl>'] 1207 ignore: true 1208 - values: 1209 - | 1210 <static> { 1211 ldai 0 1212 return 1213 } 1214 runner-options: ['verifier-only', 'verifier-debug-config'] 1215 template-cases: 1216 - values: ['', '##-'] 1217 - values: [', A a1', 'mov.obj v1, v0'] 1218 1219