dupuy@CS.COLUMBIA.EDU (Alexander Dupuy) (09/28/89)
In order to use GAS properly on the Sun-2, it is necessary to make the default ouput be for 68000, however, it should still be possible to generate 68020 code if desired. Sun allows this via the -m68010 and -m68020 flags, which work on both Sun-2 and Sun-3 assemblers, with the obvious default on each machine. It seemed helpful in doing this to clearly separate whether or not a -m flag had been given from the type of cpu for which code was being generated. This will be useful if/when Motorola adds additional instructions/modes/... in the 68040. In addition, it seems useful to support generating a.out files with the old magic number OMAGIC rather than (1<<16)|OMAGIC, for Sun-2s running releases prior to 3.0, or other 68000 boxes; this can be supported by a -m68000 flag. Here are context diffs to m-sun3.h and m68k.c from the 1.34 (not I guess) GAS which make those changes. They have been tested on a Sun-2 running 4.0. *** /tmp/,RCSt1a20311 Wed Sep 27 19:55:29 1989 --- m-sun3.h Wed Sep 27 19:47:47 1989 *************** *** 1,4 **** ! /* m-sun3.h -- 68020 version of the assembler for the Sun-3 Copyright (C) 1987 Free Software Foundation, Inc. This file is part of GAS, the GNU Assembler. --- 1,4 ---- ! /* m-sun3.h -- 680[12]0 version of the assembler for the Sun-[23] Copyright (C) 1987 Free Software Foundation, Inc. This file is part of GAS, the GNU Assembler. *************** *** 19,31 **** ! /* This header file contains the #defines specific ! to SUN computer SUN 3 series computers. (The only kind ! we have around here, unfortunatly.) ! ! Rumor has it that this file will work on the Sun-2 if the assembler ! is called with -m68010 This is not tested. */ #define M_SUN 1 #define SUN_ASM_SYNTAX --- 19,28 ---- ! /* This header file contains the #defines specific to SUN computers running ! version 3.0 or later. */ + /* #define CPU mc68000 /* for Sun-2, undefine this line */ #define M_SUN 1 #define SUN_ASM_SYNTAX *** /tmp/,RCSt1a20311 Wed Sep 27 19:55:30 1989 --- m68k.c Wed Sep 27 19:48:19 1989 *************** *** 32,43 **** #include "md.h" #include "m68k.h" #ifdef M_SUN /* This variable contains the value to write out at the beginning of ! the a.out file. The 2<<16 means that this is a 68020 file instead ! of an old-style 68000 file */ ! long omagic = 2<<16|OMAGIC; /* Magic byte for header file */ #else long omagic = OMAGIC; #endif --- 32,51 ---- #include "md.h" #include "m68k.h" + #ifndef CPU + #define CPU 2 + #endif + + #undef mc68000 + #undef mc68020 + + static enum { mc68000=1, mc68020=2 } cputype = CPU; + #ifdef M_SUN /* This variable contains the value to write out at the beginning of ! the a.out file. */ ! long omagic = ((int)CPU)<<16|OMAGIC; /* Magic byte for header file */ #else long omagic = OMAGIC; #endif *************** *** 1596,1602 **** !subs(opP->con1) && seg(opP->con1)==SEG_TEXT && now_seg==SEG_TEXT && ! flagseen['m']==0 && !index("~%&$?", s[0])) { tmpreg=0x3A; /* 7.2 */ add_frag(adds(opP->con1), --- 1604,1610 ---- !subs(opP->con1) && seg(opP->con1)==SEG_TEXT && now_seg==SEG_TEXT && ! cputype!=mc68000 && !index("~%&$?", s[0])) { tmpreg=0x3A; /* 7.2 */ add_frag(adds(opP->con1), *************** *** 1718,1724 **** addword(0); addword(0); } else if(adds(opP->con1)) { ! if (flagseen['m'] && (the_ins.opcode[0] >= 0x6200) && (the_ins.opcode[0] <= 0x6f00)) { add_frag(adds(opP->con1),offs(opP->con1),TAB(BCC68000,SZ_UNDEF)); --- 1726,1732 ---- addword(0); addword(0); } else if(adds(opP->con1)) { ! if (cputype==mc68000 && (the_ins.opcode[0] >= 0x6200) && (the_ins.opcode[0] <= 0x6f00)) { add_frag(adds(opP->con1),offs(opP->con1),TAB(BCC68000,SZ_UNDEF)); *************** *** 2683,2689 **** ext=2; break; case TAB(BRANCH,LONG): ! if(flagseen['m']) { if(fragP->fr_opcode[0]==0x61) { fragP->fr_opcode[0]= 0x4E; fragP->fr_opcode[1]= 0xB9; /* JBSR with ABSL LONG offset */ --- 2691,2697 ---- ext=2; break; case TAB(BRANCH,LONG): ! if(cputype==mc68000) { if(fragP->fr_opcode[0]==0x61) { fragP->fr_opcode[0]= 0x4E; fragP->fr_opcode[1]= 0xB9; /* JBSR with ABSL LONG offset */ *************** *** 2834,2840 **** if((fragP->fr_symbol->sy_type&N_TYPE)==segtype) { fragP->fr_subtype=TAB(TABTYPE(fragP->fr_subtype),BYTE); break; ! } else if(flagseen['m']) { if(fragP->fr_opcode[0]==0x61) { fragP->fr_opcode[0]= 0x4E; fragP->fr_opcode[1]= 0xB9; /* JBSR with ABSL LONG offset */ --- 2842,2848 ---- if((fragP->fr_symbol->sy_type&N_TYPE)==segtype) { fragP->fr_subtype=TAB(TABTYPE(fragP->fr_subtype),BYTE); break; ! } else if(cputype==mc68000) { if(fragP->fr_opcode[0]==0x61) { fragP->fr_opcode[0]= 0x4E; fragP->fr_opcode[1]= 0xB9; /* JBSR with ABSL LONG offset */ *************** *** 2958,2964 **** { long offset; ! if(flagseen['m']) { offset=to_addr-to_symbol->sy_value; md_number_to_chars(ptr ,(long)0x4EF9,2); md_number_to_chars(ptr+2,(long)offset,4); --- 2966,2972 ---- { long offset; ! if(cputype==mc68000) { offset=to_addr-to_symbol->sy_value; md_number_to_chars(ptr ,(long)0x4EF9,2); md_number_to_chars(ptr+2,(long)offset,4); *************** *** 3194,3213 **** break; case 'm': ! /* Gas simply ignores this option! */ (*argP)++; if(**argP=='c') (*argP)++; ! if(!strcmp(*argP,"68000")) ! flagseen['m']=2; ! else if(!strcmp(*argP,"68010")) { #ifdef M_SUN omagic= 1<<16|OMAGIC; #endif flagseen['m']=1; ! } else if(!strcmp(*argP,"68020")) ! flagseen['m']=0; ! else as_warn("Unknown -m option ignored"); while(**argP) (*argP)++; --- 3202,3227 ---- break; case 'm': ! /* specify whether 68020 code can be generated */ (*argP)++; if(**argP=='c') (*argP)++; ! if(!strcmp(*argP,"68000")) { ! cputype = mc68000; ! flagseen['m']=1; ! } else if(!strcmp(*argP,"68010")) { #ifdef M_SUN omagic= 1<<16|OMAGIC; #endif + cputype = mc68000; flagseen['m']=1; ! } else if(!strcmp(*argP,"68020")) { ! #ifdef M_SUN ! omagic= 2<<16|OMAGIC; ! #endif ! cputype = mc68020; ! flagseen['m']=1; ! } else as_warn("Unknown -m option ignored"); while(**argP) (*argP)++;