1dbdebdc5SRavi Bangoria static struct ins_ops *powerpc__associate_instruction_ops(struct arch *arch, const char *name) 2dbdebdc5SRavi Bangoria { 3dbdebdc5SRavi Bangoria int i; 4dbdebdc5SRavi Bangoria struct ins_ops *ops; 5dbdebdc5SRavi Bangoria 6dbdebdc5SRavi Bangoria /* 7dbdebdc5SRavi Bangoria * - Interested only if instruction starts with 'b'. 8dbdebdc5SRavi Bangoria * - Few start with 'b', but aren't branch instructions. 9dbdebdc5SRavi Bangoria */ 10dbdebdc5SRavi Bangoria if (name[0] != 'b' || 11dbdebdc5SRavi Bangoria !strncmp(name, "bcd", 3) || 12dbdebdc5SRavi Bangoria !strncmp(name, "brinc", 5) || 13dbdebdc5SRavi Bangoria !strncmp(name, "bper", 4)) 14dbdebdc5SRavi Bangoria return NULL; 15dbdebdc5SRavi Bangoria 16dbdebdc5SRavi Bangoria ops = &jump_ops; 17dbdebdc5SRavi Bangoria 18dbdebdc5SRavi Bangoria i = strlen(name) - 1; 19dbdebdc5SRavi Bangoria if (i < 0) 20dbdebdc5SRavi Bangoria return NULL; 21dbdebdc5SRavi Bangoria 22dbdebdc5SRavi Bangoria /* ignore optional hints at the end of the instructions */ 23dbdebdc5SRavi Bangoria if (name[i] == '+' || name[i] == '-') 24dbdebdc5SRavi Bangoria i--; 25dbdebdc5SRavi Bangoria 26dbdebdc5SRavi Bangoria if (name[i] == 'l' || (name[i] == 'a' && name[i-1] == 'l')) { 27dbdebdc5SRavi Bangoria /* 28dbdebdc5SRavi Bangoria * if the instruction ends up with 'l' or 'la', then 29dbdebdc5SRavi Bangoria * those are considered 'calls' since they update LR. 30dbdebdc5SRavi Bangoria * ... except for 'bnl' which is branch if not less than 31dbdebdc5SRavi Bangoria * and the absolute form of the same. 32dbdebdc5SRavi Bangoria */ 33dbdebdc5SRavi Bangoria if (strcmp(name, "bnl") && strcmp(name, "bnl+") && 34dbdebdc5SRavi Bangoria strcmp(name, "bnl-") && strcmp(name, "bnla") && 35dbdebdc5SRavi Bangoria strcmp(name, "bnla+") && strcmp(name, "bnla-")) 36dbdebdc5SRavi Bangoria ops = &call_ops; 37dbdebdc5SRavi Bangoria } 38dbdebdc5SRavi Bangoria if (name[i] == 'r' && name[i-1] == 'l') 39dbdebdc5SRavi Bangoria /* 40dbdebdc5SRavi Bangoria * instructions ending with 'lr' are considered to be 41dbdebdc5SRavi Bangoria * return instructions 42dbdebdc5SRavi Bangoria */ 43dbdebdc5SRavi Bangoria ops = &ret_ops; 44dbdebdc5SRavi Bangoria 45dbdebdc5SRavi Bangoria arch__associate_ins_ops(arch, name, ops); 46dbdebdc5SRavi Bangoria return ops; 47dbdebdc5SRavi Bangoria } 48dbdebdc5SRavi Bangoria 49dbdebdc5SRavi Bangoria static int powerpc__annotate_init(struct arch *arch) 50dbdebdc5SRavi Bangoria { 51dbdebdc5SRavi Bangoria if (!arch->initialized) { 52dbdebdc5SRavi Bangoria arch->initialized = true; 53dbdebdc5SRavi Bangoria arch->associate_instruction_ops = powerpc__associate_instruction_ops; 54dbdebdc5SRavi Bangoria arch->objdump.comment_char = '#'; 55dbdebdc5SRavi Bangoria } 56dbdebdc5SRavi Bangoria 57dbdebdc5SRavi Bangoria return 0; 58dbdebdc5SRavi Bangoria } 59