1 /* tc-z8k.c -- Assemble code for the Zilog Z800n
2 Copyright (C) 1992-2019 Free Software Foundation, Inc.
4 This file is part of GAS, the GNU Assembler.
6 GAS is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 3, or (at your option)
11 GAS is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with GAS; see the file COPYING. If not, write to the Free
18 Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
21 /* Written By Steve Chamberlain <sac@cygnus.com>. */
24 #include "safe-ctype.h"
26 #include "opcodes/z8k-opc.h"
28 const char comment_chars
[] = "!";
29 const char line_comment_chars
[] = "#";
30 const char line_separator_chars
[] = ";";
33 extern int coff_flags
;
36 /* This is non-zero if target was set from the command line.
37 If non-zero, 1 means Z8002 (non-segmented), 2 means Z8001 (segmented). */
38 static int z8k_target_from_cmdline
;
46 bfd_set_arch_mach (stdoutput
, TARGET_ARCH
, bfd_mach_z8001
);
51 bfd_set_arch_mach (stdoutput
, TARGET_ARCH
, bfd_mach_z8002
);
56 even (int ignore ATTRIBUTE_UNUSED
)
59 record_alignment (now_seg
, 1);
73 sval (int ignore ATTRIBUTE_UNUSED
)
76 if (*input_line_pointer
== '\'')
80 c
= *input_line_pointer
++;
85 c
= (tohex (input_line_pointer
[0]) << 4)
86 | tohex (input_line_pointer
[1]);
87 input_line_pointer
+= 2;
89 FRAG_APPEND_1_CHAR (c
);
90 c
= *input_line_pointer
++;
92 demand_empty_rest_of_line ();
96 /* This table describes all the machine specific pseudo-ops the assembler
97 has to support. The fields are:
98 pseudo-op name without dot
99 function to call to execute this pseudo-op
100 Integer arg to pass to the function
103 const pseudo_typeS md_pseudo_table
[] = {
105 {"data.b" , cons
, 1},
106 {"data.w" , cons
, 2},
107 {"data.l" , cons
, 4},
108 {"form" , listing_psize
, 0},
109 {"heading", listing_title
, 0},
110 {"import" , s_ignore
, 0},
111 {"page" , listing_eject
, 0},
112 {"program", s_ignore
, 0},
113 {"z8001" , s_segm
, 1},
114 {"z8002" , s_segm
, 0},
116 {"segm" , s_segm
, 1},
117 {"unsegm" , s_segm
, 0},
118 {"unseg" , s_segm
, 0},
119 {"name" , s_app_file
, 0},
120 {"global" , s_globl
, 0},
125 {"rsect" , obj_coff_section
, 0},
126 {"sect" , obj_coff_section
, 0},
127 {"block" , s_space
, 0},
132 const char EXP_CHARS
[] = "eE";
134 /* Chars that mean this number is a floating point constant.
137 const char FLT_CHARS
[] = "rRsSfFdDxXpP";
139 /* Opcode mnemonics. */
140 static struct hash_control
*opcode_hash_control
;
145 const opcode_entry_type
*opcode
;
148 opcode_hash_control
= hash_new ();
150 for (opcode
= z8k_table
; opcode
->name
; opcode
++)
152 /* Only enter unique codes into the table. */
153 if (idx
!= opcode
->idx
)
154 hash_insert (opcode_hash_control
, opcode
->name
, (char *) opcode
);
158 /* Default to z8002. */
159 s_segm (z8k_target_from_cmdline
? z8k_target_from_cmdline
- 1 : 0);
161 /* Insert the pseudo ops, too. */
162 for (idx
= 0; md_pseudo_table
[idx
].poc_name
; idx
++)
164 opcode_entry_type
*fake_opcode
;
165 fake_opcode
= XNEW (opcode_entry_type
);
166 fake_opcode
->name
= md_pseudo_table
[idx
].poc_name
;
167 fake_opcode
->func
= (void *) (md_pseudo_table
+ idx
);
168 fake_opcode
->opcode
= 250;
169 hash_insert (opcode_hash_control
, fake_opcode
->name
, fake_opcode
);
173 typedef struct z8k_op
{
182 /* Any other register associated with the mode. */
185 /* Any expression. */
189 static expressionS
*da_operand
;
190 static expressionS
*imm_operand
;
195 static int the_flags
;
196 static int the_interrupt
;
198 /* Determine register number. src points to the ascii number
199 (after "rl", "rh", "r", "rr", or "rq"). If a character
200 outside the set of {0,',',')','('} follows the number,
201 return NULL to indicate that it's not a valid register
205 whatreg (unsigned int *preg
, char *src
)
207 unsigned int new_reg
;
209 /* src[0] is already known to be a digit. */
210 if (ISDIGIT (src
[1]))
212 new_reg
= (src
[0] - '0') * 10 + src
[1] - '0';
217 new_reg
= (src
[0] - '0');
221 if (src
[0] != 0 && src
[0] != ',' && src
[0] != '(' && src
[0] != ')')
234 WREG r0,r1,r2,r3,r4,r5,r6,r7,fp,sp
242 /* Try to parse a reg name. Return a pointer to the first character
243 in SRC after the reg name. */
246 parse_reg (char *src
, int *mode
, unsigned int *preg
)
251 /* Check for stack pointer "sp" alias. */
252 if ((src
[0] == 's' || src
[0] == 'S')
253 && (src
[1] == 'p' || src
[1] == 'P')
254 && (src
[2] == 0 || src
[2] == ','))
258 *mode
= CLASS_REG_LONG
;
263 *mode
= CLASS_REG_WORD
;
269 if (src
[0] == 'r' || src
[0] == 'R')
271 if (src
[1] == 'r' || src
[1] == 'R')
273 if (src
[2] < '0' || src
[2] > '9')
274 return NULL
; /* Assume no register name but a label starting with 'rr'. */
275 *mode
= CLASS_REG_LONG
;
276 res
= whatreg (preg
, src
+ 2);
278 return NULL
; /* Not a valid register name. */
281 as_bad (_("register rr%d out of range"), regno
);
283 as_bad (_("register rr%d does not exist"), regno
);
285 else if (src
[1] == 'h' || src
[1] == 'H')
287 if (src
[2] < '0' || src
[2] > '9')
288 return NULL
; /* Assume no register name but a label starting with 'rh'. */
289 *mode
= CLASS_REG_BYTE
;
290 res
= whatreg (preg
, src
+ 2);
292 return NULL
; /* Not a valid register name. */
295 as_bad (_("register rh%d out of range"), regno
);
297 else if (src
[1] == 'l' || src
[1] == 'L')
299 if (src
[2] < '0' || src
[2] > '9')
300 return NULL
; /* Assume no register name but a label starting with 'rl'. */
301 *mode
= CLASS_REG_BYTE
;
302 res
= whatreg (preg
, src
+ 2);
304 return NULL
; /* Not a valid register name. */
307 as_bad (_("register rl%d out of range"), regno
);
310 else if (src
[1] == 'q' || src
[1] == 'Q')
312 if (src
[2] < '0' || src
[2] > '9')
313 return NULL
; /* Assume no register name but a label starting with 'rq'. */
314 *mode
= CLASS_REG_QUAD
;
315 res
= whatreg (preg
, src
+ 2);
317 return NULL
; /* Not a valid register name. */
320 as_bad (_("register rq%d out of range"), regno
);
322 as_bad (_("register rq%d does not exist"), regno
);
326 if (src
[1] < '0' || src
[1] > '9')
327 return NULL
; /* Assume no register name but a label starting with 'r'. */
328 *mode
= CLASS_REG_WORD
;
329 res
= whatreg (preg
, src
+ 1);
331 return NULL
; /* Not a valid register name. */
334 as_bad (_("register r%d out of range"), regno
);
341 parse_exp (char *s
, expressionS
*op
)
343 char *save
= input_line_pointer
;
346 input_line_pointer
= s
;
348 if (op
->X_op
== O_absent
)
349 as_bad (_("missing operand"));
350 new_pointer
= input_line_pointer
;
351 input_line_pointer
= save
;
355 /* The many forms of operand:
370 checkfor (char *ptr
, char what
)
375 as_bad (_("expected %c"), what
);
380 /* Make sure the mode supplied is the size of a word. */
383 regword (int mode
, const char *string
)
390 as_bad (_("register is wrong size for a word %s"), string
);
394 /* Make sure the mode supplied is the size of an address. */
397 regaddr (int mode
, const char *string
)
401 ok
= segmented_mode
? CLASS_REG_LONG
: CLASS_REG_WORD
;
404 as_bad (_("register is wrong size for address %s"), string
);
413 static struct ctrl_names ctrl_table
[] = {
414 { 0x1, "flags" }, /* ldctlb only. */
415 { 0x2, "fcw" }, /* ldctl only. Applies to all remaining control registers. */
427 get_ctrl_operand (char **ptr
, struct z8k_op
*mode
, unsigned int dst ATTRIBUTE_UNUSED
)
435 mode
->mode
= CLASS_CTRL
;
436 for (i
= 0; ctrl_table
[i
].name
; i
++)
438 l
= strlen (ctrl_table
[i
].name
);
439 if (! strncasecmp (ctrl_table
[i
].name
, src
, l
))
441 the_ctrl
= ctrl_table
[i
].value
;
442 if (*(src
+ l
) && *(src
+ l
) != ',')
444 *ptr
= src
+ l
; /* Valid control name found: "consume" it. */
456 static struct flag_names flag_table
[] = {
468 get_flags_operand (char **ptr
, struct z8k_op
*mode
, unsigned int dst ATTRIBUTE_UNUSED
)
478 mode
->mode
= CLASS_FLAGS
;
480 for (j
= 0; j
<= 9; j
++)
485 for (i
= 0; flag_table
[i
].name
; i
++)
487 if (flag_table
[i
].name
[0] == c
)
489 the_flags
= the_flags
| flag_table
[i
].value
;
501 struct interrupt_names
{
506 static struct interrupt_names intr_table
[] = {
515 get_interrupt_operand (char **ptr
, struct z8k_op
*mode
, unsigned int dst ATTRIBUTE_UNUSED
)
523 mode
->mode
= CLASS_IMM
;
528 for (i
= 0; intr_table
[i
].name
; i
++)
530 l
= strlen (intr_table
[i
].name
);
531 if (! strncasecmp (intr_table
[i
].name
, src
, l
))
533 the_interrupt
|= intr_table
[i
].value
;
534 if (*(src
+ l
) && *(src
+ l
) != ',')
538 as_bad (_("unknown interrupt %s"), src
);
539 while (**ptr
&& ! is_end_of_line
[(unsigned char) **ptr
])
540 (*ptr
)++; /* Consume rest of line. */
560 /* No interrupt type specified, opcode won't do anything. */
561 as_warn (_("opcode has no effect"));
570 static struct cc_names table
[] = {
605 get_cc_operand (char **ptr
, struct z8k_op
*mode
, unsigned int dst ATTRIBUTE_UNUSED
)
613 mode
->mode
= CLASS_CC
;
614 for (i
= 0; table
[i
].name
; i
++)
616 l
= strlen (table
[i
].name
);
617 if (! strncasecmp (table
[i
].name
, src
, l
))
619 the_cc
= table
[i
].value
;
620 if (*(src
+ l
) && *(src
+ l
) != ',')
622 *ptr
= src
+ l
; /* Valid cc found: "consume" it. */
626 the_cc
= 0x8; /* Not recognizing the cc defaults to t. (Assuming no cc present.) */
630 get_operand (char **ptr
, struct z8k_op
*mode
, unsigned int dst ATTRIBUTE_UNUSED
)
641 mode
->mode
= CLASS_IMM
;
642 imm_operand
= &(mode
->exp
);
643 src
= parse_exp (src
+ 1, &(mode
->exp
));
645 else if (*src
== '@')
647 mode
->mode
= CLASS_IR
;
648 src
= parse_reg (src
+ 1, &mode
->regsize
, &mode
->reg
);
654 end
= parse_reg (src
, &mode
->mode
, ®n
);
665 end
= parse_reg (src
, &nw
, &nr
);
672 as_bad (_("Missing ) in ra(rb)"));
676 regaddr (mode
->mode
, "ra(rb) ra");
677 mode
->mode
= CLASS_BX
;
687 src
= parse_exp (src
, &(mode
->exp
));
688 src
= checkfor (src
, ')');
689 mode
->mode
= CLASS_BA
;
692 imm_operand
= &(mode
->exp
);
703 /* No initial reg. */
704 src
= parse_exp (src
, &(mode
->exp
));
708 end
= parse_reg (src
, &(mode
->mode
), ®n
);
709 regword (mode
->mode
, "addr(Ra) ra");
710 mode
->mode
= CLASS_X
;
713 da_operand
= &(mode
->exp
);
714 src
= checkfor (end
, ')');
718 /* Just an address. */
719 mode
->mode
= CLASS_DA
;
722 da_operand
= &(mode
->exp
);
730 get_operands (const opcode_entry_type
*opcode
, char *op_end
, op_type
*operand
)
735 switch (opcode
->noperands
)
745 if (opcode
->arg_info
[0] == CLASS_CC
)
747 get_cc_operand (&ptr
, operand
+ 0, 0);
750 if (*ptr
&& ! is_end_of_line
[(unsigned char) *ptr
])
752 as_bad (_("invalid condition code '%s'"), ptr
);
753 while (*ptr
&& ! is_end_of_line
[(unsigned char) *ptr
])
754 ptr
++; /* Consume rest of line. */
757 else if (opcode
->arg_info
[0] == CLASS_FLAGS
)
759 get_flags_operand (&ptr
, operand
+ 0, 0);
762 if (*ptr
&& ! is_end_of_line
[(unsigned char) *ptr
])
764 as_bad (_("invalid flag '%s'"), ptr
);
765 while (*ptr
&& ! is_end_of_line
[(unsigned char) *ptr
])
766 ptr
++; /* Consume rest of line. */
769 else if (opcode
->arg_info
[0] == (CLASS_IMM
+ (ARG_IMM2
)))
770 get_interrupt_operand (&ptr
, operand
+ 0, 0);
772 get_operand (&ptr
, operand
+ 0, 0);
779 if (opcode
->arg_info
[0] == CLASS_CC
)
781 get_cc_operand (&ptr
, operand
+ 0, 0);
784 if (*ptr
!= ',' && strchr (ptr
+ 1, ','))
791 as_bad (_("invalid condition code '%s'"), savptr
);
794 else if (opcode
->arg_info
[0] == CLASS_CTRL
)
796 get_ctrl_operand (&ptr
, operand
+ 0, 0);
801 get_operand (&ptr
, operand
+ 0, 0);
807 get_ctrl_operand (&ptr
, operand
+ 1, 1);
814 get_operand (&ptr
, operand
+ 0, 0);
820 get_operand (&ptr
, operand
+ 1, 1);
824 get_operand (&ptr
, operand
+ 0, 0);
827 get_operand (&ptr
, operand
+ 1, 1);
830 get_operand (&ptr
, operand
+ 2, 2);
834 get_operand (&ptr
, operand
+ 0, 0);
837 get_operand (&ptr
, operand
+ 1, 1);
840 get_operand (&ptr
, operand
+ 2, 2);
843 get_cc_operand (&ptr
, operand
+ 3, 3);
853 /* Passed a pointer to a list of opcodes which use different
854 addressing modes. Return the opcode which matches the opcodes
857 static opcode_entry_type
*
858 get_specific (opcode_entry_type
*opcode
, op_type
*operands
)
860 opcode_entry_type
*this_try
= opcode
;
862 unsigned int noperands
= opcode
->noperands
;
864 int this_index
= opcode
->idx
;
866 while (this_index
== opcode
->idx
&& !found
)
871 for (i
= 0; i
< noperands
; i
++)
873 unsigned int mode
= operands
[i
].mode
;
875 if (((mode
& CLASS_MASK
) == CLASS_IR
) && ((this_try
->arg_info
[i
] & CLASS_MASK
) == CLASS_IRO
))
877 mode
= operands
[i
].mode
= (operands
[i
].mode
& ~CLASS_MASK
) | CLASS_IRO
;
880 if ((mode
& CLASS_MASK
) != (this_try
->arg_info
[i
] & CLASS_MASK
))
882 /* It could be a pc rel operand, if this is a da mode
883 and we like disps, then insert it. */
885 if (mode
== CLASS_DA
&& this_try
->arg_info
[i
] == CLASS_DISP
)
887 /* This is the case. */
888 operands
[i
].mode
= CLASS_DISP
;
890 else if (mode
== CLASS_BA
&& this_try
->arg_info
[i
])
892 /* Can't think of a way to turn what we've been
893 given into something that's OK. */
896 else if (this_try
->arg_info
[i
] & CLASS_PR
)
898 if (mode
== CLASS_REG_LONG
&& segmented_mode
)
902 else if (mode
== CLASS_REG_WORD
&& !segmented_mode
)
912 switch (mode
& CLASS_MASK
)
917 if (operands
[i
].regsize
!= CLASS_REG_WORD
)
918 as_bad (_("invalid indirect register size"));
919 reg
[this_try
->arg_info
[i
] & ARG_MASK
] = operands
[i
].reg
;
922 if ((segmented_mode
&& operands
[i
].regsize
!= CLASS_REG_LONG
)
923 || (!segmented_mode
&& operands
[i
].regsize
!= CLASS_REG_WORD
))
924 as_bad (_("invalid indirect register size"));
925 reg
[this_try
->arg_info
[i
] & ARG_MASK
] = operands
[i
].reg
;
937 reg
[this_try
->arg_info
[i
] & ARG_MASK
] = operands
[i
].reg
;
940 if (this_try
->opcode
== OPC_ldctlb
&& the_ctrl
!= 1)
941 as_bad (_("invalid control register name"));
956 static char buffer
[20];
959 newfix (int ptr
, bfd_reloc_code_real_type type
, int size
, expressionS
*operand
)
963 /* Size is in nibbles. */
964 if (operand
->X_add_symbol
965 || operand
->X_op_symbol
966 || operand
->X_add_number
)
971 case BFD_RELOC_8_PCREL
:
972 case BFD_RELOC_Z8K_CALLR
:
973 case BFD_RELOC_Z8K_DISP7
:
980 fixP
= fix_new_exp (frag_now
, ptr
, size
/ 2,
981 operand
, is_pcrel
, type
);
983 fixP
->fx_no_overflow
= 1;
988 apply_fix (char *ptr
, bfd_reloc_code_real_type type
, expressionS
*operand
,
991 long n
= operand
->X_add_number
;
993 /* size is in nibbles. */
995 newfix ((ptr
- buffer
) / 2, type
, size
+ 1, operand
);
998 case 8: /* 8 nibbles == 32 bits. */
1004 case 4: /* 4 nibbles == 16 bits. */
1018 /* Now we know what sort of opcodes it is. Let's build the bytes. */
1021 build_bytes (opcode_entry_type
*this_try
, struct z8k_op
*operand ATTRIBUTE_UNUSED
)
1023 char *output_ptr
= buffer
;
1026 unsigned int *class_ptr
;
1028 frag_wane (frag_now
);
1031 if (frag_room () < 8)
1032 frag_grow (8); /* Make room for maximum instruction size. */
1034 memset (buffer
, 0, sizeof (buffer
));
1035 class_ptr
= this_try
->byte_info
;
1037 for (nibble
= 0; (c
= *class_ptr
++); nibble
++)
1040 switch (c
& CLASS_MASK
)
1046 /* Direct address, we don't cope with the SS mode right now. */
1049 /* da_operand->X_add_number |= 0x80000000; -- Now set at relocation time. */
1050 output_ptr
= apply_fix (output_ptr
, BFD_RELOC_32
, da_operand
, 8);
1054 output_ptr
= apply_fix (output_ptr
, BFD_RELOC_16
, da_operand
, 4);
1060 output_ptr
= apply_fix (output_ptr
, BFD_RELOC_8_PCREL
, da_operand
, 2);
1067 output_ptr
= apply_fix (output_ptr
, BFD_RELOC_Z8K_DISP7
, da_operand
, 2);
1074 output_ptr
= apply_fix (output_ptr
, BFD_RELOC_Z8K_DISP7
, da_operand
, 2);
1075 output_ptr
[-2] = 0x8;
1079 case CLASS_BIT_1OR2
:
1080 *output_ptr
= c
& 0xf;
1083 if (imm_operand
->X_add_number
== 2)
1085 else if (imm_operand
->X_add_number
!= 1)
1086 as_bad (_("immediate must be 1 or 2"));
1089 as_bad (_("immediate 1 or 2 expected"));
1093 *output_ptr
++ = the_cc
;
1096 if (the_ctrl
< 2 || the_ctrl
> 7)
1097 as_bad (_("invalid control register name"));
1098 *output_ptr
++ = the_ctrl
;
1101 if (the_ctrl
< 2 || the_ctrl
> 7)
1102 as_bad (_("invalid control register name"));
1103 *output_ptr
++ = the_ctrl
| 0x8;
1106 *output_ptr
++ = (~the_interrupt
& 0x3);
1109 *output_ptr
++ = (~the_interrupt
& 0x3) | 0x4;
1112 *output_ptr
++ = the_flags
;
1116 *output_ptr
++ = c
& 0xf;
1119 if (reg
[c
& 0xf] == 0)
1120 as_bad (_("can't use R0 here"));
1123 case CLASS_REG_BYTE
:
1124 case CLASS_REG_WORD
:
1125 case CLASS_REG_LONG
:
1126 case CLASS_REG_QUAD
:
1127 /* Insert bit pattern of right reg. */
1128 *output_ptr
++ = reg
[c
& 0xf];
1131 switch (c
& ARG_MASK
)
1134 output_ptr
= apply_fix (output_ptr
, BFD_RELOC_Z8K_CALLR
, da_operand
, 4);
1137 output_ptr
= apply_fix (output_ptr
, BFD_RELOC_16_PCREL
, da_operand
, 4);
1140 output_ptr
= apply_fix (output_ptr
, BFD_RELOC_16
, da_operand
, 4);
1147 switch (c
& ARG_MASK
)
1150 if (imm_operand
->X_add_number
> 15)
1151 as_bad (_("immediate value out of range"));
1152 imm_operand
->X_add_number
= -imm_operand
->X_add_number
;
1153 output_ptr
= apply_fix (output_ptr
, BFD_RELOC_Z8K_IMM4L
, imm_operand
, 1);
1155 /*case ARG_IMMNMINUS1: not used. */
1157 imm_operand
->X_add_number
--;
1160 if (imm_operand
->X_add_number
> 15)
1161 as_bad (_("immediate value out of range"));
1162 output_ptr
= apply_fix (output_ptr
, BFD_RELOC_Z8K_IMM4L
, imm_operand
, 1);
1165 imm_operand
->X_add_number
= -imm_operand
->X_add_number
;
1168 output_ptr
= apply_fix (output_ptr
, BFD_RELOC_8
, imm_operand
, 2);
1171 output_ptr
= apply_fix (output_ptr
, BFD_RELOC_16
, imm_operand
, 4);
1174 output_ptr
= apply_fix (output_ptr
, BFD_RELOC_32
, imm_operand
, 8);
1183 /* Copy from the nibble buffer into the frag. */
1185 int length
= (output_ptr
- buffer
) / 2;
1187 char *fragp
= frag_more (length
);
1189 while (src
< output_ptr
)
1191 *fragp
= (src
[0] << 4) | src
[1];
1198 /* This is the guts of the machine-dependent assembler. STR points to a
1199 machine dependent instruction. This function is supposed to emit
1200 the frags/bytes it assembles to. */
1203 md_assemble (char *str
)
1208 struct z8k_op operand
[4];
1209 opcode_entry_type
*opcode
;
1211 /* Drop leading whitespace. */
1215 /* Find the op code end. */
1216 for (op_start
= op_end
= str
;
1217 *op_end
!= 0 && *op_end
!= ' ' && ! is_end_of_line
[(unsigned char) *op_end
];
1221 if (op_end
== op_start
)
1223 as_bad (_("can't find opcode "));
1227 *op_end
= 0; /* Zero-terminate op code string for hash_find() call. */
1229 opcode
= (opcode_entry_type
*) hash_find (opcode_hash_control
, op_start
);
1233 as_bad (_("unknown opcode"));
1237 *op_end
= c
; /* Restore original string. */
1239 if (opcode
->opcode
== 250)
1243 char *old
= input_line_pointer
;
1245 /* Was really a pseudo op. */
1247 input_line_pointer
= op_end
;
1251 while (*input_line_pointer
== ' ')
1252 input_line_pointer
++;
1253 p
= (pseudo_typeS
*) (opcode
->func
);
1255 (p
->poc_handler
) (p
->poc_val
);
1256 input_line_pointer
= old
;
1261 char *new_input_line_pointer
;
1263 new_input_line_pointer
= get_operands (opcode
, op_end
, operand
);
1264 if (new_input_line_pointer
)
1266 input_line_pointer
= new_input_line_pointer
;
1267 opcode
= get_specific (opcode
, operand
);
1270 if (new_input_line_pointer
== NULL
|| opcode
== NULL
)
1272 /* Couldn't find an opcode which matched the operands. */
1273 char *where
= frag_more (2);
1278 as_bad (_("Can't find opcode to match operands"));
1282 build_bytes (opcode
, operand
);
1286 /* We have no need to default values of symbols. */
1289 md_undefined_symbol (char *name ATTRIBUTE_UNUSED
)
1294 /* Various routines to kill one day. */
1297 md_atof (int type
, char *litP
, int *sizeP
)
1299 return ieee_md_atof (type
, litP
, sizeP
, TRUE
);
1302 const char *md_shortopts
= "z:";
1304 struct option md_longopts
[] =
1306 #define OPTION_RELAX (OPTION_MD_BASE)
1307 {"linkrelax", no_argument
, NULL
, OPTION_RELAX
},
1308 {NULL
, no_argument
, NULL
, 0}
1311 size_t md_longopts_size
= sizeof (md_longopts
);
1314 md_parse_option (int c
, const char *arg
)
1319 if (!strcmp (arg
, "8001"))
1320 z8k_target_from_cmdline
= 2;
1321 else if (!strcmp (arg
, "8002"))
1322 z8k_target_from_cmdline
= 1;
1325 as_bad (_("invalid architecture -z%s"), arg
);
1342 md_show_usage (FILE *stream
)
1344 fprintf (stream
, _("\
1346 -z8001 generate segmented code\n\
1347 -z8002 generate unsegmented code\n\
1348 -linkrelax create linker relaxable code\n"));
1352 md_convert_frag (bfd
*abfd ATTRIBUTE_UNUSED
,
1353 segT sec ATTRIBUTE_UNUSED
,
1354 fragS
*fragP ATTRIBUTE_UNUSED
)
1356 printf (_("call to md_convert_frag\n"));
1360 /* Generate a machine dependent reloc from a fixup. */
1363 tc_gen_reloc (asection
*section ATTRIBUTE_UNUSED
,
1364 fixS
*fixp ATTRIBUTE_UNUSED
)
1368 reloc
= XNEW (arelent
);
1369 reloc
->sym_ptr_ptr
= XNEW (asymbol
*);
1370 *reloc
->sym_ptr_ptr
= symbol_get_bfdsym (fixp
->fx_addsy
);
1371 reloc
->address
= fixp
->fx_frag
->fr_address
+ fixp
->fx_where
;
1372 reloc
->addend
= fixp
->fx_offset
;
1373 reloc
->howto
= bfd_reloc_type_lookup (stdoutput
, fixp
->fx_r_type
);
1377 as_bad_where (fixp
->fx_file
, fixp
->fx_line
,
1378 _("Cannot represent %s relocation in object file"),
1379 bfd_get_reloc_code_name (fixp
->fx_r_type
));
1386 md_section_align (segT seg
, valueT size
)
1388 int align
= bfd_get_section_alignment (stdoutput
, seg
);
1389 valueT mask
= ((valueT
) 1 << align
) - 1;
1391 return (size
+ mask
) & ~mask
;
1394 /* Attempt to simplify or eliminate a fixup. To indicate that a fixup
1395 has been eliminated, set fix->fx_done. If fix->fx_addsy is non-NULL,
1396 we will have to generate a reloc entry. */
1398 md_apply_fix (fixS
*fixP
, valueT
*valP
, segT segment ATTRIBUTE_UNUSED
)
1400 long val
= * (long *) valP
;
1401 char *buf
= fixP
->fx_where
+ fixP
->fx_frag
->fr_literal
;
1403 switch (fixP
->fx_r_type
)
1405 case BFD_RELOC_Z8K_IMM4L
:
1408 fixP
->fx_no_overflow
= 1;
1412 buf
[0] = (buf
[0] & 0xf0) | (val
& 0xf);
1418 fixP
->fx_no_overflow
= 1;
1428 fixP
->fx_no_overflow
= 1;
1433 *buf
++ = (val
>> 8);
1441 fixP
->fx_no_overflow
= 1;
1446 *buf
++ = (val
>> 24);
1447 *buf
++ = (val
>> 16);
1448 *buf
++ = (val
>> 8);
1453 case BFD_RELOC_8_PCREL
:
1456 fixP
->fx_no_overflow
= 1;
1462 as_bad_where (fixP
->fx_file
, fixP
->fx_line
,
1463 _("cannot branch to odd address"));
1465 if (val
> 127 || val
< -128)
1466 as_bad_where (fixP
->fx_file
, fixP
->fx_line
,
1467 _("relative jump out of range"));
1469 fixP
->fx_no_overflow
= 1;
1474 case BFD_RELOC_16_PCREL
:
1477 fixP
->fx_no_overflow
= 1;
1482 val
= val
- fixP
->fx_frag
->fr_address
+ fixP
->fx_where
- fixP
->fx_size
;
1483 if (val
> 32767 || val
< -32768)
1484 as_bad_where (fixP
->fx_file
, fixP
->fx_line
,
1485 _("relative address out of range"));
1486 *buf
++ = (val
>> 8);
1488 fixP
->fx_no_overflow
= 1;
1493 case BFD_RELOC_Z8K_CALLR
:
1496 fixP
->fx_no_overflow
= 1;
1502 as_bad_where (fixP
->fx_file
, fixP
->fx_line
,
1503 _("cannot branch to odd address"));
1504 if (val
> 4096 || val
< -4095)
1505 as_bad_where (fixP
->fx_file
, fixP
->fx_line
,
1506 _("relative call out of range"));
1508 *buf
= (*buf
& 0xf0) | ((val
>> 8) & 0xf);
1510 *buf
++ = val
& 0xff;
1511 fixP
->fx_no_overflow
= 1;
1516 case BFD_RELOC_Z8K_DISP7
:
1519 fixP
->fx_no_overflow
= 1;
1525 as_bad_where (fixP
->fx_file
, fixP
->fx_line
,
1526 _("cannot branch to odd address"));
1528 if (val
> 0 || val
< -127)
1529 as_bad_where (fixP
->fx_file
, fixP
->fx_line
,
1530 _("relative jump out of range"));
1531 *buf
= (*buf
& 0x80) | (-val
& 0x7f);
1532 fixP
->fx_no_overflow
= 1;
1538 printf(_("md_apply_fix: unknown r_type 0x%x\n"), fixP
->fx_r_type
);
1542 if (fixP
->fx_addsy
== NULL
&& fixP
->fx_pcrel
== 0)
1547 md_estimate_size_before_relax (fragS
*fragP ATTRIBUTE_UNUSED
,
1548 segT segment_type ATTRIBUTE_UNUSED
)
1550 printf (_("call to md_estimate_size_before_relax\n"));
1554 /* Put number into target byte order. */
1557 md_number_to_chars (char *ptr
, valueT use
, int nbytes
)
1559 number_to_chars_bigendian (ptr
, use
, nbytes
);
1562 /* On the Z8000, a PC-relative offset is relative to the address of the
1563 instruction plus its size. */
1565 md_pcrel_from (fixS
*fixP
)
1567 return fixP
->fx_size
+ fixP
->fx_where
+ fixP
->fx_frag
->fr_address
;
1571 tc_coff_symbol_emit_hook (symbolS
*s ATTRIBUTE_UNUSED
)