Skip to content

Commit 737c7b6

Browse files
committed
[GR-67557] Handle v128 values in the polymorphic select instruction.
PullRequest: graal/21945
2 parents 93f22d0 + 3194437 commit 737c7b6

File tree

4 files changed

+61
-3
lines changed

4 files changed

+61
-3
lines changed
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
int 1
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
;;
2+
;; Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved.
3+
;; DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4+
;;
5+
;; The Universal Permissive License (UPL), Version 1.0
6+
;;
7+
;; Subject to the condition set forth below, permission is hereby granted to any
8+
;; person obtaining a copy of this software, associated documentation and/or
9+
;; data (collectively the "Software"), free of charge and under any and all
10+
;; copyright rights in the Software, and any and all patent rights owned or
11+
;; freely licensable by each licensor hereunder covering either (i) the
12+
;; unmodified Software as contributed to or provided by such licensor, or (ii)
13+
;; the Larger Works (as defined below), to deal in both
14+
;;
15+
;; (a) the Software, and
16+
;;
17+
;; (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if
18+
;; one is included with the Software each a "Larger Work" to which the Software
19+
;; is contributed by such licensors),
20+
;;
21+
;; without restriction, including without limitation the rights to copy, create
22+
;; derivative works of, display, perform, and distribute the Software and make,
23+
;; use, sell, offer for sale, import, export, have made, and have sold the
24+
;; Software and the Larger Work(s), and to sublicense the foregoing rights on
25+
;; either these or other terms.
26+
;;
27+
;; This license is subject to the following condition:
28+
;;
29+
;; The above copyright notice and either this complete permission notice or at a
30+
;; minimum a reference to the UPL must be included in all copies or substantial
31+
;; portions of the Software.
32+
;;
33+
;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
34+
;; IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
35+
;; FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
36+
;; AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
37+
;; LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
38+
;; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
39+
;; SOFTWARE.
40+
;;
41+
(module
42+
(type $main_func_type (func (result i32)))
43+
(func $_main (export "_main") (type $main_func_type) (result i32)
44+
v128.const i32x4 1 2 3 4
45+
v128.const i32x4 5 6 7 8
46+
i32.const 1
47+
select
48+
i32x4.extract_lane 0
49+
return
50+
)
51+
)

wasm/src/org.graalvm.wasm.test/src/test/issue/wasm_test_index

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,3 +4,4 @@ issue-36944-blocks
44
issue-36944-loops
55
GR-54851-typeindex-oob
66
GR-54851-control-stack-empty
7+
GR-67557

wasm/src/org.graalvm.wasm/src/org/graalvm/wasm/BinaryParser.java

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -782,10 +782,15 @@ private CodeEntry readFunction(int functionIndex, byte[] locals, byte[] resultTy
782782
state.popChecked(I32_TYPE); // condition
783783
final byte t1 = state.pop(); // first operand
784784
final byte t2 = state.pop(); // second operand
785-
assertTrue(WasmType.isNumberType(t1) && WasmType.isNumberType(t2), Failure.TYPE_MISMATCH);
785+
assertTrue((WasmType.isNumberType(t1) || WasmType.isVectorType(t1)) && (WasmType.isNumberType(t2) || WasmType.isVectorType(t2)), Failure.TYPE_MISMATCH);
786786
assertTrue(t1 == t2 || t1 == WasmType.UNKNOWN_TYPE || t2 == WasmType.UNKNOWN_TYPE, Failure.TYPE_MISMATCH);
787-
state.push(t1 == WasmType.UNKNOWN_TYPE ? t2 : t1);
788-
state.addSelectInstruction(Bytecode.SELECT);
787+
final byte t = t1 == WasmType.UNKNOWN_TYPE ? t2 : t1;
788+
state.push(t);
789+
if (WasmType.isNumberType(t)) {
790+
state.addSelectInstruction(Bytecode.SELECT);
791+
} else {
792+
state.addSelectInstruction(Bytecode.SELECT_OBJ);
793+
}
789794
break;
790795
}
791796
case Instructions.SELECT_T: {

0 commit comments

Comments
 (0)