summaryrefslogtreecommitdiff
path: root/erts/emulator/beam/jit/arm/predicates.tab
diff options
context:
space:
mode:
Diffstat (limited to 'erts/emulator/beam/jit/arm/predicates.tab')
-rw-r--r--erts/emulator/beam/jit/arm/predicates.tab107
1 files changed, 107 insertions, 0 deletions
diff --git a/erts/emulator/beam/jit/arm/predicates.tab b/erts/emulator/beam/jit/arm/predicates.tab
new file mode 100644
index 0000000000..fc55441c28
--- /dev/null
+++ b/erts/emulator/beam/jit/arm/predicates.tab
@@ -0,0 +1,107 @@
+// -*- c -*-
+//
+// %CopyrightBegin%
+//
+// Copyright Ericsson AB 2020-2021. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+// %CopyrightEnd%
+//
+
+pred.is_mfa_bif(M, F, A) {
+ Export *e;
+
+ ASSERT(M.type == TAG_a && F.type == TAG_a && A.type == TAG_u);
+ e = erts_active_export_entry(M.val, F.val, A.val);
+
+ if (e != NULL) {
+ return e->bif_number != -1;
+ }
+
+ return 0;
+}
+
+pred.never_fails(Bif) {
+ static Eterm nofail_bifs[] =
+ {am_Neqeq,
+ am_Le,
+ am_Neq,
+ am_Eq,
+ am_Le,
+ am_Eqeq,
+ am_Gt,
+ am_Ge,
+ am_is_atom,
+ am_is_boolean,
+ am_is_binary,
+ am_is_bitstring,
+ am_is_float,
+ am_is_integer,
+ am_is_list,
+ am_is_map,
+ am_is_number,
+ am_is_pid,
+ am_is_port,
+ am_is_reference,
+ am_is_tuple,
+ };
+
+ Uint index = Bif.val;
+
+ if (Bif.type == TAG_u && index < S->beam.imports.count) {
+ BeamFile_ImportEntry *entry = &S->beam.imports.entries[index];
+ int i;
+
+ if (entry->module != am_erlang) {
+ return 0;
+ }
+
+ if (entry->function == am_is_function) {
+ /* Note that is_function/2 may fail. */
+ return entry->arity == 1;
+ }
+
+ for (i = 0; i < sizeof(nofail_bifs) / sizeof(nofail_bifs[0]); i++) {
+ if (entry->function == nofail_bifs[i]) {
+ return 1;
+ }
+ }
+ }
+ return 0;
+}
+
+pred.consecutive_words(A1, A2) {
+ return A1.type == A2.type && A1.val + 1 == A2.val;
+}
+pred.is_eq_exact_bif(Bif) {
+ Uint index = Bif.val;
+
+ if (Bif.type == TAG_u && index < S->beam.imports.count) {
+ BeamFile_ImportEntry *entry = &S->beam.imports.entries[index];
+
+ return entry->module == am_erlang && entry->function == am_Eq && entry->arity == 2;
+ }
+ return 0;
+}
+
+pred.is_ne_exact_bif(Bif) {
+ Uint index = Bif.val;
+
+ if (Bif.type == TAG_u && index < S->beam.imports.count) {
+ BeamFile_ImportEntry *entry = &S->beam.imports.entries[index];
+
+ return entry->module == am_erlang && entry->function == am_Neq && entry->arity == 2;
+ }
+ return 0;
+}