Annotation of MiNT/src/trans.c, revision 1.1.1.1

1.1       root        1: /*
                      2: 
                      3:  * translation routines; sometimes we pass data on
                      4: 
                      5:  * through directly (asm syntax->asm syntax, with
                      6: 
                      7:  * some macro expansion), and other times we also
                      8: 
                      9:  * do asm syntax->gas syntax translation
                     10: 
                     11:  */
                     12: 
                     13: 
                     14: 
                     15: #include "asmtrans.h"
                     16: 
                     17: 
                     18: 
                     19: int syntax = GAS;
                     20: 
                     21: 
                     22: 
                     23: char *
                     24: 
                     25: immediate(op)
                     26: 
                     27:        char *op;
                     28: 
                     29: {
                     30: 
                     31:        return concat("#", op);
                     32: 
                     33: }
                     34: 
                     35: 
                     36: 
                     37: char *
                     38: 
                     39: indirect(op)
                     40: 
                     41:        char *op;
                     42: 
                     43: {
                     44: 
                     45:        if (syntax == GAS) {
                     46: 
                     47:                return concat(op, "@");
                     48: 
                     49:        } else {
                     50: 
                     51:                return concat3("(", op, ")");
                     52: 
                     53:        }
                     54: 
                     55: }
                     56: 
                     57: 
                     58: 
                     59: char *
                     60: 
                     61: postinc(op)
                     62: 
                     63:        char *op;
                     64: 
                     65: {
                     66: 
                     67:        if (syntax == GAS) {
                     68: 
                     69:                return concat(op, "@+");
                     70: 
                     71:        } else {
                     72: 
                     73:                return concat3("(", op, ")+");
                     74: 
                     75:        }
                     76: 
                     77: }
                     78: 
                     79: 
                     80: 
                     81: char *
                     82: 
                     83: predec(op)
                     84: 
                     85:        char *op;
                     86: 
                     87: {
                     88: 
                     89:        if (syntax == GAS) {
                     90: 
                     91:                return concat(op, "@-");
                     92: 
                     93:        } else {
                     94: 
                     95:                return concat3("-(", op, ")");
                     96: 
                     97:        }
                     98: 
                     99: }
                    100: 
                    101: 
                    102: 
                    103: char *
                    104: 
                    105: indexed(op1, op2)
                    106: 
                    107:        char *op1, *op2;
                    108: 
                    109: {
                    110: 
                    111:        if (syntax == GAS) {
                    112: 
                    113:                return concat4(op2, "@(", op1, ")");
                    114: 
                    115:        } else {
                    116: 
                    117:                return concat4(op1, "(", op2, ")");
                    118: 
                    119:        }
                    120: 
                    121: }
                    122: 
                    123: 
                    124: 
                    125: char *
                    126: 
                    127: sizedop(op, size)
                    128: 
                    129:        char *op, *size;
                    130: 
                    131: {
                    132: 
                    133:        if (syntax == GAS) {
                    134: 
                    135:                return changesiz(concat(op, size));
                    136: 
                    137:        } else {
                    138: 
                    139:                return concat4("(", op, ")", size);
                    140: 
                    141:        }
                    142: 
                    143: }
                    144: 
                    145: 
                    146: 
                    147: char *
                    148: 
                    149: twoindex(disp, base, index)
                    150: 
                    151:        char *disp, *base, *index;
                    152: 
                    153: {
                    154: 
                    155:        if (syntax == GAS) {
                    156: 
                    157:                return concat6(base, "@(", disp, ",", changesiz(index), ")");
                    158: 
                    159:        } else {
                    160: 
                    161:                return concat6(disp, "(", base, ",", index, ")");
                    162: 
                    163:        }
                    164: 
                    165: }
                    166: 
                    167: 
                    168: 
                    169: char *
                    170: 
                    171: bitfield(op1, op2, op3)
                    172: 
                    173:        char *op1, *op2, *op3;
                    174: 
                    175: {
                    176: 
                    177:        if (syntax == GAS) {
                    178: 
                    179:                return concat6(op1, "{#", op2, ":#", op3, "}");
                    180: 
                    181:        } else {
                    182: 
                    183:                return concat6(op1, "{", op2, ":", op3, "}");
                    184: 
                    185:        }
                    186: 
                    187: }
                    188: 
                    189: 
                    190: 
                    191: char *
                    192: 
                    193: do_ops(label, opcode, space, operand)
                    194: 
                    195:        char *label, *opcode, *space, *operand;
                    196: 
                    197: {
                    198: 
                    199:        static char temp[LINSIZ];
                    200: 
                    201:        static char optemp[40];
                    202: 
                    203:        char *to, *from;
                    204: 
                    205:        char c;
                    206: 
                    207: 
                    208: 
                    209:        if (syntax == GAS) {
                    210: 
                    211:            if (!strcmp(opcode, "ds.l")) {
                    212: 
                    213:                strcpy(temp, "\t.even\n\t.comm");
                    214: 
                    215:                strcat(temp, space);
                    216: 
                    217:                strcat(temp, label);
                    218: 
                    219:                strcat(temp, ",");
                    220: 
                    221:                strcat(temp, "4*");
                    222: 
                    223:                strcat(temp, operand);
                    224: 
                    225:                return strdup(temp);
                    226: 
                    227:            } else if (!strcmp(opcode, "ds.w")) {
                    228: 
                    229:                strcpy(temp, "\t.even\n\t.comm");
                    230: 
                    231:                strcat(temp, space);
                    232: 
                    233:                strcat(temp, label);
                    234: 
                    235:                strcat(temp, ",");
                    236: 
                    237:                strcat(temp, "2*");
                    238: 
                    239:                strcat(temp, operand);
                    240: 
                    241:                return strdup(temp);
                    242: 
                    243:            } else if (!strcmp(opcode, "ds.b")) {
                    244: 
                    245:                strcpy(temp, "\t.comm");
                    246: 
                    247:                strcat(temp, space);
                    248: 
                    249:                strcat(temp, label);
                    250: 
                    251:                strcat(temp, ",");
                    252: 
                    253:                strcat(temp, operand);
                    254: 
                    255:                return strdup(temp);
                    256: 
                    257:            } else {
                    258: 
                    259:                to = optemp;
                    260: 
                    261:                from = opcode;
                    262: 
                    263:                for(;;) {
                    264: 
                    265:                        c = *from++;
                    266: 
                    267:                        if (!c) break;
                    268: 
                    269:        /* change 'foo.b' -> 'foob' */
                    270: 
                    271:        /* special case: bra.s -> 'bra', since gas automatically
                    272: 
                    273:         * selects offset sizes and since some gas's actually
                    274: 
                    275:         * mess up if an explicit '.s' is given
                    276: 
                    277:         */
                    278: 
                    279:                        if (c == '.' && *from && from[1] == 0) {
                    280: 
                    281:                                if (*from == 's') from++;
                    282: 
                    283:                                continue;
                    284: 
                    285:                        }
                    286: 
                    287:                        *to++ = c;
                    288: 
                    289:                }
                    290: 
                    291:                *to = 0;
                    292: 
                    293:                opcode = optemp;
                    294: 
                    295:            }
                    296: 
                    297:        }
                    298: 
                    299: 
                    300: 
                    301:        to = temp;
                    302: 
                    303: 
                    304: 
                    305:        if (*label) {
                    306: 
                    307:                int colonseen = 0;
                    308: 
                    309:                char c;
                    310: 
                    311: 
                    312: 
                    313:                for (from = label; (c = *from++) != 0;) {
                    314: 
                    315:                        if (c == ':') colonseen = 1;
                    316: 
                    317:                        *to++ = c;
                    318: 
                    319:                }
                    320: 
                    321: /* gas labels must have a ':' after them */
                    322: 
                    323:                if (!colonseen && syntax == GAS)
                    324: 
                    325:                        *to++ = ':';
                    326: 
                    327:        }
                    328: 
                    329: 
                    330: 
                    331:        *to++ = '\t';
                    332: 
                    333:        strcpy(to, opcode);
                    334: 
                    335:        strcat(temp, space);
                    336: 
                    337:        strcat(temp, operand);
                    338: 
                    339:        return strdup(temp);
                    340: 
                    341: }
                    342: 
                    343: 
                    344: 
                    345: char *
                    346: 
                    347: changesiz(op)
                    348: 
                    349:        char *op;
                    350: 
                    351: {
                    352: 
                    353:        char *r = op;
                    354: 
                    355: 
                    356: 
                    357:        if (syntax != GAS) return op;
                    358: 
                    359: 
                    360: 
                    361:        while (*op) {
                    362: 
                    363:                if (*op == '.') *op = ':';
                    364: 
                    365:                op++;
                    366: 
                    367:        }
                    368: 
                    369:        return r;
                    370: 
                    371: }
                    372: 
                    373: 
                    374: 
                    375: char *
                    376: 
                    377: hexop(op)
                    378: 
                    379:        char *op;
                    380: 
                    381: {
                    382: 
                    383:        if (syntax == GAS)
                    384: 
                    385:                return concat("0x", op);
                    386: 
                    387:        else
                    388: 
                    389:                return concat("$", op);
                    390: 
                    391: }
                    392: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.