
This adds WebAssembly support for the new [Lime1 CPU]. First, this defines some new target features. These are subsets of existing features that reflect implementation concerns: - "call-indirect-overlong" - implied by "reference-types"; just the overlong encoding for the `call_indirect` immediate, and not the actual reference types. - "bulk-memory-opt" - implied by "bulk-memory": just `memory.copy` and `memory.fill`, and not the other instructions in the bulk-memory proposal. Next, this defines a new target CPU, "lime1", which enables mutable-globals, bulk-memory-opt, multivalue, sign-ext, nontrapping-fptoint, extended-const, and call-indirect-overlong. Unlike the default "generic" CPU, "lime1" is meant to be frozen, and followed up by "lime2" and so on when new features are desired. [Lime1 CPU]: https://github.com/WebAssembly/tool-conventions/blob/main/Lime.md#lime1 --------- Co-authored-by: Heejin Ahn <aheejin@gmail.com>
124 lines
4.4 KiB
LLVM
124 lines
4.4 KiB
LLVM
; RUN: llc < %s -mcpu=mvp | FileCheck %s --check-prefixes MVP
|
|
; RUN: llc < %s -mcpu=generic | FileCheck %s --check-prefixes GENERIC
|
|
; RUN: llc < %s -mcpu=lime1 | FileCheck %s --check-prefixes LIME1
|
|
; RUN: llc < %s | FileCheck %s --check-prefixes GENERIC
|
|
; RUN: llc < %s -mcpu=bleeding-edge | FileCheck %s --check-prefixes BLEEDING-EDGE
|
|
|
|
; Test that the target features section contains the correct set of features
|
|
; depending on -mcpu= options.
|
|
|
|
target triple = "wasm32-unknown-unknown"
|
|
|
|
; mvp: should not contain the target features section
|
|
; MVP-NOT: .custom_section.target_features,"",@
|
|
|
|
; generic: +call-indirect-overlong, +multivalue, +mutable-globals, +reference-types, +sign-ext
|
|
; GENERIC-LABEL: .custom_section.target_features,"",@
|
|
; GENERIC-NEXT: .int8 8
|
|
; GENERIC-NEXT: .int8 43
|
|
; GENERIC-NEXT: .int8 11
|
|
; GENERIC-NEXT: .ascii "bulk-memory"
|
|
; GENERIC-NEXT: .int8 43
|
|
; GENERIC-NEXT: .int8 15
|
|
; GENERIC-NEXT: .ascii "bulk-memory-opt"
|
|
; GENERIC-NEXT: .int8 43
|
|
; GENERIC-NEXT: .int8 22
|
|
; GENERIC-NEXT: .ascii "call-indirect-overlong"
|
|
; GENERIC-NEXT: .int8 43
|
|
; GENERIC-NEXT: .int8 10
|
|
; GENERIC-NEXT: .ascii "multivalue"
|
|
; GENERIC-NEXT: .int8 43
|
|
; GENERIC-NEXT: .int8 15
|
|
; GENERIC-NEXT: .ascii "mutable-globals"
|
|
; GENERIC-NEXT: .int8 43
|
|
; GENERIC-NEXT: .int8 19
|
|
; GENERIC-NEXT: .ascii "nontrapping-fptoint"
|
|
; GENERIC-NEXT: .int8 43
|
|
; GENERIC-NEXT: .int8 15
|
|
; GENERIC-NEXT: .ascii "reference-types"
|
|
; GENERIC-NEXT: .int8 43
|
|
; GENERIC-NEXT: .int8 8
|
|
; GENERIC-NEXT: .ascii "sign-ext"
|
|
|
|
; lime1: +bulk-memory-opt, +call-indirect-overlong, +extended-const, +multivalue,
|
|
; +mutable-globals, +nontrapping-fptoint, +sign-ext
|
|
; LIME1-LABEL: .custom_section.target_features,"",@
|
|
; LIME1-NEXT: .int8 7
|
|
; LIME1-NEXT: .int8 43
|
|
; LIME1-NEXT: .int8 15
|
|
; LIME1-NEXT: .ascii "bulk-memory-opt"
|
|
; LIME1-NEXT: .int8 43
|
|
; LIME1-NEXT: .int8 22
|
|
; LIME1-NEXT: .ascii "call-indirect-overlong"
|
|
; LIME1-NEXT: .int8 43
|
|
; LIME1-NEXT: .int8 14
|
|
; LIME1-NEXT: .ascii "extended-const"
|
|
; LIME1-NEXT: .int8 43
|
|
; LIME1-NEXT: .int8 10
|
|
; LIME1-NEXT: .ascii "multivalue"
|
|
; LIME1-NEXT: .int8 43
|
|
; LIME1-NEXT: .int8 15
|
|
; LIME1-NEXT: .ascii "mutable-globals"
|
|
; LIME1-NEXT: .int8 43
|
|
; LIME1-NEXT: .int8 19
|
|
; LIME1-NEXT: .ascii "nontrapping-fptoint"
|
|
; LIME1-NEXT: .int8 43
|
|
; LIME1-NEXT: .int8 8
|
|
; LIME1-NEXT: .ascii "sign-ext"
|
|
|
|
; bleeding-edge: +atomics, +bulk-memory, +bulk-memory-opt,
|
|
; +call-indirect-overlong, +exception-handling,
|
|
; +extended-const, +fp16, +multimemory, +multivalue,
|
|
; +mutable-globals, +nontrapping-fptoint, +relaxed-simd,
|
|
; +reference-types, +simd128, +sign-ext, +tail-call
|
|
; BLEEDING-EDGE-LABEL: .section .custom_section.target_features,"",@
|
|
; BLEEDING-EDGE-NEXT: .int8 16
|
|
; BLEEDING-EDGE-NEXT: .int8 43
|
|
; BLEEDING-EDGE-NEXT: .int8 7
|
|
; BLEEDING-EDGE-NEXT: .ascii "atomics"
|
|
; BLEEDING-EDGE-NEXT: .int8 43
|
|
; BLEEDING-EDGE-NEXT: .int8 11
|
|
; BLEEDING-EDGE-NEXT: .ascii "bulk-memory"
|
|
; BLEEDING-EDGE-NEXT: .int8 43
|
|
; BLEEDING-EDGE-NEXT: .int8 15
|
|
; BLEEDING-EDGE-NEXT: .ascii "bulk-memory-opt"
|
|
; BLEEDING-EDGE-NEXT: .int8 43
|
|
; BLEEDING-EDGE-NEXT: .int8 22
|
|
; BLEEDING-EDGE-NEXT: .ascii "call-indirect-overlong"
|
|
; BLEEDING-EDGE-NEXT: .int8 43
|
|
; BLEEDING-EDGE-NEXT: .int8 18
|
|
; BLEEDING-EDGE-NEXT: .ascii "exception-handling"
|
|
; BLEEDING-EDGE-NEXT: .int8 43
|
|
; BLEEDING-EDGE-NEXT: .int8 14
|
|
; BLEEDING-EDGE-NEXT: .ascii "extended-const"
|
|
; BLEEDING-EDGE-NEXT: .int8 43
|
|
; BLEEDING-EDGE-NEXT: .int8 4
|
|
; BLEEDING-EDGE-NEXT: .ascii "fp16"
|
|
; BLEEDING-EDGE-NEXT: .int8 43
|
|
; BLEEDING-EDGE-NEXT: .int8 11
|
|
; BLEEDING-EDGE-NEXT: .ascii "multimemory"
|
|
; BLEEDING-EDGE-NEXT: .int8 43
|
|
; BLEEDING-EDGE-NEXT: .int8 10
|
|
; BLEEDING-EDGE-NEXT: .ascii "multivalue"
|
|
; BLEEDING-EDGE-NEXT: .int8 43
|
|
; BLEEDING-EDGE-NEXT: .int8 15
|
|
; BLEEDING-EDGE-NEXT: .ascii "mutable-globals"
|
|
; BLEEDING-EDGE-NEXT: .int8 43
|
|
; BLEEDING-EDGE-NEXT: .int8 19
|
|
; BLEEDING-EDGE-NEXT: .ascii "nontrapping-fptoint"
|
|
; BLEEDING-EDGE-NEXT: .int8 43
|
|
; BLEEDING-EDGE-NEXT: .int8 15
|
|
; BLEEDING-EDGE-NEXT: .ascii "reference-types"
|
|
; BLEEDING-EDGE-NEXT: .int8 43
|
|
; BLEEDING-EDGE-NEXT: .int8 12
|
|
; BLEEDING-EDGE-NEXT: .ascii "relaxed-simd"
|
|
; BLEEDING-EDGE-NEXT: .int8 43
|
|
; BLEEDING-EDGE-NEXT: .int8 8
|
|
; BLEEDING-EDGE-NEXT: .ascii "sign-ext"
|
|
; BLEEDING-EDGE-NEXT: .int8 43
|
|
; BLEEDING-EDGE-NEXT: .int8 7
|
|
; BLEEDING-EDGE-NEXT: .ascii "simd128"
|
|
; BLEEDING-EDGE-NEXT: .int8 43
|
|
; BLEEDING-EDGE-NEXT: .int8 9
|
|
; BLEEDING-EDGE-NEXT: .ascii "tail-call"
|