xref: /linux/tools/perf/util/annotate-arch/annotate-mips.c (revision 07b972ff09f45cfb7acd20cd9b3769c6975bc434)
1*07b972ffSIan Rogers // SPDX-License-Identifier: GPL-2.0
2*07b972ffSIan Rogers #include <string.h>
3*07b972ffSIan Rogers #include <linux/compiler.h>
4*07b972ffSIan Rogers #include "../disasm.h"
5*07b972ffSIan Rogers 
6*07b972ffSIan Rogers static
7*07b972ffSIan Rogers const struct ins_ops *mips__associate_ins_ops(struct arch *arch, const char *name)
8*07b972ffSIan Rogers {
9*07b972ffSIan Rogers 	const struct ins_ops *ops = NULL;
10*07b972ffSIan Rogers 
11*07b972ffSIan Rogers 	if (!strncmp(name, "bal", 3) ||
12*07b972ffSIan Rogers 	    !strncmp(name, "bgezal", 6) ||
13*07b972ffSIan Rogers 	    !strncmp(name, "bltzal", 6) ||
14*07b972ffSIan Rogers 	    !strncmp(name, "bgtzal", 6) ||
15*07b972ffSIan Rogers 	    !strncmp(name, "blezal", 6) ||
16*07b972ffSIan Rogers 	    !strncmp(name, "beqzal", 6) ||
17*07b972ffSIan Rogers 	    !strncmp(name, "bnezal", 6) ||
18*07b972ffSIan Rogers 	    !strncmp(name, "bgtzl", 5) ||
19*07b972ffSIan Rogers 	    !strncmp(name, "bltzl", 5) ||
20*07b972ffSIan Rogers 	    !strncmp(name, "bgezl", 5) ||
21*07b972ffSIan Rogers 	    !strncmp(name, "blezl", 5) ||
22*07b972ffSIan Rogers 	    !strncmp(name, "jialc", 5) ||
23*07b972ffSIan Rogers 	    !strncmp(name, "beql", 4) ||
24*07b972ffSIan Rogers 	    !strncmp(name, "bnel", 4) ||
25*07b972ffSIan Rogers 	    !strncmp(name, "jal", 3))
26*07b972ffSIan Rogers 		ops = &call_ops;
27*07b972ffSIan Rogers 	else if (!strncmp(name, "jr", 2))
28*07b972ffSIan Rogers 		ops = &ret_ops;
29*07b972ffSIan Rogers 	else if (name[0] == 'j' || name[0] == 'b')
30*07b972ffSIan Rogers 		ops = &jump_ops;
31*07b972ffSIan Rogers 	else
32*07b972ffSIan Rogers 		return NULL;
33*07b972ffSIan Rogers 
34*07b972ffSIan Rogers 	arch__associate_ins_ops(arch, name, ops);
35*07b972ffSIan Rogers 
36*07b972ffSIan Rogers 	return ops;
37*07b972ffSIan Rogers }
38*07b972ffSIan Rogers 
39*07b972ffSIan Rogers int mips__annotate_init(struct arch *arch, char *cpuid __maybe_unused)
40*07b972ffSIan Rogers {
41*07b972ffSIan Rogers 	if (!arch->initialized) {
42*07b972ffSIan Rogers 		arch->associate_instruction_ops = mips__associate_ins_ops;
43*07b972ffSIan Rogers 		arch->initialized = true;
44*07b972ffSIan Rogers 		arch->objdump.comment_char = '#';
45*07b972ffSIan Rogers 	}
46*07b972ffSIan Rogers 
47*07b972ffSIan Rogers 	return 0;
48*07b972ffSIan Rogers }
49