1 /* tc-m68k.c All the m68020 specific stuff in one convenient, huge,
2 slow to compile, easy to find file.
4 Copyright (C) 1987, 1991, 1992 Free Software Foundation, Inc.
6 This file is part of GAS, the GNU Assembler.
8 GAS is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2, or (at your option)
13 GAS is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with GAS; see the file COPYING. If not, write to
20 the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
29 /* note that this file includes real declarations and thus can only be included by one source file per executable. */
30 #include "opcode/m68k.h"
33 /* This variable contains the value to write out at the beginning of
34 the a.out file. The 2<<16 means that this is a 68020 file instead
35 of an old-style 68000 file */
37 long omagic
= 2<<16|OMAGIC
; /* Magic byte for header file */
42 /* This array holds the chars that always start a comment. If the
43 pre-processor is disabled, these aren't very useful */
44 const char comment_chars
[] = "|";
46 /* This array holds the chars that only start a comment at the beginning of
47 a line. If the line seems to have the form '# 123 filename'
48 .line and .file directives will appear in the pre-processed output */
49 /* Note that input_file.c hand checks for '#' at the beginning of the
50 first line of the input file. This is because the compiler outputs
51 #NO_APP at the beginning of its output. */
52 /* Also note that comments like this one will always work. */
53 const char line_comment_chars
[] = "#";
55 /* Chars that can be used to separate mant from exp in floating point nums */
56 const char EXP_CHARS
[] = "eE";
58 /* Chars that mean this number is a floating point constant */
62 const char FLT_CHARS
[] = "rRsSfFdDxXeEpP";
64 /* Also be aware that MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT may have to be
65 changed in read.c . Ideally it shouldn't have to know about it at all,
66 but nothing is ideal around here.
69 int md_reloc_size
= 8; /* Size of relocation record */
71 /* Its an arbitrary name: This means I don't approve of it */
72 /* See flames below */
73 static struct obstack robyn
;
75 #define TAB(x,y) (((x)<<2)+(y))
76 #define TABTYPE(xy) ((xy) >> 2)
89 /* Operands we can parse: (And associated modes)
95 reg: address or data register
96 areg: address register
97 apc: address register, PC, ZPC or empty string
100 sz: w or l if omitted, l assumed
101 scale: 1 2 4 or 8 if omitted, 1 assumed
103 7.4 IMMED #num --> NUM
104 0.? DREG dreg --> dreg
105 1.? AREG areg --> areg
106 2.? AINDR areg@ --> *(areg)
107 3.? AINC areg@+ --> *(areg++)
108 4.? ADEC areg@- --> *(--areg)
109 5.? AOFF apc@(numw) --> *(apc+numw) -- empty string and ZPC not allowed here
110 6.? AINDX apc@(num,reg:sz:scale) --> *(apc+num+reg*scale)
111 6.? AINDX apc@(reg:sz:scale) --> same, with num=0
112 6.? APODX apc@(num)@(num2,reg:sz:scale) --> *(*(apc+num)+num2+reg*scale)
113 6.? APODX apc@(num)@(reg:sz:scale) --> same, with num2=0
114 6.? AMIND apc@(num)@(num2) --> *(*(apc+num)+num2) (previous mode without an index reg)
115 6.? APRDX apc@(num,reg:sz:scale)@(num2) --> *(*(apc+num+reg*scale)+num2)
116 6.? APRDX apc@(reg:sz:scale)@(num2) --> same, with num=0
117 7.0 ABSL num:sz --> *(num)
118 num --> *(num) (sz L assumed)
119 *** MSCR otherreg --> Magic
121 5.? AOFF apc@(num) --> *(apc+num) -- empty string and ZPC not allowed here still
122 ?.? DINDR dreg@ --> (dreg) -- cas2 only
132 a1@(5,d2:w:1) @(45,d6:l:4)
137 #name@(numw) -->turn into PC rel mode
138 apc@(num8,reg:sz:scale) --> *(apc+num8+reg*scale)
165 short e_siz
; /* 0== default 1==short/byte 2==word 3==long */
168 /* DATA and ADDR have to be contiguous, so that reg-DATA gives 0-7==data reg,
169 8-15==addr reg for operands that take both types */
172 DATA
= 1, /* 1- 8 == data registers 0-7 */
192 /* Note that COPNUM==processor #1 -- COPNUM+7==#8, which stores as 000 */
197 FPREG
, /* Eight FP registers */
206 COPNUM
= (FPREG
+8), /* Co-processor #1-#8 */
215 PC
, /* Program counter */
216 ZPC
, /* Hack for Program space, but 0 addressing */
218 CCR
, /* Condition code Reg */
220 /* These have to be in order for the movec instruction to work. */
221 USP
, /* User Stack Pointer */
222 ISP
, /* Interrupt stack pointer */
237 /* end of movec ordering constraints */
243 DRP
, /* 68851 or 68030 MMU regs */
267 PSR
, /* aka MMUSR on 68030 (but not MMUSR on 68040)
268 and ACUSR on 68ec030 */
271 IC
, /* instruction cache token */
272 DC
, /* data cache token */
273 NC
, /* no cache token */
274 BC
, /* both caches token */
276 TT0
, /* 68030 access control unit regs */
280 /* Internal form of an operand. */
282 char *error
; /* Couldn't parse it */
283 enum operand_type mode
; /* What mode this instruction is in. */
284 enum _register reg
; /* Base register */
285 struct m68k_exp
*con1
;
286 int ireg
; /* Index register */
287 int isiz
; /* 0==unspec 1==byte(?) 2==short 3==long */
288 int imul
; /* Multipy ireg by this (1,2,4,or 8) */
289 struct m68k_exp
*con2
;
292 /* internal form of a 68020 instruction */
295 char *args
; /* list of opcode info */
298 int numo
; /* Number of shorts in opcode */
301 struct m68k_op operands
[6];
303 int nexp
; /* number of exprs in use */
304 struct m68k_exp exprs
[4];
306 int nfrag
; /* Number of frags we have to produce */
308 int fragoff
; /* Where in the current opcode[] the frag ends */
314 int nrel
; /* Num of reloc strucs in use */
322 } reloc
[5]; /* Five is enough??? */
325 #define cpu_of_arch(x) ((x) & m68000up)
326 #define float_of_arch(x) ((x) & mfloat)
327 #define mmu_of_arch(x) ((x) & mmmu)
329 static struct m68k_it the_ins
; /* the instruction being assembled */
331 /* Macros for adding things to the m68k_it struct */
333 #define addword(w) the_ins.opcode[the_ins.numo++]=(w)
335 /* Like addword, but goes BEFORE general operands */
336 #define insop(w) {int z;\
337 for(z=the_ins.numo;z>opcode->m_codenum;--z)\
338 the_ins.opcode[z]=the_ins.opcode[z-1];\
339 for(z=0;z<the_ins.nrel;z++)\
340 the_ins.reloc[z].n+=2;\
341 the_ins.opcode[opcode->m_codenum]=w;\
346 #define add_exp(beg,end) (\
347 the_ins.exprs[the_ins.nexp].e_beg=beg,\
348 the_ins.exprs[the_ins.nexp].e_end=end,\
349 &the_ins.exprs[the_ins.nexp++]\
353 /* The numo+1 kludge is so we can hit the low order byte of the prev word. Blecch*/
354 #define add_fix(width,exp,pc_rel) {\
355 the_ins.reloc[the_ins.nrel].n= ((width)=='B') ? (the_ins.numo*2-1) : \
356 (((width)=='b') ? ((the_ins.numo-1)*2) : (the_ins.numo*2));\
357 the_ins.reloc[the_ins.nrel].add=adds((exp));\
358 the_ins.reloc[the_ins.nrel].sub=subs((exp));\
359 the_ins.reloc[the_ins.nrel].off=offs((exp));\
360 the_ins.reloc[the_ins.nrel].wid=width;\
361 the_ins.reloc[the_ins.nrel++].pcrel=pc_rel;\
364 #define add_frag(add,off,type) {\
365 the_ins.fragb[the_ins.nfrag].fragoff=the_ins.numo;\
366 the_ins.fragb[the_ins.nfrag].fadd=add;\
367 the_ins.fragb[the_ins.nfrag].foff=off;\
368 the_ins.fragb[the_ins.nfrag++].fragty=type;\
371 #define isvar(exp) ((exp) && (adds(exp) || subs(exp)))
373 #define seg(exp) ((exp)->e_exp.X_seg)
374 #define adds(exp) ((exp)->e_exp.X_add_symbol)
375 #define subs(exp) ((exp)->e_exp.X_subtract_symbol)
376 #define offs(exp) ((exp)->e_exp.X_add_number)
381 unsigned long m_opcode
;
385 struct m68k_incant
*m_next
;
390 #define getone(x) ((((x)->m_opcode)>>16)&0xffff)
391 #define gettwo(x) (((x)->m_opcode)&0xffff)
396 static char *crack_operand(char *str
, struct m68k_op
*opP
);
397 static int get_num(struct m68k_exp
*exp
, int ok
);
398 static int get_regs(int i
, char *str
, struct m68k_op
*opP
);
399 static int reverse_16_bits(int in
);
400 static int reverse_8_bits(int in
);
401 static int try_index(char **s
, struct m68k_op
*opP
);
402 static void install_gen_operand(int mode
, int val
);
403 static void install_operand(int mode
, int val
);
404 static void s_bss(void);
405 static void s_data1(void);
406 static void s_data2(void);
407 static void s_even(void);
408 static void s_proc(void);
410 #else /* not __STDC__ */
412 static char *crack_operand();
413 static int get_num();
414 static int get_regs();
415 static int reverse_16_bits();
416 static int reverse_8_bits();
417 static int try_index();
418 static void install_gen_operand();
419 static void install_operand();
421 void s_align_bytes();
422 static void s_data1();
423 static void s_data2();
424 static void s_even();
425 static void s_proc();
427 #endif /* not __STDC__ */
429 static int current_architecture
= 0;
431 /* BCC68000 is for patching in an extra jmp instruction for long offsets
432 on the 68000. The 68000 doesn't support long branches with branchs */
434 /* This table desribes how you change sizes for the various types of variable
435 size expressions. This version only supports two kinds. */
437 /* Note that calls to frag_var need to specify the maximum expansion needed */
438 /* This is currently 10 bytes for DBCC */
441 How far Forward this mode will reach:
442 How far Backward this mode will reach:
443 How many bytes this mode will add to the size of the frag
444 Which mode to go to if the offset won't fit in this one
448 { 1, 1, 0, 0 }, /* First entries aren't used */
449 { 1, 1, 0, 0 }, /* For no good reason except */
450 { 1, 1, 0, 0 }, /* that the VAX doesn't either */
453 { (127), (-128), 0, TAB(ABRANCH
,SHORT
)},
454 { (32767), (-32768), 2, TAB(ABRANCH
,LONG
) },
458 { 1, 1, 0, 0 }, /* FBRANCH doesn't come BYTE */
459 { (32767), (-32768), 2, TAB(FBRANCH
,LONG
)},
463 { 1, 1, 0, 0 }, /* PCREL doesn't come BYTE */
464 { (32767), (-32768), 2, TAB(PCREL
,LONG
)},
468 { (127), (-128), 0, TAB(BCC68000
,SHORT
)},
469 { (32767), (-32768), 2, TAB(BCC68000
,LONG
) },
470 { 0, 0, 6, 0 }, /* jmp long space */
473 { 1, 1, 0, 0 }, /* DBCC doesn't come BYTE */
474 { (32767), (-32768), 2, TAB(DBCC
,LONG
) },
475 { 0, 0, 10, 0 }, /* bra/jmp long space */
478 { 1, 1, 0, 0 }, /* PCLEA doesn't come BYTE */
479 { 32767, -32768, 2, TAB(PCLEA
,LONG
) },
485 /* These are the machine dependent pseudo-ops. These are included so
486 the assembler can work on the output from the SUN C compiler, which
490 /* This table describes all the machine specific pseudo-ops the assembler
491 has to support. The fields are:
492 pseudo-op name without dot
493 function to call to execute this pseudo-op
494 Integer arg to pass to the function
496 const pseudo_typeS md_pseudo_table
[] = {
497 { "data1", s_data1
, 0 },
498 { "data2", s_data2
, 0 },
500 { "even", s_even
, 0 },
501 { "skip", s_space
, 0 },
502 { "proc", s_proc
, 0 },
504 { "align", s_align_bytes
, 0 },
510 /* The mote pseudo ops are put into the opcode table, since they
511 don't start with a . they look like opcodes to gas.
513 extern void obj_coff_section();
515 const pseudo_typeS mote_pseudo_table
[] =
523 { "ds.l", s_space
,4},
525 { "ds.w", s_space
,2},
526 { "ds.b", s_space
,1},
528 { "xdef", s_globl
, 0},
529 { "align", s_align_ptwo
, 0},
531 { "sect", obj_coff_section
,0},
532 { "section", obj_coff_section
,0},
537 /* #define isbyte(x) ((x)>=-128 && (x)<=127) */
538 /* #define isword(x) ((x)>=-32768 && (x)<=32767) */
540 #define issbyte(x) ((x)>=-128 && (x)<=127)
541 #define isubyte(x) ((x)>=0 && (x)<=255)
542 #define issword(x) ((x)>=-32768 && (x)<=32767)
543 #define isuword(x) ((x)>=0 && (x)<=65535)
545 #define isbyte(x) ((x)>=-128 && (x)<=255)
546 #define isword(x) ((x)>=-32768 && (x)<=65535)
547 #define islong(x) (1)
549 extern char *input_line_pointer
;
556 /* JF these tables here are for speed at the expense of size */
557 /* You can replace them with the #if 0 versions if you really
558 need space and don't mind it running a bit slower */
560 static char mklower_table
[256];
561 #define mklower(c) (mklower_table[(unsigned char)(c)])
562 static char notend_table
[256];
563 static char alt_notend_table
[256];
564 #define notend(s) ( !(notend_table[(unsigned char)(*s)] || (*s==':' &&\
565 alt_notend_table[(unsigned char)(s[1])])))
568 #define mklower(c) (isupper(c) ? tolower(c) : c)
572 /* JF modified this to handle cases where the first part of a symbol name
573 looks like a register */
576 * m68k_reg_parse() := if it looks like a register, return it's token &
577 * advance the pointer.
580 enum _register
m68k_reg_parse(ccp
)
585 if (isalpha(*start
) && is_name_beginner(*start
))
592 while (isalpha(c
) || isdigit(c
))
599 symbolP
= symbol_find(start
);
602 if (symbolP
&& S_GET_SEGMENT(symbolP
) == SEG_REGISTER
)
605 return S_GET_VALUE(symbolP
);
613 #define SKIP_WHITE() { str++; if(*str==' ') str++;}
614 #define SKIP_W() { ss++; if(*ss==' ') ss++;}
616 /* Parse an index specification using Motorola syntax. */
619 try_moto_index(s
,opP
)
629 i
=m68k_reg_parse(&ss
);
630 if(!(i
>=DATA
+0 && i
<=ADDR
+7)) { /* if i is not DATA or ADDR reg */
631 opP
->error
="Invalid index register";
645 opP
->error
="Missing . in index register";
650 if(mklower(*ss
)=='w') opP
->isiz
=2;
651 else if(mklower(*ss
)=='l') opP
->isiz
=3;
653 opP
->error
="Size spec not .W or .L";
658 if(*ss
=='.' || *ss
=='*') {
668 opP
->error
="index multiplier not 1, 2, 4 or 8";
675 opP
->error
="Missing )";
686 * try_index := data_or_address_register + ')' + SKIP_W
687 * | data_or_address_register + ':' + SKIP_W + size_spec + SKIP_W + multiplier + ')' + SKIP_W
689 * multiplier := <empty>
690 * | ':' + multiplier_number
693 * multiplier_number := '1' | '2' | '4' | '8' ;
695 * size_spec := 'l' | 'L' | 'w' | 'W' ;
697 * SKIP_W := <empty> | ' ' ;
701 static int try_index(s
,opP
)
710 i
=m68k_reg_parse(&ss
);
711 if(!(i
>=DATA
+0 && i
<=ADDR
+7)) { /* if i is not DATA or ADDR reg */
725 opP
->error
="Missing : in index register";
740 opP
->error
="Index register size spec not :w or :l";
752 if (cpu_of_arch(current_architecture
) < m68020
) {
753 opP
->error
="no index scaling in pre-68020's";
760 opP
->error
="index multiplier not 1, 2, 4 or 8";
767 opP
->error
="Missing )";
776 /* Ian Taylor expanded this function to accept both MIT and Motorola
777 syntax. I removed the old comment, since it was wrong. The syntax
778 this accepted even before my changes was complex and undocumented.
779 I mainly added a large case when the operand string does not
780 contain an '@', since the Motorola syntax does not use the '@'
786 register struct m68k_op
*opP
;
795 } /* Find the beginning of the string */
798 opP
->error
="Missing operand";
802 for(strend
= str
; *strend
; strend
++)
808 opP
->con1
=add_exp(str
,strend
);
811 } /* Guess what: A constant. Shar and enjoy */
813 i
= m68k_reg_parse(&str
);
816 if(*str
=='/' || *str
=='-') {
817 /* "Rm-Rn/Ro-Rp" Register list for MOVEM instruction */
819 return get_regs(i
,str
,opP
);
823 /* "Rn" Register Direct mode */
824 if(i
>=DATA
+0 && i
<=DATA
+7)
826 else if(i
>=ADDR
+0 && i
<=ADDR
+7)
837 if ((stmp
=strchr(str
,'@')) != 0) {
838 opP
->con1
=add_exp(str
,stmp
-1);
844 if ((current_architecture
& m68020up
) == 0) {
846 } /* if target is not a '20 or better */
849 if(*stmp
++!='(' || *strend
--!=')') {
850 opP
->error
="Malformed operand";
853 i
=try_index(&stmp
,opP
);
854 opP
->con2
=add_exp(stmp
,strend
);
862 } /* if there's an '@' */
864 #ifndef MIT_SYNTAX_ONLY
865 /* The operand has no '@'. Try to parse it using
867 /* Logic of the parsing switch(*str):
871 REG AREG or DREG or MSCR 3 or 2 or 13
872 REG- or REG/ REGLST 14
877 (EXPR,REG,INDX) AINDX 8
880 EXP2(REG,INDX) AINDX 8
883 REG means truth(m68k_reg_parse(&str))
884 INDX means truth(try_moto_index(&str,opP))
886 EXP2 means not REG and not '(' and not '-('
891 i
=m68k_reg_parse(&str
);
892 if((i
<ADDR
+0 || i
>ADDR
+7)
893 && (i
<DATA
+0 || i
>DATA
+7
894 || *str
!= ')' || str
[1] != '0')
895 && i
!=PC
&& i
!=ZPC
&& i
!=FAIL
) {
896 /* Can't indirect off non address regs */
897 opP
->error
="Invalid indirect register";
905 /* "(An)" Address Register Indirect mode
906 or "(Dn)" for cas2. */
907 if (i
>=DATA
+0 && i
<=DATA
+7)
915 /* "(An)+" Register Indirect w Postincrement */
920 opP
->error
="Junk after indirect";
925 i
=try_moto_index(&str
,opP
);
926 if(i
==FAIL
) return FAIL
;
927 /* "(An,Rn)" Register Indirect with Index mode*/
932 opP
->error
="Bad indirect syntax";
937 /* "(EXPR,..." , a displacement */
941 if(stmp
=index(str
,',')) {
942 opP
->con1
=add_exp(str
,stmp
-1);
945 i
=m68k_reg_parse(&str
);
946 if((i
<ADDR
+0 || i
>ADDR
+7) && i
!=PC
&& i
!=ZPC
) {
947 /* Can't indirect off non address regs */
948 opP
->error
="Invalid indirect register";
954 /* "(d,An)" Register Indirect w Displacement */
960 i
=try_moto_index(&str
,opP
);
961 if(i
==FAIL
) return FAIL
;
962 /* "(d,An,Rn)" Register Indirect with Index */
967 opP
->error
="Bad indirect syntax";
972 opP
->error
="Invalid register";
978 opP
->con1
= add_exp(str
-1,strend
);
987 i
=m68k_reg_parse(&str
);
988 if((i
<ADDR
+0 || i
>ADDR
+7) && i
!=PC
&& i
!=ZPC
&& i
!=FAIL
) {
989 /* Can't indirect off non address regs */
990 opP
->error
="Invalid indirect register";
998 /* "-(An)" Register Indirect with Predecrement */
1002 opP
->error
="Junk after indirect";
1005 opP
->error
="Bad indirect syntax";
1009 opP
->con1
= add_exp(str
-2,strend
);
1012 /* if '-' but not "-(', do nothing */
1015 /* whether *str=='-' or not */
1017 /* "EXP2" or "EXP2(REG..." */
1020 if(stmp
=index(str
,'(')) {
1023 opP
->con1
=add_exp(str
,stmp
-1);
1025 i
=m68k_reg_parse(&str
);
1026 if((i
<ADDR
+0 || i
>ADDR
+7) && i
!=PC
1027 && i
!=ZPC
&& i
!=FAIL
) {
1028 /* Can't indirect off non address regs */
1029 opP
->error
="Invalid indirect register";
1035 /* "d(An)" Register Indirect w Displacement */
1041 i
=try_moto_index(&str
,opP
);
1042 if(i
==FAIL
) return FAIL
;
1043 /* "d(An,Rn)" Register Indirect with Index */
1048 opP
->error
="Bad indirect syntax";
1054 opP
->con1
= add_exp(ostr
,strend
);
1059 /* "EXP2" Absolute */
1062 if(strend
[-1]=='.' || strend
[-1]==':') {
1063 /* mode ==foo.[wl] */
1077 opP
->con1
=add_exp(str
,strend
);
1082 #else /* defined (MIT_SYNTAX_ONLY) */
1084 opP
->con1
=add_exp(str
,strend
);
1086 #endif /* defined (MIT_SYNTAX_ONLY) */
1091 /* Can't indirect off non address regs, but Dx@ is OK for cas2 */
1092 if((i
<ADDR
+0 || i
>ADDR
+7) && i
!=PC
&& i
!=ZPC
&& i
!=FAIL
1093 && (str
[1] != '\0' || i
<DATA
+0 || i
>DATA
+7)) {
1094 opP
->error
="Invalid indirect register";
1102 if (i
<DATA
+0 || i
>DATA
+7)
1117 opP
->error
="Junk after indirect";
1120 /* Some kind of indexing involved. Lets find out how bad it is */
1121 i
=try_index(&str
,opP
);
1122 /* Didn't start with an index reg, maybe its offset or offset,reg */
1130 opP
->error
="Missing )";
1132 case ',': i
=0; break;
1133 case '(': i
++; break;
1134 case ')': --i
; break;
1137 /* if(str[-3]==':') {
1154 opP->error="Specified size isn't :w or :l";
1157 opP->con1=add_exp(beg_str,str-4);
1158 opP->con1->e_siz=siz;
1160 opP
->con1
=add_exp(beg_str
,str
-2);
1161 /* Should be offset,reg */
1163 i
=try_index(&str
,opP
);
1165 opP
->error
="Malformed index reg";
1170 /* We've now got offset) offset,reg) or reg) */
1173 /* Th-the-thats all folks */
1174 if (opP
->reg
== FAIL
) opP
->mode
= AINDX
; /* Other form of indirect */
1175 else if(opP
->ireg
== FAIL
) opP
->mode
= AOFF
;
1176 else opP
->mode
= AINDX
;
1179 /* Next thing had better be another @ */
1181 if (str
[1] == '(') {
1191 if ((current_architecture
& m68020up
) == 0) {
1193 } /* if target is not a '20 or better */
1196 if(opP
->ireg
!= FAIL
) {
1199 i
= try_index(&str
, opP
);
1201 opP
->error
= "Two index registers! not allowed!";
1205 i
= try_index(&str
, opP
);
1217 opP
->error
="Missing )";
1220 case ',': i
=0; break;
1221 case '(': i
++; break;
1222 case ')': --i
; break;
1226 opP
->con2
=add_exp(beg_str
,str
-2);
1228 if (str
[-1] == ',') {
1229 if (opP
->ireg
!= FAIL
) {
1230 opP
->error
= "Can't have two index regs";
1234 i
= try_index(&str
, opP
);
1237 opP
->error
= "malformed index reg";
1242 } else if (opP
->ireg
!= FAIL
) {
1252 opP
->error
="Junk after indirect";
1256 } /* m68k_ip_op() */
1261 short tc_coff_fix2rtype(fixP
)
1264 return (fixP
->fx_pcrel
?
1265 (fixP
->fx_size
== 1 ? R_PCRBYTE
:
1266 fixP
->fx_size
== 2 ? R_PCRWORD
:
1268 (fixP
->fx_size
== 1 ? R_RELBYTE
:
1269 fixP
->fx_size
== 2 ? R_RELWORD
:
1277 #ifdef TEST1 /* TEST1 tests m68k_ip_op(), which parses operands */
1281 struct m68k_op thark
;
1286 memset(&thark
, '\0', sizeof(thark
));
1287 if(!m68k_ip_op(buf
,&thark
)) printf("FAIL:");
1289 printf("op1 error %s in %s\n",thark
.error
,buf
);
1290 printf("mode %d, reg %d, ",thark
.mode
,thark
.reg
);
1292 printf("Constant: '%.*s',",1+thark
.e_const
-thark
.b_const
,thark
.b_const
);
1293 printf("ireg %d, isiz %d, imul %d ",thark
.ireg
,thark
.isiz
,thark
.imul
);
1295 printf("Iadd: '%.*s'",1+thark
.e_iadd
-thark
.b_iadd
,thark
.b_iadd
);
1304 static struct hash_control
* op_hash
= NULL
; /* handle of the OPCODE hash table
1305 NULL means any use before m68k_ip_begin()
1312 * This converts a string into a 68k instruction.
1313 * The string must be a bare single instruction in sun format
1314 * with RMS-style 68020 indirects
1317 * It provides some error messages: at most one fatal error message (which
1318 * stops the scan) and at most one warning message for each operand.
1319 * The 68k instruction is returned in exploded form, since we have no
1320 * knowledge of how you parse (or evaluate) your expressions.
1321 * We do however strip off and decode addressing modes and operation
1324 * This function's value is a string. If it is not "" then an internal
1325 * logic error was found: read this code to assign meaning to the string.
1326 * No argument string should generate such an error string:
1327 * it means a bug in our code, not in the user's text.
1329 * You MUST have called m68k_ip_begin() once and m86_ip_end() never before using
1333 /* JF this function no longer returns a useful value. Sorry */
1334 void m68k_ip (instring
)
1338 register struct m68k_op
*opP
;
1339 register struct m68k_incant
*opcode
;
1341 register int tmpreg
= 0, baseo
= 0, outro
= 0, nextword
;
1342 char *pdot
, *pdotmove
;
1347 char *crack_operand();
1348 LITTLENUM_TYPE words
[6];
1349 LITTLENUM_TYPE
*wordp
;
1350 unsigned long ok_arch
= 0;
1352 if (*instring
== ' ')
1353 instring
++; /* skip leading whitespace */
1355 /* Scan up to end of operation-code, which MUST end in end-of-string
1356 or exactly 1 space. */
1358 for (p
= instring
; *p
!= '\0'; p
++) {
1365 if (p
== instring
) {
1366 the_ins
.error
= "No operator";
1367 the_ins
.opcode
[0] = NULL
;
1368 /* the_ins.numo=1; */
1372 /* p now points to the end of the opcode name, probably whitespace.
1373 make sure the name is null terminated by clobbering the whitespace,
1374 look it up in the hash table, then fix it back.
1375 Remove a dot, first, since the opcode tables have none. */
1377 for (pdotmove
=pdot
; pdotmove
<p
; pdotmove
++)
1378 *pdotmove
=pdotmove
[1];
1384 opcode
= (struct m68k_incant
*)hash_find (op_hash
, instring
);
1388 for (pdotmove
=p
; pdotmove
>pdot
; pdotmove
--)
1389 *pdotmove
=pdotmove
[-1];
1394 if (opcode
== NULL
) {
1395 the_ins
.error
= "Unknown operator";
1396 the_ins
.opcode
[0] = NULL
;
1397 /* the_ins.numo=1; */
1401 /* found a legitimate opcode, start matching operands */
1402 while (*p
== ' ') ++p
;
1405 if (opcode
->m_operands
== 0) {
1406 char *old
= input_line_pointer
;
1408 input_line_pointer
= p
;
1409 /* Ahh - it's a motorola style psuedo op */
1410 mote_pseudo_table
[opcode
->m_opnum
].poc_handler
1411 ( mote_pseudo_table
[opcode
->m_opnum
].poc_val
);
1412 input_line_pointer
= old
;
1418 for(opP
= &the_ins
.operands
[0]; *p
; opP
++) {
1420 p
= crack_operand(p
, opP
);
1423 the_ins
.error
=opP
->error
;
1428 opsfound
= opP
- &the_ins
.operands
[0];
1430 /* This ugly hack is to support the floating pt opcodes in their standard form */
1431 /* Essentially, we fake a first enty of type COP#1 */
1432 if (opcode
->m_operands
[0]=='I') {
1435 for(n
=opsfound
;n
>0;--n
)
1436 the_ins
.operands
[n
]=the_ins
.operands
[n
-1];
1438 memset((char *)(&the_ins
.operands
[0]), '\0', sizeof(the_ins
.operands
[0]));
1439 the_ins
.operands
[0].mode
=MSCR
;
1440 the_ins
.operands
[0].reg
=COPNUM
; /* COP #1 */
1444 /* We've got the operands. Find an opcode that'll accept them */
1445 for (losing
= 0; ; ) {
1446 /* if we didn't get the right number of ops,
1447 or we have no common model with this pattern
1448 then reject this pattern. */
1450 if (opsfound
!= opcode
->m_opnum
1451 || ((opcode
->m_arch
& current_architecture
) == 0))
1454 ok_arch
|= opcode
->m_arch
;
1457 for (s
=opcode
->m_operands
, opP
= &the_ins
.operands
[0]; *s
&& !losing
; s
+= 2, opP
++) {
1458 /* Warning: this switch is huge! */
1459 /* I've tried to organize the cases into this order:
1460 non-alpha first, then alpha by letter. lower-case goes directly
1461 before uppercase counterpart. */
1462 /* Code with multiple case ...: gets sorted by the lowest case ...
1463 it belongs to. I hope this makes sense. */
1466 if (opP
->mode
== MSCR
|| opP
->mode
== IMMED
1467 || opP
->mode
== DREG
|| opP
->mode
== AREG
1468 || opP
->mode
== AINC
|| opP
->mode
== ADEC
1469 || opP
->mode
== REGLST
)
1474 switch (opP
->mode
) {
1475 case MSCR
: case IMMED
: case DREG
: case AREG
:
1476 case AINC
: case REGLST
: case AINDR
:
1482 if(opP
->mode
!=IMMED
)
1487 t
=get_num(opP
->con1
,80);
1488 if(s
[1]=='b' && !isbyte(t
))
1490 else if(s
[1]=='w' && !isword(t
))
1497 if(opP
->mode
!=IMMED
)
1502 if(opP
->mode
==MSCR
|| opP
->mode
==AREG
||
1503 opP
->mode
==IMMED
|| opP
->reg
==PC
|| opP
->reg
==ZPC
|| opP
->mode
==REGLST
)
1508 if(opP
->mode
==MSCR
|| opP
->reg
==PC
||
1509 opP
->reg
==ZPC
|| opP
->mode
==REGLST
)
1515 if(opP
->mode
==MSCR
|| opP
->mode
==DREG
||
1516 opP
->mode
==AREG
|| opP
->mode
==IMMED
|| opP
->reg
==PC
|| opP
->reg
==ZPC
||
1517 opP
->mode
==AINC
|| opP
->mode
==ADEC
|| opP
->mode
==REGLST
)
1522 if(opP
->mode
==MSCR
|| opP
->mode
==REGLST
)
1537 if(opP
->mode
==MSCR
|| opP
->mode
==AREG
||
1538 opP
->mode
==AINC
|| opP
->mode
==ADEC
|| opP
->mode
==IMMED
|| opP
->mode
==REGLST
)
1543 if(opP
->mode
==MSCR
|| opP
->mode
==AREG
|| opP
->mode
==REGLST
)
1548 if(opP
->mode
==MSCR
|| opP
->mode
==AREG
||
1549 opP
->mode
==AINC
|| opP
->mode
==ADEC
|| opP
->mode
==IMMED
|| opP
->reg
==PC
||
1550 opP
->reg
==ZPC
|| opP
->mode
==REGLST
)
1555 if(opP
->mode
==MSCR
|| opP
->mode
==AREG
||
1556 opP
->mode
==IMMED
|| opP
->mode
==REGLST
)
1560 case '~': /* For now! (JF FOO is this right?) */
1561 if(opP
->mode
==MSCR
|| opP
->mode
==DREG
||
1562 opP
->mode
==AREG
|| opP
->mode
==IMMED
|| opP
->reg
==PC
|| opP
->reg
==ZPC
|| opP
->mode
==REGLST
)
1567 if (opP
->mode
!= MSCR
|| (opP
->reg
!= TT0
&& opP
->reg
!= TT1
))
1576 if (opP
->mode
!= AINDR
) {
1578 } /* if not address register indirect */
1581 if(opP
->mode
!=ABSL
|| (flagseen
['S'] && instring
[0] == 'j'
1582 && instring
[1] == 'b'
1583 && instring
[2] == 's'
1584 && instring
[3] == 'r'))
1589 if(opP
->mode
!=MSCR
|| opP
->reg
!=CCR
)
1593 case 'd': /* FOO This mode is a KLUDGE!! */
1594 if(opP
->mode
!=AOFF
&& (opP
->mode
!=ABSL
||
1595 opP
->con1
->e_beg
[0]!='(' || opP
->con1
->e_end
[0]!=')'))
1605 if(opP
->mode
!=MSCR
|| opP
->reg
<(FPREG
+0) || opP
->reg
>(FPREG
+7))
1610 if(opP
->mode
!=MSCR
|| opP
->reg
<COPNUM
||
1616 if (opP
->mode
!= MSCR
1619 || cpu_of_arch(current_architecture
) < m68010
/* before 68010 had none */
1620 || (cpu_of_arch(current_architecture
) < m68020
1624 && opP
->reg
!= VBR
) /* 68010's had only these */
1625 || (cpu_of_arch(current_architecture
) < m68040
1633 && opP
->reg
!= ISP
) /* 680[23]0's have only these */
1634 || (cpu_of_arch(current_architecture
) == m68040
/* 68040 has all but this */
1635 && opP
->reg
== CAAR
)) {
1637 } /* doesn't cut it */
1641 if(opP
->mode
!=IMMED
)
1647 if(opP
->mode
==DREG
|| opP
->mode
==AREG
|| opP
->mode
==FPREG
) {
1652 opP
->reg
=1<<(opP
->reg
-DATA
);
1654 } else if(opP
->mode
!=REGLST
) {
1656 } else if(s
[1]=='8' && opP
->reg
&0x0FFffFF)
1658 else if(s
[1]=='3' && opP
->reg
&0x7000000)
1663 if(opP
->mode
!=IMMED
)
1668 t
=get_num(opP
->con1
,80);
1669 if(!issbyte(t
) || isvar(opP
->con1
))
1675 if(opP
->mode
!=DREG
&& opP
->mode
!=IMMED
)
1680 if(opP
->mode
!=IMMED
)
1685 t
=get_num(opP
->con1
,80);
1686 if(t
<1 || t
>8 || isvar(opP
->con1
))
1692 if(opP
->mode
!=DREG
&& opP
->mode
!=AREG
)
1697 if (opP
->mode
!=AINDR
&& opP
->mode
!=DINDR
)
1702 if(opP
->mode
!=MSCR
|| !(opP
->reg
==FPI
|| opP
->reg
==FPS
|| opP
->reg
==FPC
))
1707 if(opP
->mode
!=MSCR
|| opP
->reg
!=SR
)
1712 if (opP
->mode
!= IMMED
)
1716 long t
= get_num (opP
->con1
, 80);
1717 if (t
< 0 || t
> 7 || isvar (opP
->con1
))
1723 if(opP
->mode
!=MSCR
|| opP
->reg
!=USP
)
1727 /* JF these are out of order. We could put them
1728 in order if we were willing to put up with
1729 bunches of #ifdef m68851s in the code.
1731 Don't forget that you need these operands
1732 to use 68030 MMU instructions. */
1734 /* Memory addressing mode used by pflushr */
1736 if(opP
->mode
==MSCR
|| opP
->mode
==DREG
||
1737 opP
->mode
==AREG
|| opP
->mode
==REGLST
)
1742 if (opP
->mode
!= MSCR
|| (opP
->reg
!= SFC
&& opP
->reg
!= DFC
))
1747 if (opP
->mode
!= MSCR
1748 || (opP
->reg
!= TC
&& opP
->reg
!= CAL
1749 && opP
->reg
!= VAL
&& opP
->reg
!= SCC
&& opP
->reg
!= AC
))
1754 if (opP
->reg
!= VAL
)
1759 if (opP
->mode
!= MSCR
1760 || (opP
->reg
!= DRP
&& opP
->reg
!= SRP
1761 && opP
->reg
!= CRP
))
1766 if (opP
->mode
!= MSCR
||
1767 (!(opP
->reg
>= BAD
&& opP
->reg
<= BAD
+7) &&
1768 !(opP
->reg
>= BAC
&& opP
->reg
<= BAC
+7)))
1773 if (opP
->reg
!= PSR
)
1778 if (opP
->reg
!= PCSR
)
1786 && opP
->reg
!= BC
) {
1788 } /* not a cache specifier. */
1792 if (opP
->mode
!= ABSL
) {
1794 } /* not absolute */
1798 as_fatal("Internal error: Operand mode %c unknown in line %d of file \"%s\"",
1799 *s
, __LINE__
, __FILE__
);
1800 } /* switch on type of operand */
1804 } /* for each operand */
1805 } /* if immediately wrong */
1811 opcode
= opcode
->m_next
;
1815 && !(ok_arch
& current_architecture
))
1819 strcpy (buf
, "invalid instruction for this architecture; needs ");
1820 cp
= buf
+ strlen (buf
);
1824 strcpy (cp
, "fpu (68040 or 68881/68882)");
1827 strcpy (cp
, "mmu (68030 or 68851)");
1830 strcpy (cp
, "68020 or higher");
1833 strcpy (cp
, "68000 or higher");
1836 strcpy (cp
, "68010 or higher");
1840 int got_one
= 0, idx
;
1841 const static struct {
1854 for (idx
= 0; idx
< sizeof (archs
)/sizeof (archs
[0]); idx
++)
1856 if (archs
[idx
].arch
& ok_arch
)
1860 strcpy (cp
, " or ");
1864 strcpy (cp
, archs
[idx
].name
);
1876 the_ins
.error
= "operands mismatch";
1878 } /* Fell off the end */
1883 /* now assemble it */
1885 the_ins
.args
=opcode
->m_operands
;
1886 the_ins
.numargs
=opcode
->m_opnum
;
1887 the_ins
.numo
=opcode
->m_codenum
;
1888 the_ins
.opcode
[0]=getone(opcode
);
1889 the_ins
.opcode
[1]=gettwo(opcode
);
1891 for (s
= the_ins
.args
, opP
= &the_ins
.operands
[0]; *s
; s
+= 2, opP
++) {
1892 /* This switch is a doozy.
1893 Watch the first step; its a big one! */
1912 tmpreg
=0x3c; /* 7.4 */
1913 if (strchr("bwl",s
[1])) nextword
=get_num(opP
->con1
,80);
1914 else nextword
=nextword
=get_num(opP
->con1
,0);
1915 if(isvar(opP
->con1
))
1916 add_fix(s
[1],opP
->con1
,0);
1919 if(!isbyte(nextword
))
1920 opP
->error
="operand out of range";
1925 if(!isword(nextword
))
1926 opP
->error
="operand out of range";
1931 addword(nextword
>>16);
1953 as_fatal("Internal error: Can't decode %c%c in line %s of file \"%s\"",
1954 *s
, s
[1], __LINE__
, __FILE__
);
1959 /* We gotta put out some float */
1960 if(seg(opP
->con1
)!=SEG_BIG
) {
1961 int_to_gen(nextword
);
1962 gen_to_words(words
,baseo
,(long int)outro
);
1963 for(wordp
=words
;baseo
--;wordp
++)
1967 if(offs(opP
->con1
)>0) {
1968 as_warn("Bignum assumed to be binary bit-pattern");
1969 if(offs(opP
->con1
)>baseo
) {
1970 as_warn("Bignum too big for %c format; truncated",s
[1]);
1971 offs(opP
->con1
)=baseo
;
1973 baseo
-=offs(opP
->con1
);
1974 for(wordp
=generic_bignum
+offs(opP
->con1
)-1;offs(opP
->con1
)--;--wordp
)
1980 gen_to_words(words
,baseo
,(long)outro
);
1981 for (wordp
=words
;baseo
--;wordp
++)
1985 tmpreg
=opP
->reg
-DATA
; /* 0.dreg */
1988 tmpreg
=0x08+opP
->reg
-ADDR
; /* 1.areg */
1991 tmpreg
=0x10+opP
->reg
-ADDR
; /* 2.areg */
1994 tmpreg
=0x20+opP
->reg
-ADDR
; /* 4.areg */
1997 tmpreg
=0x18+opP
->reg
-ADDR
; /* 3.areg */
2001 nextword
=get_num(opP
->con1
,80);
2002 /* Force into index mode. Hope this works */
2004 /* We do the first bit for 32-bit displacements,
2005 and the second bit for 16 bit ones. It is
2006 possible that we should make the default be
2007 WORD instead of LONG, but I think that'd
2008 break GCC, so we put up with a little
2009 inefficiency for the sake of working output.
2012 if( !issword(nextword
)
2013 || ( isvar(opP
->con1
)
2014 && ( ( opP
->con1
->e_siz
==0
2015 && flagseen
['l']==0)
2016 || opP
->con1
->e_siz
==3))) {
2019 tmpreg
=0x3B; /* 7.3 */
2021 tmpreg
=0x30+opP
->reg
-ADDR
; /* 6.areg */
2022 if(isvar(opP
->con1
)) {
2024 add_frag(adds(opP
->con1
),
2026 TAB(PCLEA
,SZ_UNDEF
));
2030 add_fix('l',opP
->con1
,0);
2034 addword(nextword
>>16);
2037 tmpreg
=0x3A; /* 7.2 */
2039 tmpreg
=0x28+opP
->reg
-ADDR
; /* 5.areg */
2041 if(isvar(opP
->con1
)) {
2043 add_fix('w',opP
->con1
,1);
2045 add_fix('w',opP
->con1
,0);
2054 know(current_architecture
& m68020up
);
2055 /* intentional fall-through */
2058 baseo
=get_num(opP
->con1
,80);
2059 outro
=get_num(opP
->con2
,80);
2060 /* Figure out the 'addressing mode' */
2061 /* Also turn on the BASE_DISABLE bit, if needed */
2062 if(opP
->reg
==PC
|| opP
->reg
==ZPC
) {
2063 tmpreg
=0x3b; /* 7.3 */
2066 } else if(opP
->reg
==FAIL
) {
2068 tmpreg
=0x30; /* 6.garbage */
2069 } else tmpreg
=0x30+opP
->reg
-ADDR
; /* 6.areg */
2071 siz1
= (opP
->con1
) ? opP
->con1
->e_siz
: 0;
2072 siz2
= (opP
->con2
) ? opP
->con2
->e_siz
: 0;
2074 /* Index register stuff */
2075 if(opP
->ireg
>=DATA
+0 && opP
->ireg
<=ADDR
+7) {
2076 nextword
|=(opP
->ireg
-DATA
)<<12;
2078 if(opP
->isiz
==0 || opP
->isiz
==3)
2082 case 2: nextword
|=0x200; break;
2083 case 4: nextword
|=0x400; break;
2084 case 8: nextword
|=0x600; break;
2085 default: as_fatal("failed sanity check.");
2088 GET US OUT OF HERE! */
2090 /* Must be INDEX, with an index
2091 register. Address register
2092 cannot be ZERO-PC, and either
2093 :b was forced, or we know
2095 if( opP
->mode
==AINDX
2100 && !isvar(opP
->con1
)))) {
2101 nextword
+=baseo
&0xff;
2103 if(isvar(opP
->con1
))
2104 add_fix('B',opP
->con1
,0);
2108 nextword
|=0x40; /* No index reg */
2110 /* It aint simple */
2112 /* If the guy specified a width, we assume that
2113 it is wide enough. Maybe it isn't. If so, we lose
2117 if(isvar(opP
->con1
) || !issword(baseo
)) {
2128 as_warn("Byte dispacement won't work. Defaulting to :w");
2137 /* Figure out innner displacement stuff */
2138 if(opP
->mode
!=AINDX
) {
2141 if(isvar(opP
->con2
) || !issword(outro
)) {
2152 as_warn("Byte dispacement won't work. Defaulting to :w");
2160 if(opP
->mode
==APODX
) nextword
|=0x04;
2161 else if(opP
->mode
==AMIND
) nextword
|=0x40;
2165 if(isvar(opP
->con1
)) {
2166 if(opP
->reg
==PC
|| opP
->reg
==ZPC
) {
2167 add_fix(siz1
==3 ? 'l' : 'w',opP
->con1
,1);
2168 opP
->con1
->e_exp
.X_add_number
+=6;
2170 add_fix(siz1
==3 ? 'l' : 'w',opP
->con1
,0);
2177 if(isvar(opP
->con2
)) {
2178 if(opP
->reg
==PC
|| opP
->reg
==ZPC
) {
2179 add_fix(siz2
==3 ? 'l' : 'w',opP
->con2
,1);
2180 opP
->con1
->e_exp
.X_add_number
+=6;
2182 add_fix(siz2
==3 ? 'l' : 'w',opP
->con2
,0);
2192 nextword
=get_num(opP
->con1
,80);
2193 switch(opP
->con1
->e_siz
) {
2195 as_warn("Unknown size for absolute reference");
2197 if(!isvar(opP
->con1
) && issword(offs(opP
->con1
))) {
2198 tmpreg
=0x38; /* 7.0 */
2202 /* Don't generate pc relative code
2203 on 68010 and 68000 */
2206 && seg(opP
->con1
) == SEG_TEXT
2207 && now_seg
== SEG_TEXT
2208 && cpu_of_arch(current_architecture
) >= m68020
2210 && !strchr("~%&$?", s
[0])) {
2211 tmpreg
=0x3A; /* 7.2 */
2212 add_frag(adds(opP
->con1
),
2214 TAB(PCREL
,SZ_UNDEF
));
2217 case 3: /* Fall through into long */
2218 if(isvar(opP
->con1
))
2219 add_fix('l',opP
->con1
,0);
2221 tmpreg
=0x39; /* 7.1 mode */
2222 addword(nextword
>>16);
2227 if(isvar(opP
->con1
))
2228 add_fix('w',opP
->con1
,0);
2230 tmpreg
=0x38; /* 7.0 mode */
2236 as_bad("invalid indirect register");
2240 as_bad("unknown/incorrect operand");
2243 install_gen_operand(s
[1],tmpreg
);
2248 switch(s
[1]) { /* JF: I hate floating point! */
2263 tmpreg
=get_num(opP
->con1
,tmpreg
);
2264 if(isvar(opP
->con1
))
2265 add_fix(s
[1],opP
->con1
,0);
2267 case 'b': /* Danger: These do no check for
2268 certain types of overflow.
2271 opP
->error
="out of range";
2273 if(isvar(opP
->con1
))
2274 the_ins
.reloc
[the_ins
.nrel
-1].n
=(opcode
->m_codenum
)*2;
2278 opP
->error
="out of range";
2280 if(isvar(opP
->con1
))
2281 the_ins
.reloc
[the_ins
.nrel
-1].n
=(opcode
->m_codenum
)*2;
2284 insop(tmpreg
); /* Because of the way insop works, we put these two out backwards */
2286 if(isvar(opP
->con1
))
2287 the_ins
.reloc
[the_ins
.nrel
-1].n
=(opcode
->m_codenum
)*2;
2293 install_operand(s
[1],tmpreg
);
2296 as_fatal("Internal error: Unknown mode #%c in line %s of file \"%s\"", s
[1], __LINE__
, __FILE__
);
2304 install_operand(s
[1],opP
->reg
-ADDR
);
2308 tmpreg
=get_num(opP
->con1
,80);
2311 /* Needs no offsetting */
2312 add_fix('B',opP
->con1
,1);
2315 /* Offset the displacement to be relative to byte disp location */
2316 opP
->con1
->e_exp
.X_add_number
+=2;
2317 add_fix('w',opP
->con1
,1);
2322 if (cpu_of_arch(current_architecture
) < m68020
) /* 68000 or 010 */
2323 as_warn("Can't use long branches on 68000/68010");
2324 the_ins
.opcode
[the_ins
.numo
-1]|=0xff;
2325 /* Offset the displacement to be relative to byte disp location */
2326 opP
->con1
->e_exp
.X_add_number
+=4;
2327 add_fix('l',opP
->con1
,1);
2332 if(subs(opP
->con1
)) /* We can't relax it */
2335 /* This could either be a symbol, or an
2336 absolute address. No matter, the
2337 frag hacking will finger it out.
2338 Not quite: it can't switch from
2339 BRANCH to BCC68000 for the case
2340 where opnd is absolute (it needs
2341 to use the 68000 hack since no
2342 conditional abs jumps). */
2343 if (((cpu_of_arch(current_architecture
) < m68020
) || (0==adds(opP
->con1
)))
2344 && (the_ins
.opcode
[0] >= 0x6200)
2345 && (the_ins
.opcode
[0] <= 0x6f00)) {
2346 add_frag(adds(opP
->con1
),offs(opP
->con1
),TAB(BCC68000
,SZ_UNDEF
));
2348 add_frag(adds(opP
->con1
),offs(opP
->con1
),TAB(ABRANCH
,SZ_UNDEF
));
2352 if(isvar(opP
->con1
)) {
2353 /* check for DBcc instruction */
2354 if ((the_ins
.opcode
[0] & 0xf0f8) ==0x50c8) {
2355 /* size varies if patch */
2356 /* needed for long form */
2357 add_frag(adds(opP
->con1
),offs(opP
->con1
),TAB(DBCC
,SZ_UNDEF
));
2362 opP
->con1
->e_exp
.X_add_number
+=2;
2363 add_fix('w',opP
->con1
,1);
2367 case 'C': /* Fixed size LONG coproc branches */
2368 the_ins
.opcode
[the_ins
.numo
-1]|=0x40;
2369 /* Offset the displacement to be relative to byte disp location */
2370 /* Coproc branches don't have a byte disp option, but they are
2371 compatible with the ordinary branches, which do... */
2372 opP
->con1
->e_exp
.X_add_number
+=4;
2373 add_fix('l',opP
->con1
,1);
2377 case 'c': /* Var size Coprocesssor branches */
2378 if(subs(opP
->con1
)) {
2379 add_fix('l',opP
->con1
,1);
2380 add_frag((symbolS
*)0,(long)0,TAB(FBRANCH
,LONG
));
2381 } else if(adds(opP
->con1
)) {
2382 add_frag(adds(opP
->con1
),offs(opP
->con1
),TAB(FBRANCH
,SZ_UNDEF
));
2384 /* add_frag((symbolS *)0,offs(opP->con1),TAB(FBRANCH,SHORT)); */
2385 the_ins
.opcode
[the_ins
.numo
-1]|=0x40;
2386 add_fix('l',opP
->con1
,1);
2392 as_fatal("Internal error: operand type B%c unknown in line %s of file \"%s\"",
2393 s
[1], __LINE__
, __FILE__
);
2397 case 'C': /* Ignore it */
2400 case 'd': /* JF this is a kludge */
2401 if(opP
->mode
==AOFF
) {
2402 install_operand('s',opP
->reg
-ADDR
);
2406 tmpP
=opP
->con1
->e_end
-2;
2408 opP
->con1
->e_end
-=4; /* point to the , */
2409 baseo
=m68k_reg_parse(&tmpP
);
2410 if(baseo
<ADDR
+0 || baseo
>ADDR
+7) {
2411 as_bad("Unknown address reg, using A0");
2414 install_operand('s',baseo
);
2416 tmpreg
=get_num(opP
->con1
,80);
2417 if(!issword(tmpreg
)) {
2418 as_warn("Expression out of range, using 0");
2425 install_operand(s
[1],opP
->reg
-DATA
);
2429 install_operand(s
[1],opP
->reg
-FPREG
);
2433 tmpreg
=1+opP
->reg
-COPNUM
;
2436 install_operand(s
[1],tmpreg
);
2439 case 'J': /* JF foo */
2441 case SFC
: tmpreg
=0x000; break;
2442 case DFC
: tmpreg
=0x001; break;
2443 case CACR
: tmpreg
=0x002; break;
2444 case TC
: tmpreg
=0x003; break;
2445 case ITT0
: tmpreg
=0x004; break;
2446 case ITT1
: tmpreg
=0x005; break;
2447 case DTT0
: tmpreg
=0x006; break;
2448 case DTT1
: tmpreg
=0x007; break;
2450 case USP
: tmpreg
=0x800; break;
2451 case VBR
: tmpreg
=0x801; break;
2452 case CAAR
: tmpreg
=0x802; break;
2453 case MSP
: tmpreg
=0x803; break;
2454 case ISP
: tmpreg
=0x804; break;
2455 case MMUSR
: tmpreg
=0x805; break;
2456 case URP
: tmpreg
=0x806; break;
2457 case SRP
: tmpreg
=0x807; break;
2459 as_fatal("failed sanity check.");
2461 install_operand(s
[1],tmpreg
);
2465 tmpreg
=get_num(opP
->con1
,55);
2466 install_operand(s
[1],tmpreg
&0x7f);
2472 if(tmpreg
&0x7FF0000)
2473 as_bad("Floating point register in register list");
2474 insop(reverse_16_bits(tmpreg
));
2476 if(tmpreg
&0x700FFFF)
2477 as_bad("Wrong register in floating-point reglist");
2478 install_operand(s
[1],reverse_8_bits(tmpreg
>>16));
2485 if(tmpreg
&0x7FF0000)
2486 as_bad("Floating point register in register list");
2488 } else if(s
[1]=='8') {
2489 if(tmpreg
&0x0FFFFFF)
2490 as_bad("incorrect register in reglist");
2491 install_operand(s
[1],tmpreg
>>24);
2493 if(tmpreg
&0x700FFFF)
2494 as_bad("wrong register in floating-point reglist");
2496 install_operand(s
[1],tmpreg
>>16);
2501 install_operand(s
[1],get_num(opP
->con1
,60));
2505 tmpreg
= (opP
->mode
==DREG
)
2506 ? 0x20+opP
->reg
-DATA
2507 : (get_num(opP
->con1
,40)&0x1F);
2508 install_operand(s
[1],tmpreg
);
2512 tmpreg
=get_num(opP
->con1
,10);
2515 install_operand(s
[1],tmpreg
);
2520 /* This depends on the fact that ADDR registers are
2521 eight more than their corresponding DATA regs, so
2522 the result will have the ADDR_REG bit set */
2523 install_operand(s
[1],opP
->reg
-DATA
);
2527 if(opP
->reg
==FPI
) tmpreg
=0x1;
2528 else if(opP
->reg
==FPS
) tmpreg
=0x2;
2529 else if(opP
->reg
==FPC
) tmpreg
=0x4;
2530 else as_fatal("failed sanity check.");
2531 install_operand(s
[1],tmpreg
);
2534 case 'S': /* Ignore it */
2538 install_operand(s
[1],get_num(opP
->con1
,30));
2541 case 'U': /* Ignore it */
2546 case NC
: tmpreg
= 0; break;
2547 case DC
: tmpreg
= 1; break;
2548 case IC
: tmpreg
= 2; break;
2549 case BC
: tmpreg
= 3; break;
2551 as_fatal("failed sanity check");
2552 } /* switch on cache token */
2553 install_operand(s
[1], tmpreg
);
2556 /* JF: These are out of order, I fear. */
2566 as_fatal("failed sanity check.");
2568 install_operand(s
[1],tmpreg
);
2589 as_fatal("failed sanity check.");
2591 install_operand(s
[1],tmpreg
);
2595 if (opP
->reg
== VAL
)
2597 as_fatal("failed sanity check.");
2612 as_fatal("failed sanity check.");
2614 install_operand(s
[1],tmpreg
);
2619 case BAD
: case BAD
+1: case BAD
+2: case BAD
+3:
2620 case BAD
+4: case BAD
+5: case BAD
+6: case BAD
+7:
2621 tmpreg
= (4 << 10) | ((opP
->reg
- BAD
) << 2);
2624 case BAC
: case BAC
+1: case BAC
+2: case BAC
+3:
2625 case BAC
+4: case BAC
+5: case BAC
+6: case BAC
+7:
2626 tmpreg
= (5 << 10) | ((opP
->reg
- BAC
) << 2);
2630 as_fatal("failed sanity check.");
2632 install_operand(s
[1], tmpreg
);
2635 know(opP
->reg
== PSR
);
2638 know(opP
->reg
== PCSR
);
2651 as_fatal ("failed sanity check");
2653 install_operand (s
[1], tmpreg
);
2656 tmpreg
= get_num (opP
->con1
, 20);
2657 install_operand (s
[1], tmpreg
);
2659 case '_': /* used only for move16 absolute 32-bit address */
2660 tmpreg
=get_num(opP
->con1
,80);
2661 addword (tmpreg
>> 16);
2662 addword (tmpreg
& 0xFFFF);
2665 as_fatal("Internal error: Operand type %c unknown in line %d of file \"%s\"",
2666 s
[0], __LINE__
, __FILE__
);
2670 /* By the time whe get here (FINALLY) the_ins contains the complete
2671 instruction, ready to be emitted. . . */
2675 * get_regs := '/' + ?
2676 * | '-' + <register>
2677 * | '-' + <register> + ?
2682 * The idea here must be to scan in a set of registers but I don't
2683 * understand it. Looks awfully sloppy to me but I don't have any doc on
2690 static int get_regs(i
,str
,opP
)
2692 struct m68k_op
*opP
;
2695 /* 26, 25, 24, 23-16, 15-8, 0-7 */
2696 /* Low order 24 bits encoded fpc,fps,fpi,fp7-fp0,a7-a0,d7-d0 */
2697 unsigned long cur_regs
= 0;
2701 #define ADD_REG(x) { if(x==FPI) cur_regs|=(1<<24);\
2702 else if(x==FPS) cur_regs|=(1<<25);\
2703 else if(x==FPC) cur_regs|=(1<<26);\
2704 else cur_regs|=(1<<(x-1)); }
2711 } else if(*str
=='-') {
2713 reg2
=m68k_reg_parse(&str
);
2714 if(reg2
<DATA
|| reg2
>=FPREG
+8 || reg1
==FPI
|| reg1
==FPS
|| reg1
==FPC
) {
2715 opP
->error
="unknown register in register list";
2724 } else if(*str
=='\0') {
2728 opP
->error
="unknow character in register list";
2731 /* DJA -- Bug Fix. Did't handle d1-d2/a1 until the following instruction was added */
2734 reg1
=m68k_reg_parse(&str
);
2735 if((reg1
<DATA
|| reg1
>=FPREG
+8) && !(reg1
==FPI
|| reg1
==FPS
|| reg1
==FPC
)) {
2736 opP
->error
="unknown register in register list";
2744 static int reverse_16_bits(in
)
2750 static int mask
[16] = {
2751 0x0001,0x0002,0x0004,0x0008,0x0010,0x0020,0x0040,0x0080,
2752 0x0100,0x0200,0x0400,0x0800,0x1000,0x2000,0x4000,0x8000
2759 } /* reverse_16_bits() */
2761 static int reverse_8_bits(in
)
2767 static int mask
[8] = {
2768 0x0001,0x0002,0x0004,0x0008,0x0010,0x0020,0x0040,0x0080,
2776 } /* reverse_8_bits() */
2778 static void install_operand(mode
,val
)
2784 the_ins
.opcode
[0]|=val
& 0xFF; /* JF FF is for M kludge */
2787 the_ins
.opcode
[0]|=val
<<9;
2790 the_ins
.opcode
[1]|=val
<<12;
2793 the_ins
.opcode
[1]|=val
<<6;
2796 the_ins
.opcode
[1]|=val
;
2799 the_ins
.opcode
[2]|=val
<<12;
2802 the_ins
.opcode
[2]|=val
<<6;
2805 /* DANGER! This is a hack to force cas2l and cas2w cmds
2806 to be three words long! */
2808 the_ins
.opcode
[2]|=val
;
2811 the_ins
.opcode
[1]|=val
<<7;
2814 the_ins
.opcode
[1]|=val
<<10;
2818 the_ins
.opcode
[1]|=val
<<5;
2823 the_ins
.opcode
[1]|=(val
<<10)|(val
<<7);
2826 the_ins
.opcode
[1]|=(val
<<12)|val
;
2829 the_ins
.opcode
[0]|=val
=0xff;
2832 the_ins
.opcode
[0]|=val
<<9;
2835 the_ins
.opcode
[1]|=val
;
2838 the_ins
.opcode
[1]|=val
;
2839 the_ins
.numo
++; /* What a hack */
2842 the_ins
.opcode
[1]|=val
<<4;
2849 the_ins
.opcode
[0] |= (val
<< 6);
2852 the_ins
.opcode
[1] = (val
>> 16);
2853 the_ins
.opcode
[2] = val
& 0xffff;
2857 as_fatal("failed sanity check.");
2859 } /* install_operand() */
2861 static void install_gen_operand(mode
,val
)
2867 the_ins
.opcode
[0]|=val
;
2870 /* This is a kludge!!! */
2871 the_ins
.opcode
[0]|=(val
&0x07)<<9|(val
&0x38)<<3;
2880 the_ins
.opcode
[0]|=val
;
2882 /* more stuff goes here */
2884 as_fatal("failed sanity check.");
2886 } /* install_gen_operand() */
2889 * verify that we have some number of paren pairs, do m68k_ip_op(), and
2890 * then deal with the bitfield hack.
2893 static char *crack_operand(str
,opP
)
2895 register struct m68k_op
*opP
;
2897 register int parens
;
2899 register char *beg_str
;
2905 for(parens
=0;*str
&& (parens
>0 || notend(str
));str
++) {
2906 if(*str
=='(') parens
++;
2907 else if(*str
==')') {
2908 if(!parens
) { /* ERROR */
2909 opP
->error
="Extra )";
2915 if(!*str
&& parens
) { /* ERROR */
2916 opP
->error
="Missing )";
2921 if(m68k_ip_op(beg_str
,opP
)==FAIL
) {
2927 c
= *++str
; /* JF bitfield hack */
2931 as_bad("Missing operand");
2936 /* See the comment up above where the #define notend(... is */
2941 if(*s
==',') return 0;
2942 if(*s
=='{' || *s
=='}')
2944 if(*s
!=':') return 1;
2945 /* This kludge here is for the division cmd, which is a kludge */
2946 if(index("aAdD#",s
[1])) return 0;
2951 /* This is the guts of the machine-dependent assembler. STR points to a
2952 machine dependent instruction. This function is supposed to emit
2953 the frags/bytes it assembles to.
2957 insert_reg(regname
, regnum
)
2963 symbol_table_insert(symbol_new(regname
, SEG_REGISTER
, regnum
, &zero_address_frag
));
2965 for (i
= 0; regname
[i
]; i
++)
2966 buf
[i
] = islower (regname
[i
]) ? toupper (regname
[i
]) : regname
[i
];
2969 symbol_table_insert(symbol_new(buf
, SEG_REGISTER
, regnum
, &zero_address_frag
));
2972 static const struct {
3076 /* 68ec030 versions of same */
3079 /* 68ec030 access control unit, identical to 030 MMU status reg */
3091 for (i
= 0; init_table
[i
].name
; i
++)
3092 insert_reg(init_table
[i
].name
, init_table
[i
].number
);
3095 static int no_68851
, no_68881
;
3106 int shorts_this_frag
;
3107 static int done_first_time
;
3109 if (!done_first_time
)
3111 done_first_time
= 1;
3113 if (cpu_of_arch (current_architecture
) == 0)
3120 if (strcmp (TARGET_CPU
, "m68000") == 0)
3122 else if (strcmp (TARGET_CPU
, "m68010") == 0)
3124 else if (strcmp (TARGET_CPU
, "m68020") == 0
3125 || strcmp (TARGET_CPU
, "m68k") == 0)
3127 else if (strcmp (TARGET_CPU
, "m68030") == 0)
3129 else if (strcmp (TARGET_CPU
, "m68040") == 0)
3131 else if (strcmp (TARGET_CPU
, "cpu32") == 0)
3137 current_architecture
|= cpu_type
;
3139 if (current_architecture
& m68881
)
3141 if (current_architecture
& m68000
)
3142 as_bad ("incompatible processors 68000 and 68881/2 specified");
3143 if (current_architecture
& m68010
)
3144 as_bad ("incompatible processors 68010 and 68881/2 specified");
3145 if (current_architecture
& m68040
)
3146 as_bad ("incompatible processors 68040 and 68881/2 specified");
3148 /* What other incompatibilities ought we to check for? */
3150 /* Toss in some default assumptions about coprocessors. */
3152 && (cpu_of_arch (current_architecture
)
3153 /* Can CPU32 have a 68881 coprocessor?? */
3154 & (m68020
| m68030
| cpu32
)))
3156 current_architecture
|= m68881
;
3159 && (cpu_of_arch (current_architecture
) & m68020up
) != 0)
3161 current_architecture
|= m68851
;
3163 if (no_68881
&& (current_architecture
& m68881
))
3164 as_bad ("options for 68881 and no-68881 both given");
3165 if (no_68851
&& (current_architecture
& m68851
))
3166 as_bad ("options for 68851 and no-68851 both given");
3167 done_first_time
= 1;
3170 memset((char *)(&the_ins
), '\0', sizeof(the_ins
)); /* JF for paranoia sake */
3174 for(n
=the_ins
.numargs
;n
;--n
)
3175 if(the_ins
.operands
[n
].error
) {
3176 er
=the_ins
.operands
[n
].error
;
3181 as_bad("%s -- statement `%s' ignored",er
,str
);
3185 if(the_ins
.nfrag
==0) { /* No frag hacking involved; just put it out */
3186 toP
=frag_more(2*the_ins
.numo
);
3187 fromP
= &the_ins
.opcode
[0];
3188 for(m
=the_ins
.numo
;m
;--m
) {
3189 md_number_to_chars(toP
,(long)(*fromP
),2);
3193 /* put out symbol-dependent info */
3194 for(m
=0;m
<the_ins
.nrel
;m
++) {
3195 switch(the_ins
.reloc
[m
].wid
) {
3212 as_fatal("Don't know how to figure width of %c in md_assemble()",the_ins
.reloc
[m
].wid
);
3216 (toP
-frag_now
->fr_literal
)-the_ins
.numo
*2+the_ins
.reloc
[m
].n
,
3218 the_ins
.reloc
[m
].add
,
3219 the_ins
.reloc
[m
].sub
,
3220 the_ins
.reloc
[m
].off
,
3221 the_ins
.reloc
[m
].pcrel
,
3227 /* There's some frag hacking */
3228 for(n
=0,fromP
= &the_ins
.opcode
[0];n
<the_ins
.nfrag
;n
++) {
3231 if(n
==0) wid
=2*the_ins
.fragb
[n
].fragoff
;
3232 else wid
=2*(the_ins
.numo
-the_ins
.fragb
[n
-1].fragoff
);
3236 for(m
=wid
/2;m
;--m
) {
3237 md_number_to_chars(toP
,(long)(*fromP
),2);
3242 for(m
=0;m
<the_ins
.nrel
;m
++) {
3243 if((the_ins
.reloc
[m
].n
)>= 2*shorts_this_frag
/* 2*the_ins.fragb[n].fragoff */) {
3244 the_ins
.reloc
[m
].n
-= 2*shorts_this_frag
/* 2*the_ins.fragb[n].fragoff */;
3247 wid
=the_ins
.reloc
[m
].wid
;
3250 the_ins
.reloc
[m
].wid
=0;
3251 wid
= (wid
=='b') ? 1 : (wid
=='w') ? 2 : (wid
=='l') ? 4 : 4000;
3254 (toP
-frag_now
->fr_literal
)-the_ins
.numo
*2+the_ins
.reloc
[m
].n
,
3256 the_ins
.reloc
[m
].add
,
3257 the_ins
.reloc
[m
].sub
,
3258 the_ins
.reloc
[m
].off
,
3259 the_ins
.reloc
[m
].pcrel
,
3262 /* know(the_ins.fragb[n].fadd); */
3263 (void)frag_var(rs_machine_dependent
,10,0,(relax_substateT
)(the_ins
.fragb
[n
].fragty
),
3264 the_ins
.fragb
[n
].fadd
,the_ins
.fragb
[n
].foff
,to_beg_P
);
3266 n
=(the_ins
.numo
-the_ins
.fragb
[n
-1].fragoff
);
3269 toP
=frag_more(n
*sizeof(short));
3271 md_number_to_chars(toP
,(long)(*fromP
),2);
3277 for(m
=0;m
<the_ins
.nrel
;m
++) {
3280 wid
=the_ins
.reloc
[m
].wid
;
3283 the_ins
.reloc
[m
].wid
=0;
3284 wid
= (wid
=='b') ? 1 : (wid
=='w') ? 2 : (wid
=='l') ? 4 : 4000;
3287 (the_ins
.reloc
[m
].n
+ toP
-frag_now
->fr_literal
)-/* the_ins.numo */ shorts_this_frag
*2,
3289 the_ins
.reloc
[m
].add
,
3290 the_ins
.reloc
[m
].sub
,
3291 the_ins
.reloc
[m
].off
,
3292 the_ins
.reloc
[m
].pcrel
,
3303 * md_begin -- set up hash tables with 68000 instructions.
3304 * similar to what the vax assembler does. ---phr
3306 /* RMS claims the thing to do is take the m68k-opcode.h table, and make
3307 a copy of it at runtime, adding in the information we want but isn't
3308 there. I think it'd be better to have an awk script hack the table
3309 at compile time. Or even just xstr the table and use it as-is. But
3310 my lord ghod hath spoken, so we do it this way. Excuse the ugly var
3313 register const struct m68k_opcode
*ins
;
3314 register struct m68k_incant
*hack
,
3316 register char *retval
= 0; /* empty string, or error msg text */
3317 register unsigned int i
;
3320 if ((op_hash
= hash_new()) == NULL
)
3321 as_fatal("Virtual memory exhausted");
3323 obstack_begin(&robyn
,4000);
3324 for (ins
= m68k_opcodes
; ins
< endop
; ins
++) {
3325 hack
=slak
=(struct m68k_incant
*)obstack_alloc(&robyn
,sizeof(struct m68k_incant
));
3327 /* we *could* ignore insns that don't match our
3328 arch here but just leaving them out of the
3330 slak
->m_operands
=ins
->args
;
3331 slak
->m_opnum
=strlen(slak
->m_operands
)/2;
3332 slak
->m_arch
= ins
->arch
;
3333 slak
->m_opcode
=ins
->opcode
;
3334 /* This is kludgey */
3335 slak
->m_codenum
=((ins
->match
)&0xffffL
) ? 2 : 1;
3336 if((ins
+1)!=endop
&& !strcmp(ins
->name
,(ins
+1)->name
)) {
3337 slak
->m_next
=(struct m68k_incant
*) obstack_alloc(&robyn
,sizeof(struct m68k_incant
));
3344 retval
= hash_insert (op_hash
, ins
->name
,(char *)hack
);
3345 /* Didn't his mommy tell him about null pointers? */
3346 if(retval
&& *retval
)
3347 as_bad("Internal Error: Can't hash %s: %s",ins
->name
,retval
);
3350 for (i
= 0; i
< sizeof(mklower_table
) ; i
++)
3351 mklower_table
[i
] = (isupper(c
= (char) i
)) ? tolower(c
) : c
;
3353 for (i
= 0 ; i
< sizeof(notend_table
) ; i
++) {
3354 notend_table
[i
] = 0;
3355 alt_notend_table
[i
] = 0;
3357 notend_table
[','] = 1;
3358 notend_table
['{'] = 1;
3359 notend_table
['}'] = 1;
3360 alt_notend_table
['a'] = 1;
3361 alt_notend_table
['A'] = 1;
3362 alt_notend_table
['d'] = 1;
3363 alt_notend_table
['D'] = 1;
3364 alt_notend_table
['#'] = 1;
3365 alt_notend_table
['f'] = 1;
3366 alt_notend_table
['F'] = 1;
3367 #ifdef REGISTER_PREFIX
3368 alt_notend_table
[REGISTER_PREFIX
] = 1;
3371 #ifndef MIT_SYNTAX_ONLY
3372 /* Insert pseudo ops, these have to go into the opcode table since
3373 gas expects pseudo ops to start with a dot */
3376 while (mote_pseudo_table
[n
].poc_name
)
3378 hack
=(struct m68k_incant
*)
3379 obstack_alloc(&robyn
,sizeof(struct m68k_incant
));
3380 hash_insert(op_hash
,
3381 mote_pseudo_table
[n
].poc_name
, (char *)hack
);
3382 hack
->m_operands
= 0;
3393 #define notend(s) ((*s == ',' || *s == '}' || *s == '{' \
3394 || (*s == ':' && strchr("aAdD#", s[1]))) \
3398 /* This funciton is called once, before the assembler exits. It is
3399 supposed to do any final cleanup for this part of the assembler.
3406 /* Equal to MAX_PRECISION in atof-ieee.c */
3407 #define MAX_LITTLENUMS 6
3409 /* Turn a string in input_line_pointer into a floating point constant of type
3410 type, and store the appropriate bytes in *litP. The number of LITTLENUMS
3411 emitted is stored in *sizeP . An error message is returned, or NULL on OK.
3414 md_atof(type
,litP
,sizeP
)
3420 LITTLENUM_TYPE words
[MAX_LITTLENUMS
];
3421 LITTLENUM_TYPE
*wordP
;
3452 return "Bad call to MD_ATOF()";
3454 t
=atof_ieee(input_line_pointer
,type
,words
);
3456 input_line_pointer
=t
;
3458 *sizeP
=prec
* sizeof(LITTLENUM_TYPE
);
3459 for(wordP
=words
;prec
--;) {
3460 md_number_to_chars(litP
,(long)(*wordP
++),sizeof(LITTLENUM_TYPE
));
3461 litP
+=sizeof(LITTLENUM_TYPE
);
3463 return ""; /* Someone should teach Dean about null pointers */
3466 /* Turn an integer of n bytes (in val) into a stream of bytes appropriate
3467 for use in the a.out file, and stores them in the array pointed to by buf.
3468 This knows about the endian-ness of the target machine and does
3469 THE RIGHT THING, whatever it is. Possible values for n are 1 (byte)
3470 2 (short) and 4 (long) Floating numbers are put out as a series of
3471 LITTLENUMS (shorts, here at least)
3474 md_number_to_chars(buf
,val
,n
)
3494 as_fatal("failed sanity check.");
3499 md_apply_fix(fixP
, val
)
3503 char *buf
= fixP
->fx_where
+ fixP
->fx_frag
->fr_literal
;
3505 switch(fixP
->fx_size
) {
3520 BAD_CASE (fixP
->fx_size
);
3525 /* *fragP has been relaxed to its final size, and now needs to have
3526 the bytes inside it modified to conform to the new size There is UGLY
3530 md_convert_frag(headers
, fragP
)
3531 object_headers
*headers
;
3532 register fragS
*fragP
;
3537 /* Address in object code of the displacement. */
3538 register int object_address
= fragP
-> fr_fix
+ fragP
-> fr_address
;
3540 #ifdef IBM_COMPILER_SUX
3541 /* This is wrong but it convinces the native rs6000 compiler to
3542 generate the code we want. */
3543 register char *buffer_address
= fragP
-> fr_literal
;
3544 buffer_address
+= fragP
-> fr_fix
;
3545 #else /* IBM_COMPILER_SUX */
3546 /* Address in gas core of the place to store the displacement. */
3547 register char *buffer_address
= fragP
->fr_fix
+ fragP
->fr_literal
;
3548 #endif /* IBM_COMPILER_SUX */
3550 /* No longer true: know(fragP->fr_symbol); */
3552 /* The displacement of the address, from current location. */
3553 disp
= fragP
->fr_symbol
? S_GET_VALUE(fragP
->fr_symbol
) : 0;
3554 disp
= (disp
+ fragP
->fr_offset
) - object_address
;
3556 switch(fragP
->fr_subtype
) {
3557 case TAB(BCC68000
,BYTE
):
3558 case TAB(ABRANCH
,BYTE
):
3559 know(issbyte(disp
));
3561 as_bad("short branch with zero offset: use :w");
3562 fragP
->fr_opcode
[1]=disp
;
3565 case TAB(DBCC
,SHORT
):
3566 know(issword(disp
));
3569 case TAB(BCC68000
,SHORT
):
3570 case TAB(ABRANCH
,SHORT
):
3571 know(issword(disp
));
3572 fragP
->fr_opcode
[1]=0x00;
3575 case TAB(ABRANCH
,LONG
):
3576 if (cpu_of_arch(current_architecture
) < m68020
) {
3577 if (fragP
->fr_opcode
[0]==0x61) {
3578 fragP
->fr_opcode
[0]= 0x4E;
3579 fragP
->fr_opcode
[1]= 0xB9; /* JBSR with ABSL LONG offset */
3580 subseg_change(SEG_TEXT
, 0);
3593 } else if (fragP
->fr_opcode
[0]==0x60) {
3594 fragP
->fr_opcode
[0]= 0x4E;
3595 fragP
->fr_opcode
[1]= 0xF9; /* JMP with ABSL LONG offset */
3596 subseg_change(SEG_TEXT
, 0);
3597 fix_new(fragP
, fragP
->fr_fix
, 4, fragP
->fr_symbol
, 0, fragP
->fr_offset
,0,
3602 as_bad("Long branch offset not supported.");
3605 fragP
->fr_opcode
[1]=0xff;
3609 case TAB(BCC68000
,LONG
):
3610 /* only Bcc 68000 instructions can come here */
3611 /* change bcc into b!cc/jmp absl long */
3612 fragP
->fr_opcode
[0] ^= 0x01; /* invert bcc */
3613 fragP
->fr_opcode
[1] = 0x6; /* branch offset = 6 */
3615 /* JF: these used to be fr_opcode[2,3], but they may be in a
3616 different frag, in which case refering to them is a no-no.
3617 Only fr_opcode[0,1] are guaranteed to work. */
3618 *buffer_address
++ = 0x4e; /* put in jmp long (0x4ef9) */
3619 *buffer_address
++ = 0xf9;
3620 fragP
->fr_fix
+= 2; /* account for jmp instruction */
3621 subseg_change(SEG_TEXT
,0);
3622 fix_new(fragP
, fragP
->fr_fix
, 4, fragP
->fr_symbol
, 0,
3628 case TAB(DBCC
,LONG
):
3629 /* only DBcc 68000 instructions can come here */
3630 /* change dbcc into dbcc/jmp absl long */
3631 /* JF: these used to be fr_opcode[2-7], but that's wrong */
3632 *buffer_address
++ = 0x00; /* branch offset = 4 */
3633 *buffer_address
++ = 0x04;
3634 *buffer_address
++ = 0x60; /* put in bra pc+6 */
3635 *buffer_address
++ = 0x06;
3636 *buffer_address
++ = 0x4e; /* put in jmp long (0x4ef9) */
3637 *buffer_address
++ = 0xf9;
3639 fragP
->fr_fix
+= 6; /* account for bra/jmp instructions */
3640 subseg_change(SEG_TEXT
,0);
3641 fix_new(fragP
, fragP
->fr_fix
, 4, fragP
->fr_symbol
, 0,
3647 case TAB(FBRANCH
,SHORT
):
3648 know((fragP
->fr_opcode
[1]&0x40)==0);
3651 case TAB(FBRANCH
,LONG
):
3652 fragP
->fr_opcode
[1]|=0x40; /* Turn on LONG bit */
3655 case TAB(PCREL
,SHORT
):
3658 case TAB(PCREL
,LONG
):
3659 /* The thing to do here is force it to ABSOLUTE LONG, since
3660 PCREL is really trying to shorten an ABSOLUTE address anyway */
3661 /* JF FOO This code has not been tested */
3662 subseg_change(SEG_TEXT
,0);
3663 fix_new(fragP
, fragP
->fr_fix
, 4, fragP
->fr_symbol
, 0, fragP
->fr_offset
, 0, NO_RELOC
);
3664 if((fragP
->fr_opcode
[1] & 0x3F) != 0x3A)
3665 as_bad("Internal error (long PC-relative operand) for insn 0x%04lx at 0x%lx",
3666 fragP
->fr_opcode
[0],fragP
->fr_address
);
3667 fragP
->fr_opcode
[1]&= ~0x3F;
3668 fragP
->fr_opcode
[1]|=0x39; /* Mode 7.1 */
3670 /* md_number_to_chars(buffer_address,
3671 (long)(fragP->fr_symbol->sy_value + fragP->fr_offset),
3675 case TAB(PCLEA
,SHORT
):
3676 subseg_change(SEG_TEXT
,0);
3677 fix_new(fragP
,(int)(fragP
->fr_fix
),2,fragP
->fr_symbol
,(symbolS
*)0,fragP
->fr_offset
,1,
3679 fragP
->fr_opcode
[1] &= ~0x3F;
3680 fragP
->fr_opcode
[1] |= 0x3A;
3683 case TAB(PCLEA
,LONG
):
3684 subseg_change(SEG_TEXT
,0);
3685 fix_new(fragP
,(int)(fragP
->fr_fix
)+2,4,fragP
->fr_symbol
,(symbolS
*)0,fragP
->fr_offset
+2,1,
3687 *buffer_address
++ = 0x01;
3688 *buffer_address
++ = 0x70;
3690 /* buffer_address+=2; */
3694 } /* switch on subtype */
3697 md_number_to_chars(buffer_address
, (long) disp
, (int) ext
);
3698 fragP
->fr_fix
+= ext
;
3699 /* H_SET_TEXT_SIZE(headers, H_GET_TEXT_SIZE(headers) + ext); */
3700 } /* if extending */
3703 } /* md_convert_frag() */
3705 /* Force truly undefined symbols to their maximum size, and generally set up
3706 the frag list to be relaxed
3708 int md_estimate_size_before_relax(fragP
, segment
)
3709 register fragS
*fragP
;
3713 register char *buffer_address
= fragP
->fr_fix
+ fragP
->fr_literal
;
3715 old_fix
= fragP
->fr_fix
;
3717 /* handle SZ_UNDEF first, it can be changed to BYTE or SHORT */
3718 switch (fragP
->fr_subtype
) {
3720 case TAB(ABRANCH
,SZ_UNDEF
): {
3721 if((fragP
->fr_symbol
!= NULL
) /* Not absolute */
3722 && S_GET_SEGMENT(fragP
->fr_symbol
) == segment
) {
3723 fragP
->fr_subtype
=TAB(TABTYPE(fragP
->fr_subtype
),BYTE
);
3725 } else if((fragP
->fr_symbol
== 0) || (cpu_of_arch(current_architecture
) < m68020
)) {
3726 /* On 68000, or for absolute value, switch to abs long */
3727 /* FIXME, we should check abs val, pick short or long */
3728 if(fragP
->fr_opcode
[0]==0x61) {
3729 fragP
->fr_opcode
[0]= 0x4E;
3730 fragP
->fr_opcode
[1]= 0xB9; /* JBSR with ABSL LONG offset */
3731 subseg_change(SEG_TEXT
, 0);
3732 fix_new(fragP
, fragP
->fr_fix
, 4,
3733 fragP
->fr_symbol
, 0, fragP
->fr_offset
, 0, NO_RELOC
);
3736 } else if(fragP
->fr_opcode
[0]==0x60) {
3737 fragP
->fr_opcode
[0]= 0x4E;
3738 fragP
->fr_opcode
[1]= 0xF9; /* JMP with ABSL LONG offset */
3739 subseg_change(SEG_TEXT
, 0);
3740 fix_new(fragP
, fragP
->fr_fix
, 4,
3741 fragP
->fr_symbol
, 0, fragP
->fr_offset
, 0, NO_RELOC
);
3745 as_warn("Long branch offset to extern symbol not supported.");
3747 } else { /* Symbol is still undefined. Make it simple */
3748 fix_new(fragP
, (int)(fragP
->fr_fix
), 4, fragP
->fr_symbol
,
3749 (symbolS
*)0, fragP
->fr_offset
+4, 1, NO_RELOC
);
3751 fragP
->fr_opcode
[1]=0xff;
3757 } /* case TAB(ABRANCH,SZ_UNDEF) */
3759 case TAB(FBRANCH
,SZ_UNDEF
): {
3760 if(S_GET_SEGMENT(fragP
->fr_symbol
) == segment
|| flagseen
['l']) {
3761 fragP
->fr_subtype
= TAB(FBRANCH
,SHORT
);
3764 fragP
->fr_subtype
= TAB(FBRANCH
,LONG
);
3768 } /* TAB(FBRANCH,SZ_UNDEF) */
3770 case TAB(PCREL
,SZ_UNDEF
): {
3771 if(S_GET_SEGMENT(fragP
->fr_symbol
) == segment
|| flagseen
['l']) {
3772 fragP
->fr_subtype
= TAB(PCREL
,SHORT
);
3775 fragP
->fr_subtype
= TAB(PCREL
,LONG
);
3779 } /* TAB(PCREL,SZ_UNDEF) */
3781 case TAB(BCC68000
,SZ_UNDEF
): {
3782 if((fragP
->fr_symbol
!= NULL
)
3783 && S_GET_SEGMENT(fragP
->fr_symbol
) == segment
) {
3784 fragP
->fr_subtype
=TAB(BCC68000
,BYTE
);
3787 /* only Bcc 68000 instructions can come here */
3788 /* change bcc into b!cc/jmp absl long */
3789 fragP
->fr_opcode
[0] ^= 0x01; /* invert bcc */
3791 fragP
->fr_opcode
[1] = 0x04; /* branch offset = 6 */
3792 /* JF: these were fr_opcode[2,3] */
3793 buffer_address
[0] = 0x4e; /* put in jmp long (0x4ef9) */
3794 buffer_address
[1] = 0xf8;
3795 fragP
->fr_fix
+= 2; /* account for jmp instruction */
3796 subseg_change(SEG_TEXT
,0);
3797 fix_new(fragP
, fragP
->fr_fix
, 2, fragP
->fr_symbol
, 0,
3798 fragP
->fr_offset
, 0, NO_RELOC
);
3801 fragP
->fr_opcode
[1] = 0x06; /* branch offset = 6 */
3802 /* JF: these were fr_opcode[2,3] */
3803 buffer_address
[0] = 0x4e; /* put in jmp long (0x4ef9) */
3804 buffer_address
[1] = 0xf9;
3805 fragP
->fr_fix
+= 2; /* account for jmp instruction */
3806 subseg_change(SEG_TEXT
,0);
3807 fix_new(fragP
, fragP
->fr_fix
, 4, fragP
->fr_symbol
, 0,
3808 fragP
->fr_offset
, 0, NO_RELOC
);
3813 } /* case TAB(BCC68000,SZ_UNDEF) */
3815 case TAB(DBCC
,SZ_UNDEF
): {
3816 if (fragP
->fr_symbol
!= NULL
&& S_GET_SEGMENT(fragP
->fr_symbol
) == segment
) {
3817 fragP
->fr_subtype
=TAB(DBCC
,SHORT
);
3821 /* only DBcc 68000 instructions can come here */
3822 /* change dbcc into dbcc/jmp absl long */
3823 /* JF: these used to be fr_opcode[2-4], which is wrong. */
3824 buffer_address
[0] = 0x00; /* branch offset = 4 */
3825 buffer_address
[1] = 0x04;
3826 buffer_address
[2] = 0x60; /* put in bra pc + ... */
3829 /* JF: these were fr_opcode[5-7] */
3830 buffer_address
[3] = 0x04; /* plus 4 */
3831 buffer_address
[4] = 0x4e;/* Put in Jump Word */
3832 buffer_address
[5] = 0xf8;
3833 fragP
->fr_fix
+= 6; /* account for bra/jmp instruction */
3834 subseg_change(SEG_TEXT
,0);
3835 fix_new(fragP
, fragP
->fr_fix
, 2, fragP
->fr_symbol
, 0,
3838 fragP
->fr_offset
, 0, NO_RELOC
);
3841 /* JF: these were fr_opcode[5-7] */
3842 buffer_address
[3] = 0x06; /* Plus 6 */
3843 buffer_address
[4] = 0x4e; /* put in jmp long (0x4ef9) */
3844 buffer_address
[5] = 0xf9;
3845 fragP
->fr_fix
+= 6; /* account for bra/jmp instruction */
3846 subseg_change(SEG_TEXT
,0);
3847 fix_new(fragP
, fragP
->fr_fix
, 4, fragP
->fr_symbol
, 0,
3848 fragP
->fr_offset
, 0, NO_RELOC
);
3854 } /* case TAB(DBCC,SZ_UNDEF) */
3856 case TAB(PCLEA
,SZ_UNDEF
): {
3857 if ((S_GET_SEGMENT(fragP
->fr_symbol
))==segment
|| flagseen
['l']) {
3858 fragP
->fr_subtype
=TAB(PCLEA
,SHORT
);
3861 fragP
->fr_subtype
=TAB(PCLEA
,LONG
);
3865 } /* TAB(PCLEA,SZ_UNDEF) */
3870 } /* switch on subtype looking for SZ_UNDEF's. */
3872 /* now that SZ_UNDEF are taken care of, check others */
3873 switch (fragP
->fr_subtype
) {
3874 case TAB(BCC68000
,BYTE
):
3875 case TAB(ABRANCH
,BYTE
):
3876 /* We can't do a short jump to the next instruction,
3877 so we force word mode. */
3878 if (fragP
->fr_symbol
&& S_GET_VALUE(fragP
->fr_symbol
)==0 &&
3879 fragP
->fr_symbol
->sy_frag
==fragP
->fr_next
) {
3880 fragP
->fr_subtype
=TAB(TABTYPE(fragP
->fr_subtype
),SHORT
);
3887 return fragP
->fr_var
+ fragP
->fr_fix
- old_fix
;
3890 #if defined(OBJ_AOUT) | defined(OBJ_BOUT)
3891 /* the bit-field entries in the relocation_info struct plays hell
3892 with the byte-order problems of cross-assembly. So as a hack,
3893 I added this mach. dependent ri twiddler. Ugly, but it gets
3895 /* on m68k: first 4 bytes are normal unsigned long, next three bytes
3896 are symbolnum, most sig. byte first. Last byte is broken up with
3897 bit 7 as pcrel, bits 6 & 5 as length, bit 4 as pcrel, and the lower
3898 nibble as nuthin. (on Sun 3 at least) */
3899 /* Translate the internal relocation information into target-specific
3903 md_ri_to_chars(the_bytes
, ri
)
3905 struct reloc_info_generic
*ri
;
3908 md_number_to_chars(the_bytes
, ri
->r_address
, 4);
3909 /* now the fun stuff */
3910 the_bytes
[4] = (ri
->r_symbolnum
>> 16) & 0x0ff;
3911 the_bytes
[5] = (ri
->r_symbolnum
>> 8) & 0x0ff;
3912 the_bytes
[6] = ri
->r_symbolnum
& 0x0ff;
3913 the_bytes
[7] = (((ri
->r_pcrel
<< 7) & 0x80) | ((ri
->r_length
<< 5) & 0x60) |
3914 ((ri
->r_extern
<< 4) & 0x10));
3916 #endif /* comment */
3918 void tc_aout_fix_to_chars(where
, fixP
, segment_address_in_file
)
3921 relax_addressT segment_address_in_file
;
3924 * In: length of relocation (or of address) in chars: 1, 2 or 4.
3925 * Out: GNU LD relocation length code: 0, 1, or 2.
3928 static unsigned char nbytes_r_length
[] = { 42, 0, 1, 42, 2 };
3931 know(fixP
->fx_addsy
!= NULL
);
3933 md_number_to_chars(where
,
3934 fixP
->fx_frag
->fr_address
+ fixP
->fx_where
- segment_address_in_file
,
3937 r_symbolnum
= (S_IS_DEFINED(fixP
->fx_addsy
)
3938 ? S_GET_TYPE(fixP
->fx_addsy
)
3939 : fixP
->fx_addsy
->sy_number
);
3941 where
[4] = (r_symbolnum
>> 16) & 0x0ff;
3942 where
[5] = (r_symbolnum
>> 8) & 0x0ff;
3943 where
[6] = r_symbolnum
& 0x0ff;
3944 where
[7] = (((fixP
->fx_pcrel
<< 7) & 0x80) | ((nbytes_r_length
[fixP
->fx_size
] << 5) & 0x60) |
3945 (((!S_IS_DEFINED(fixP
->fx_addsy
)) << 4) & 0x10));
3948 } /* tc_aout_fix_to_chars() */
3950 #endif /* OBJ_AOUT or OBJ_BOUT */
3952 #ifndef WORKING_DOT_WORD
3953 const int md_short_jump_size
= 4;
3954 const int md_long_jump_size
= 6;
3957 md_create_short_jump(ptr
,from_addr
,to_addr
,frag
,to_symbol
)
3966 offset
= to_addr
- (from_addr
+2);
3968 md_number_to_chars(ptr
,(long)0x6000,2);
3969 md_number_to_chars(ptr
+2,(long)offset
,2);
3973 md_create_long_jump(ptr
,from_addr
,to_addr
,frag
,to_symbol
)
3982 if (cpu_of_arch(current_architecture
) < m68020
) {
3983 offset
=to_addr
-S_GET_VALUE(to_symbol
);
3984 md_number_to_chars(ptr
,(long)0x4EF9,2);
3985 md_number_to_chars(ptr
+2,(long)offset
,4);
3986 fix_new(frag
,(ptr
+2)-frag
->fr_literal
,4,to_symbol
,(symbolS
*)0,(long)0,0,
3989 offset
=to_addr
- (from_addr
+2);
3990 md_number_to_chars(ptr
,(long)0x60ff,2);
3991 md_number_to_chars(ptr
+2,(long)offset
,4);
3996 /* Different values of OK tell what its OK to return. Things that aren't OK are an error (what a shock, no?)
3999 10: Absolute 1:8 only
4000 20: Absolute 0:7 only
4001 30: absolute 0:15 only
4002 40: Absolute 0:31 only
4003 50: absolute 0:127 only
4004 55: absolute -64:63 only
4005 60: absolute -128:127 only
4006 70: absolute 0:4095 only
4011 static int get_num(exp
,ok
)
4012 struct m68k_exp
*exp
;
4020 if(*exp
->e_beg
=='0') {
4021 if(exp
->e_beg
[1]=='x')
4022 sscanf(exp
->e_beg
+2,"%x",&l
);
4024 sscanf(exp
->e_beg
+1,"%O",&l
);
4027 return atol(exp
->e_beg
);
4033 /* Can't do anything */
4036 if(!exp
->e_beg
|| !exp
->e_end
) {
4037 seg(exp
)=SEG_ABSOLUTE
;
4040 offs(exp
)= (ok
==10) ? 1 : 0;
4041 as_warn("Null expression defaults to %ld",offs(exp
));
4046 if(/* ok!=80 && */ (exp
->e_end
[-1]==':' || exp
->e_end
[-1]=='.')
4047 && (exp
->e_end
-exp
->e_beg
)>=2) {
4048 switch(exp
->e_end
[0]) {
4067 if (exp
->e_end
[-1] == ':')
4068 as_bad("Unknown size for expression \"%c\"",exp
->e_end
[0]);
4072 c_save
=exp
->e_end
[1];
4074 save_in
=input_line_pointer
;
4075 input_line_pointer
=exp
->e_beg
;
4076 switch(expression(&(exp
->e_exp
))) {
4078 seg(exp
)=SEG_ABSOLUTE
;
4081 offs(exp
)= (ok
==10) ? 1 : 0;
4082 as_warn("Unknown expression: '%s' defaulting to %d",exp
->e_beg
,offs(exp
));
4086 /* Do the same thing the VAX asm does */
4087 seg(exp
)=SEG_ABSOLUTE
;
4092 as_warn("expression out of range: defaulting to 1");
4099 if(offs(exp
)<1 || offs(exp
)>8) {
4100 as_warn("expression out of range: defaulting to 1");
4105 if(offs(exp
)<0 || offs(exp
)>7)
4109 if(offs(exp
)<0 || offs(exp
)>15)
4113 if(offs(exp
)<0 || offs(exp
)>32)
4117 if(offs(exp
)<0 || offs(exp
)>127)
4121 if(offs(exp
)<-64 || offs(exp
)>63)
4125 if(offs(exp
)<-128 || offs(exp
)>127)
4129 if(offs(exp
)<0 || offs(exp
)>4095) {
4131 as_warn("expression out of range: defaulting to 0");
4143 case SEG_DIFFERENCE
:
4144 if(ok
>=10 && ok
<=70) {
4145 seg(exp
)=SEG_ABSOLUTE
;
4148 offs(exp
)= (ok
==10) ? 1 : 0;
4149 as_warn("Can't deal with expression \"%s\": defaulting to %ld",exp
->e_beg
,offs(exp
));
4153 if (offs (exp
) < 0 /* flonum */
4154 && (ok
== 80 /* no bignums */
4155 || (ok
> 10 /* small-int ranges including 0 ok */
4156 /* If we have a flonum zero, a zero integer should
4157 do as well (e.g., in moveq). */
4158 && generic_floating_point_number
.exponent
== 0
4159 && generic_floating_point_number
.low
[0] == 0)))
4161 /* HACK! Turn it into a long */
4162 LITTLENUM_TYPE words
[6];
4164 gen_to_words(words
,2,8L);/* These numbers are magic! */
4165 seg(exp
)=SEG_ABSOLUTE
;
4168 offs(exp
)=words
[1]|(words
[0]<<16);
4171 seg(exp
)=SEG_ABSOLUTE
;
4174 offs(exp
)= (ok
==10) ? 1 : 0;
4175 as_warn("Can't deal with expression \"%s\": defaulting to %ld",exp
->e_beg
,offs(exp
));
4179 as_fatal("failed sanity check.");
4181 if(input_line_pointer
!=exp
->e_end
+1)
4182 as_bad("Ignoring junk after expression");
4183 exp
->e_end
[1]=c_save
;
4184 input_line_pointer
=save_in
;
4186 switch(exp
->e_siz
) {
4188 if(!isbyte(offs(exp
)))
4189 as_warn("expression doesn't fit in BYTE");
4192 if(!isword(offs(exp
)))
4193 as_warn("expression doesn't fit in WORD");
4201 /* These are the back-ends for the various machine dependent pseudo-ops. */
4202 void demand_empty_rest_of_line(); /* Hate those extra verbose names */
4204 static void s_data1() {
4205 subseg_new(SEG_DATA
,1);
4206 demand_empty_rest_of_line();
4209 static void s_data2() {
4210 subseg_new(SEG_DATA
,2);
4211 demand_empty_rest_of_line();
4216 /* We don't support putting frags in the BSS segment, we fake it
4217 by marking in_bss, then looking at s_skip for clues */
4219 subseg_new(SEG_BSS
, 0);
4220 demand_empty_rest_of_line();
4223 static void s_even() {
4225 register long temp_fill
;
4227 temp
= 1; /* JF should be 2? */
4228 temp_fill
= get_absolute_expression ();
4229 if ( ! need_pass_2
) /* Never make frag if expect extra pass. */
4230 frag_align (temp
, (int)temp_fill
);
4231 demand_empty_rest_of_line();
4234 static void s_proc() {
4235 demand_empty_rest_of_line();
4238 /* s_space is defined in read.c .skip is simply an alias to it. */
4242 * Invocation line includes a switch not recognized by the base assembler.
4243 * See if it's a processor-specific option. These are:
4245 * -[A]m[c]68000, -[A]m[c]68008, -[A]m[c]68010, -[A]m[c]68020, -[A]m[c]68030, -[A]m[c]68040
4246 * -[A]m[c]68881, -[A]m[c]68882, -[A]m[c]68851
4247 * Select the architecture. Instructions or features not
4248 * supported by the selected architecture cause fatal
4249 * errors. More than one may be specified. The default is
4250 * -m68020 -m68851 -m68881. Note that -m68008 is a synonym
4251 * for -m68000, and -m68882 is a synonym for -m68881.
4252 * -[A]m[c]no-68851, -[A]m[c]no-68881
4253 * Don't accept 688?1 instructions. (The "c" is kind of silly,
4254 * so don't use or document it, but that's the way the parsing
4257 * MAYBE_FLOAT_TOO is defined below so that specifying a processor type
4258 * (e.g. m68020) also requests that float instructions be included. This
4259 * is the default setup, mostly to avoid hassling users. A better
4260 * rearrangement of this structure would be to add an option to DENY
4261 * floating point opcodes, for people who want to really know there's none
4262 * of that funny floaty stuff going on. FIXME-later.
4264 #ifndef MAYBE_FLOAT_TOO
4265 #define MAYBE_FLOAT_TOO /* m68881 */ 0 /* this is handled later */
4268 int md_parse_option(argP
,cntP
,vecP
)
4274 case 'l': /* -l means keep external to 2 bit offset
4275 rather than 16 bit one */
4278 case 'S': /* -S means that jbsr's always turn into jsr's. */
4283 /* intentional fall-through */
4289 } /* allow an optional "c" */
4291 if (!strcmp(*argP
, "68000")
4292 || !strcmp(*argP
, "68008")) {
4293 current_architecture
|= m68000
;
4294 } else if (!strcmp(*argP
, "68010")) {
4296 omagic
= 1<<16|OMAGIC
;
4298 current_architecture
|= m68010
;
4300 } else if (!strcmp(*argP
, "68020")) {
4301 current_architecture
|= m68020
| MAYBE_FLOAT_TOO
;
4303 } else if (!strcmp(*argP
, "68030")) {
4304 current_architecture
|= m68030
| MAYBE_FLOAT_TOO
;
4306 } else if (!strcmp(*argP
, "68040")) {
4307 current_architecture
|= m68040
| MAYBE_FLOAT_TOO
;
4310 } else if (!strcmp(*argP
, "68881")) {
4311 current_architecture
|= m68881
;
4313 } else if (!strcmp(*argP
, "68882")) {
4314 current_architecture
|= m68882
;
4315 #endif /* NO_68881 */
4316 /* Even if we aren't configured to support the processor,
4317 it should still be possible to assert that the user
4318 doesn't have it... */
4319 } else if (!strcmp (*argP
, "no-68881")
4320 || !strcmp (*argP
, "no-68882")) {
4323 } else if (!strcmp(*argP
,"68851")) {
4324 current_architecture
|= m68851
;
4325 #endif /* NO_68851 */
4326 } else if (!strcmp (*argP
, "no-68851")) {
4328 } else if (!strcmp (*argP
, "pu32")) { /* "-mcpu32" */
4329 current_architecture
|= cpu32
;
4331 as_warn("Unknown architecture, \"%s\". option ignored", *argP
);
4332 } /* switch on architecture */
4334 while(**argP
) (*argP
)++;
4339 if (!strcmp(*argP
,"pic")) {
4341 break; /* -pic, Position Independent Code */
4355 /* TEST2: Test md_assemble() */
4356 /* Warning, this routine probably doesn't work anymore */
4360 struct m68k_it the_ins
;
4367 if(!gets(buf
) || !*buf
)
4369 if(buf
[0]=='|' || buf
[1]=='.')
4371 for(cp
=buf
;*cp
;cp
++)
4376 memset(&the_ins
, '\0', sizeof(the_ins
));
4377 m68k_ip(&the_ins
,buf
);
4379 printf("Error %s in %s\n",the_ins
.error
,buf
);
4381 printf("Opcode(%d.%s): ",the_ins
.numo
,the_ins
.args
);
4382 for(n
=0;n
<the_ins
.numo
;n
++)
4383 printf(" 0x%x",the_ins
.opcode
[n
]&0xffff);
4385 print_the_insn(&the_ins
.opcode
[0],stdout
);
4386 (void)putchar('\n');
4388 for(n
=0;n
<strlen(the_ins
.args
)/2;n
++) {
4389 if(the_ins
.operands
[n
].error
) {
4390 printf("op%d Error %s in %s\n",n
,the_ins
.operands
[n
].error
,buf
);
4393 printf("mode %d, reg %d, ",the_ins
.operands
[n
].mode
,the_ins
.operands
[n
].reg
);
4394 if(the_ins
.operands
[n
].b_const
)
4395 printf("Constant: '%.*s', ",1+the_ins
.operands
[n
].e_const
-the_ins
.operands
[n
].b_const
,the_ins
.operands
[n
].b_const
);
4396 printf("ireg %d, isiz %d, imul %d, ",the_ins
.operands
[n
].ireg
,the_ins
.operands
[n
].isiz
,the_ins
.operands
[n
].imul
);
4397 if(the_ins
.operands
[n
].b_iadd
)
4398 printf("Iadd: '%.*s',",1+the_ins
.operands
[n
].e_iadd
-the_ins
.operands
[n
].b_iadd
,the_ins
.operands
[n
].b_iadd
);
4399 (void)putchar('\n');
4411 while(*str
&& *str
!=' ')
4413 if(str
[-1]==':' || str
[1]=='=')
4420 /* Possible states for relaxation:
4422 0 0 branch offset byte (bra, etc)
4426 1 0 indexed offsets byte a0@(32,d4:w:1) etc
4430 2 0 two-offset index word-word a0@(32,d4)@(45) etc
4449 extern fragS
*text_frag_root
;
4451 for(fragP
=text_frag_root
;fragP
;fragP
=fragP
->fr_next
) {
4452 printf("addr %lu next 0x%x fix %ld var %ld symbol 0x%x offset %ld\n",
4453 fragP
->fr_address
,fragP
->fr_next
,fragP
->fr_fix
,fragP
->fr_var
,fragP
->fr_symbol
,fragP
->fr_offset
);
4454 printf("opcode 0x%x type %d subtype %d\n\n",fragP
->fr_opcode
,fragP
->fr_type
,fragP
->fr_subtype
);
4466 fputs("Internal error:",stderr
);
4467 _doprnt(format
,&args
,stderr
);
4468 (void)putc('\n',stderr
);
4474 /* We have no need to default values of symbols. */
4478 md_undefined_symbol (name
)
4484 /* Parse an operand that is machine-specific.
4485 We just return without modifying the expression if we have nothing
4490 md_operand (expressionP
)
4491 expressionS
*expressionP
;
4495 /* Round up a section size to the appropriate boundary. */
4497 md_section_align (segment
, size
)
4501 return size
; /* Byte alignment is fine */
4504 /* Exactly what point is a PC-relative offset relative TO?
4505 On the 68k, they're relative to the address of the offset, plus
4506 its size. (??? Is this right? FIXME-SOON!) */
4508 md_pcrel_from (fixP
)
4511 return(fixP
->fx_size
+ fixP
->fx_where
+ fixP
->fx_frag
->fr_address
);
4515 tc_coff_symbol_emit_hook ()
4520 tc_coff_sizemachdep(frag
)
4523 switch (frag
->fr_subtype
& 0x3)
4525 case BYTE
: return 1;
4526 case SHORT
: return 2;
4527 case LONG
: return 4;
4539 /* end of tc-m68k.c */