[WebAssembly] Fix encoding of non-SIMD vector-typed instructions

Previously SIMD_I was the same as a normal instruction except for the
addition of a HasSIM128 predicate. However, rL339186 changed the
encoding of SIMD_I instructions to automatically contain the SIMD
prefix byte. This broke the encoding of non-SIMD vector-typed
instructions, which had instantiated SIMD_I. This CL corrects this
error.

Reviewers: aheejin

Subscribers: sunfish, jgravelle-google, sbc100, llvm-commits

Differential Revision: https://reviews.llvm.org/D50682

Patch by Thomas Lively (tlively)

llvm-svn: 339710
This commit is contained in:
Heejin Ahn 2018-08-14 19:03:36 +00:00
parent a1e55d252e
commit c9c711a0ac
2 changed files with 32 additions and 29 deletions

View File

@ -52,34 +52,35 @@ multiclass CALL<WebAssemblyRegClass vt, string prefix> {
}
multiclass SIMD_CALL<ValueType vt, string prefix> {
defm CALL_#vt : SIMD_I<(outs V128:$dst), (ins function32_op:$callee,
variable_ops),
(outs), (ins function32_op:$callee),
[(set (vt V128:$dst),
(WebAssemblycall1 (i32 imm:$callee)))],
!strconcat(prefix, "call\t$dst, $callee"),
!strconcat(prefix, "call\t$callee"),
0x10>;
defm CALL_#vt : I<(outs V128:$dst), (ins function32_op:$callee, variable_ops),
(outs), (ins function32_op:$callee),
[(set (vt V128:$dst),
(WebAssemblycall1 (i32 imm:$callee)))],
!strconcat(prefix, "call\t$dst, $callee"),
!strconcat(prefix, "call\t$callee"),
0x10>,
Requires<[HasSIMD128]>;
let isCodeGenOnly = 1 in {
defm PCALL_INDIRECT_#vt : SIMD_I<(outs V128:$dst),
(ins I32:$callee, variable_ops),
(outs), (ins I32:$callee),
[(set (vt V128:$dst),
(WebAssemblycall1 I32:$callee))],
"PSEUDO CALL INDIRECT\t$callee",
"PSEUDO CALL INDIRECT\t$callee">;
defm PCALL_INDIRECT_#vt : I<(outs V128:$dst),
(ins I32:$callee, variable_ops),
(outs), (ins I32:$callee),
[(set (vt V128:$dst),
(WebAssemblycall1 I32:$callee))],
"PSEUDO CALL INDIRECT\t$callee",
"PSEUDO CALL INDIRECT\t$callee">,
Requires<[HasSIMD128]>;
} // isCodeGenOnly = 1
defm CALL_INDIRECT_#vt : SIMD_I<(outs V128:$dst),
(ins TypeIndex:$type, i32imm:$flags,
variable_ops),
(outs), (ins TypeIndex:$type, i32imm:$flags),
[],
!strconcat(prefix,
"call_indirect\t$dst"),
!strconcat(prefix, "call_indirect\t$type"),
0x11>;
defm CALL_INDIRECT_#vt : I<(outs V128:$dst),
(ins TypeIndex:$type, i32imm:$flags, variable_ops),
(outs), (ins TypeIndex:$type, i32imm:$flags),
[],
!strconcat(prefix, "call_indirect\t$dst"),
!strconcat(prefix, "call_indirect\t$type"),
0x11>,
Requires<[HasSIMD128]>;
}
let Uses = [SP32, SP64], isCall = 1 in {

View File

@ -103,14 +103,16 @@ multiclass RETURN<WebAssemblyRegClass vt> {
}
multiclass SIMD_RETURN<ValueType vt> {
defm RETURN_#vt : SIMD_I<(outs), (ins V128:$val), (outs), (ins),
[(WebAssemblyreturn (vt V128:$val))],
"return \t$val", "return", 0x0f>;
defm RETURN_#vt : I<(outs), (ins V128:$val), (outs), (ins),
[(WebAssemblyreturn (vt V128:$val))],
"return \t$val", "return", 0x0f>,
Requires<[HasSIMD128]>;
// Equivalent to RETURN_#vt, for use at the end of a function when wasm
// semantics return by falling off the end of the block.
let isCodeGenOnly = 1 in
defm FALLTHROUGH_RETURN_#vt : SIMD_I<(outs), (ins V128:$val), (outs), (ins),
[]>;
defm FALLTHROUGH_RETURN_#vt : I<(outs), (ins V128:$val), (outs), (ins),
[]>,
Requires<[HasSIMD128]>;
}
let isTerminator = 1, hasCtrlDep = 1, isBarrier = 1 in {