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