forked from OSchip/llvm-project
[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:
parent
a1e55d252e
commit
c9c711a0ac
|
@ -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 {
|
||||
|
|
|
@ -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 {
|
||||
|
|
Loading…
Reference in New Issue