📄 alpha.md
字号:
stmt: ASGNI2(addr,reg) "stw $%1,%0\n" 1stmt: ASGNU2(addr,reg) "stw $%1,%0\n" 1stmt: ASGNI4(addr,reg) "stl $%1,%0\n" 1stmt: ASGNU4(addr,reg) "stl $%1,%0\n" 1stmt: ASGNI8(addr,reg) "stq $%1,%0\n" 1stmt: ASGNU8(addr,reg) "stq $%1,%0\n" 1stmt: ASGNP8(addr,reg) "stq $%1,%0\n" 1reg: INDIRI1(reg) "ldb $%c,($%0)\n" 1reg: INDIRI2(reg) "ldw $%c,($%0)\n" 1reg: INDIRI4(addr) "ldl $%c,%0\n" 1reg: INDIRI8(addr) "ldq $%c,%0\n" 1reg: INDIRP8(addr) "ldq $%c,%0\n" 1reg: INDIRU1(reg) "ldbu $%c,($%0)\n" 1reg: INDIRU2(reg) "ldwu $%c,($%0)\n" 1reg: INDIRU4(addr) "ldl $%c,%0\nzap $%c,240,$%c\n" 2reg: INDIRU8(addr) "ldq $%c,%0\n" 1reg: CVII4(INDIRI1(reg)) "ldb $%c,($%0)\n" 1reg: CVII8(INDIRI1(reg)) "ldb $%c,($%0)\n" 1reg: CVII4(INDIRI2(reg)) "ldw $%c,($%0)\n" 1reg: CVII8(INDIRI2(reg)) "ldw $%c,($%0)\n" 1reg: CVII8(INDIRI4(addr)) "ldl $%c,%0\n" 1reg: CVUU4(INDIRU1(reg)) "ldbu $%c,($%0)\n" 1reg: CVUU8(INDIRU1(reg)) "ldbu $%c,($%0)\n" 1reg: CVUU4(INDIRU2(reg)) "ldwu $%c,($%0)\n" 1reg: CVUU8(INDIRU2(reg)) "ldwu $%c,($%0)\n" 1reg: CVUU8(INDIRU4(addr)) "ldl $%c,%0\nzap $%c,240,$%c\n" 2reg: CVUI4(INDIRU1(reg)) "ldbu $%c,($%0)\n" 1reg: CVUI8(INDIRU1(reg)) "ldbu $%c,($%0)\n" 1reg: CVUI4(INDIRU2(reg)) "ldwu $%c,($%0)\n" 1reg: CVUI8(INDIRU2(reg)) "ldwu $%c,($%0)\n" 1reg: CVUI8(INDIRU4(addr)) "ldl $%c,%0\nzap $%c,240,$%c\n" 2reg: CVIU8(reg) "mov $%0,$%c\n" move(a)reg: INDIRF4(addr) "lds $f%c,%0\n" 1reg: INDIRF8(addr) "ldt $f%c,%0\n" 1stmt: ASGNF4(addr,reg) "sts $f%1,%0\n" 1stmt: ASGNF8(addr,reg) "stt $f%1,%0\n" 1reg: MULI4(reg,rc) "mull $%0,%1,$%c\n" 1reg: MULI8(reg,rc) "mulq $%0,%1,$%c\n" 1reg: MULU4(reg,rc) "mull $%0,%1,$%c\nzap $%c,240,$%c\n" 2reg: MULU8(reg,rc) "mulq $%0,%1,$%c\n" 1reg: DIVI4(reg,rc) "divl $%0,%1,$%c\n" 1reg: DIVI8(reg,rc) "divq $%0,%1,$%c\n" 1reg: DIVU4(reg,rc) "divlu $%0,%1,$%c\n" 1reg: DIVU8(reg,rc) "divqu $%0,%1,$%c\n" 1reg: MODI4(reg,rc) "reml $%0,%1,$%c\n" 1reg: MODI8(reg,rc) "remq $%0,%1,$%c\n" 1reg: MODU4(reg,rc) "remlu $%0,%1,$%c\n" 1reg: MODU8(reg,rc) "remqu $%0,%1,$%c\n" 1rc: con "%0"rc: reg "$%0"reg: ADDI4(reg,rc) "addl $%0,%1,$%c\n" 1reg: ADDI8(reg,rc) "addq $%0,%1,$%c\n" 1reg: ADDP8(reg,rc) "addq $%0,%1,$%c\n" 1reg: ADDU4(reg,rc) "addl $%0,%1,$%c\nzap $%c,240,$%c\n" 2reg: ADDU8(reg,rc) "addq $%0,%1,$%c\n" 1reg: SUBI4(reg,rc) "subl $%0,%1,$%c\n" 1reg: SUBI8(reg,rc) "subq $%0,%1,$%c\n" 1reg: SUBP8(reg,rc) "subq $%0,%1,$%c\n" 1reg: SUBU4(reg,rc) "subl $%0,%1,$%c\nzap $%c,240,$%c\n" 2reg: SUBU8(reg,rc) "subq $%0,%1,$%c\n" 1reg: BANDI4(reg,rc) "and $%0,%1,$%c\naddl $%c,0,$%c\n" 2reg: BANDI8(reg,rc) "and $%0,%1,$%c\n" 1reg: BANDU4(reg,rc) "and $%0,%1,$%c\n" 1reg: BANDU8(reg,rc) "and $%0,%1,$%c\n" 1reg: BORI4(reg,rc) "or $%0,%1,$%c\naddl $%c,0,$%c\n" 2reg: BORI8(reg,rc) "or $%0,%1,$%c\n" 1reg: BORU4(reg,rc) "or $%0,%1,$%c\n" 1reg: BORU8(reg,rc) "or $%0,%1,$%c\n" 1reg: BXORI4(reg,rc) "xor $%0,%1,$%c\naddl $%c,0,$%c\n" 2reg: BXORI8(reg,rc) "xor $%0,%1,$%c\n" 1reg: BXORU4(reg,rc) "xor $%0,%1,$%c\n" 1reg: BXORU8(reg,rc) "xor $%0,%1,$%c\n" 1rc6: CNSTI4 "%a" range(a,0,63)rc6: CNSTI8 "%a" range(a,0,63)rc6: reg "$%0"reg: LSHI4(reg,rc6) "sll $%0,%1,$%c\naddl $%c,0,$%c\n" 2reg: LSHI8(reg,rc6) "sll $%0,%1,$%c\n" 1reg: LSHU4(reg,rc6) "sll $%0,%1,$%c\nzap $%c,240,$%c\n" 2reg: LSHU8(reg,rc6) "sll $%0,%1,$%c\n" 1reg: RSHI4(reg,rc6) "sra $%0,%1,$%c\naddl $%c,0,$%c\n" 2reg: RSHI8(reg,rc6) "sra $%0,%1,$%c\n" 1reg: RSHU4(reg,rc6) "srl $%0,%1,$%c\n" 1reg: RSHU8(reg,rc6) "srl $%0,%1,$%c\n" 1reg: BCOMI4(reg) "not $%0,$%c\naddl $%c,0,$%c\n" 2reg: BCOMU4(reg) "not $%0,$%c\nzap $%c,240,$%c\n" 2reg: BCOMI8(reg) "not $%0,$%c\n" 1reg: BCOMU8(reg) "not $%0,$%c\n" 1reg: NEGI4(reg) "negl $%0,$%c\n" 1reg: NEGI8(reg) "negq $%0,$%c\n" 1reg: LOADI1(reg) "mov $%0,$%c\n" move(a)reg: LOADI2(reg) "mov $%0,$%c\n" move(a)reg: LOADI4(reg) "mov $%0,$%c\n" move(a)reg: LOADI8(reg) "mov $%0,$%c\n" move(a)reg: LOADP8(reg) "mov $%0,$%c\n" move(a)reg: LOADU1(reg) "mov $%0,$%c\n" move(a)reg: LOADU2(reg) "mov $%0,$%c\n" move(a)reg: LOADU4(reg) "mov $%0,$%c\n" move(a)reg: LOADU8(reg) "mov $%0,$%c\n" move(a)reg: ADDF4(reg,reg) "adds $f%0,$f%1,$f%c\n" 1reg: ADDF8(reg,reg) "addt $f%0,$f%1,$f%c\n" 1reg: DIVF4(reg,reg) "divs $f%0,$f%1,$f%c\n" 1reg: DIVF8(reg,reg) "divt $f%0,$f%1,$f%c\n" 1reg: MULF4(reg,reg) "muls $f%0,$f%1,$f%c\n" 1reg: MULF8(reg,reg) "mult $f%0,$f%1,$f%c\n" 1reg: SUBF4(reg,reg) "subs $f%0,$f%1,$f%c\n" 1reg: SUBF8(reg,reg) "subt $f%0,$f%1,$f%c\n" 1reg: LOADF4(reg) "fmov $f%0,$f%c\n" move(a)reg: LOADF8(reg) "fmov $f%0,$f%c\n" move(a)reg: NEGF4(reg) "negs $f%0,$f%c\n" 1reg: NEGF8(reg) "negt $f%0,$f%c\n" 1reg: CVII4(reg) "sll $%0,8*(8-%a),$%c\nsra $%c,8*(8-%a),$%c\n" 2reg: CVII8(reg) "sll $%0,8*(8-%a),$%c\nsra $%c,8*(8-%a),$%c\n" 2reg: CVUI4(reg) "and $%0,(1<<(8*%a))-1,$%c\n" 1reg: CVUI8(reg) "and $%0,(1<<(8*%a))-1,$%c\n" 1reg: CVUU4(reg) "and $%0,(1<<(8*%a))-1,$%c\n" 1reg: CVUU8(reg) "and $%0,(1<<(8*%a))-1,$%c\n" 1reg: CVUP8(reg) "and $%0,(1<<(8*%a))-1,$%c\n" 1reg: CVFF4(reg) "cvtts $f%0,$f%c\n" 1reg: CVFF8(reg) "cvtst $f%0,$f%c\n" 1reg: CVIF4(reg) "stq $%0,-56+%F($sp)\nldt $%f%c,-56+%F($sp)\ncvtqs $f%c,$f%c\n" 3reg: CVIF8(reg) "stq $%0,-56+%F($sp)\nldt $%f%c,-56+%F($sp)\ncvtqt $f%c,$f%c\n" 3reg: CVIF4(INDIRI4(addr)) "lds $f%c,%0\ncvtlq $f%c,$f%c\ncvtqs $f%c,$f%c\n" 3reg: CVIF4(INDIRI8(addr)) "ldt $f%c,%0\ncvtqs $f%c,$f%c\n" 2reg: CVIF8(INDIRI4(addr)) "lds $f%c,%0\ncvtlq $f%c,$f%c\ncvtqt $f%c,$f%c\n" 3reg: CVIF8(INDIRI8(addr)) "ldt $f%c,%0\ncvtqt $f%c,$f%c\n" 2reg: CVFI4(reg) "cvttqc $f%0,$f1\ncvtql $f1,$f1\nsts $f1,-56+%F($sp)\nldl $%c,-56+%F($sp)\n" 4reg: CVFI8(reg) "cvttqc $f%0,$f1\nstt $f1,-56+%F($sp)\nldq $%c,-56+%F($sp)\n" 3stmt: LABELV "%a:\n"stmt: JUMPV(acon) "br %0\n" 1stmt: JUMPV(reg) "jmp ($%0)\n" 1stmt: EQI4(reg,rc6) "cmpeq $%0,%1,$23\nbne $23,%a\n" 2stmt: EQU4(reg,rc6) "cmpeq $%0,%1,$23\nbne $23,%a\n" 2stmt: EQI8(reg,rc6) "cmpeq $%0,%1,$23\nbne $23,%a\n" 2stmt: EQU8(reg,rc6) "cmpeq $%0,%1,$23\nbne $23,%a\n" 2stmt: NEI4(reg,rc6) "cmpeq $%0,%1,$23\nbeq $23,%a\n" 2stmt: NEU4(reg,rc6) "cmpeq $%0,%1,$23\nbeq $23,%a\n" 2stmt: NEI8(reg,rc6) "cmpeq $%0,%1,$23\nbeq $23,%a\n" 2stmt: NEU8(reg,rc6) "cmpeq $%0,%1,$23\nbeq $23,%a\n" 2stmt: GEI4(reg,rc6) "cmplt $%0,%1,$23\nbeq $23,%a\n" 2stmt: GEI8(reg,rc6) "cmplt $%0,%1,$23\nbeq $23,%a\n" 2stmt: GEU4(reg,rc6) "cmpult $%0,%1,$23\nbeq $23,%a\n" 1stmt: GEU8(reg,rc6) "cmpult $%0,%1,$23\nbeq $23,%a\n" 1stmt: GTI4(reg,rc6) "cmple $%0,%1,$23\nbeq $23,%a\n" 2stmt: GTI8(reg,rc6) "cmple $%0,%1,$23\nbeq $23,%a\n" 2stmt: GTU4(reg,rc6) "cmpule $%0,%1,$23\nbeq $23,%a\n" 1stmt: GTU8(reg,rc6) "cmpule $%0,%1,$23\nbeq $23,%a\n" 1stmt: LEI4(reg,rc6) "cmple $%0,%1,$23\nbne $23,%a\n" 2stmt: LEI8(reg,rc6) "cmple $%0,%1,$23\nbne $23,%a\n" 2stmt: LEU4(reg,rc6) "cmpule $%0,%1,$23\nbne $23,%a\n" 2stmt: LEU8(reg,rc6) "cmpule $%0,%1,$23\nbne $23,%a\n" 2stmt: LTI4(reg,rc6) "cmplt $%0,%1,$23\nbne $23,%a\n" 2stmt: LTI8(reg,rc6) "cmplt $%0,%1,$23\nbne $23,%a\n" 2stmt: LTU4(reg,rc6) "cmpult $%0,%1,$23\nbne $23,%a\n" 2stmt: LTU8(reg,rc6) "cmpult $%0,%1,$23\nbne $23,%a\n" 2stmt: EQF4(reg,reg) "cmpteq $f%0,$f%1,$f1\nfbne $f1,%a\n" 2stmt: EQF8(reg,reg) "cmpteq $f%0,$f%1,$f1\nfbne $f1,%a\n" 2stmt: LEF4(reg,reg) "cmptle $f%0,$f%1,$f1\nfbne $f1,%a\n" 2stmt: LEF8(reg,reg) "cmptle $f%0,$f%1,$f1\nfbne $f1,%a\n" 2stmt: LTF4(reg,reg) "cmptlt $f%0,$f%1,$f1\nfbne $f1,%a\n" 2stmt: LTF8(reg,reg) "cmptlt $f%0,$f%1,$f1\nfbne $f1,%a\n" 2stmt: NEF4(reg,reg) "cmpteq $f%0,$f%1,$f1\nfbeq $f1,%a\n" 2stmt: NEF8(reg,reg) "cmpteq $f%0,$f%1,$f1\nfbeq $f1,%a\n" 2stmt: GEF4(reg,reg) "cmptlt $f%0,$f%1,$f1\nfbeq $f1,%a\n" 2stmt: GEF8(reg,reg) "cmptlt $f%0,$f%1,$f1\nfbeq $f1,%a\n" 2stmt: GTF4(reg,reg) "cmptle $f%0,$f%1,$f1\nfbeq $f1,%a\n" 2stmt: GTF8(reg,reg) "cmptle $f%0,$f%1,$f1\nfbeq $f1,%a\n" 2ar: ADDRGP8 "%a"ar: reg "($%0)"reg: CALLF4(ar) "jsr $26,%0\nldgp $gp,0($26)\n" 2reg: CALLF8(ar) "jsr $26,%0\nldgp $gp,0($26)\n" 2reg: CALLI4(ar) "jsr $26,%0\nldgp $gp,0($26)\n" 2reg: CALLI8(ar) "jsr $26,%0\nldgp $gp,0($26)\n" 2reg: CALLP8(ar) "jsr $26,%0\nldgp $gp,0($26)\n" 2reg: CALLU4(ar) "jsr $26,%0\nldgp $gp,0($26)\n" 2reg: CALLU8(ar) "jsr $26,%0\nldgp $gp,0($26)\n" 2stmt: CALLV(ar) "jsr $26,%0\nldgp $gp,0($26)\n" 2stmt: RETF4(reg) "# ret\n" 1stmt: RETF8(reg) "# ret\n" 1stmt: RETI4(reg) "# ret\n" 1stmt: RETU4(reg) "# ret\n" 1stmt: RETI8(reg) "# ret\n" 1stmt: RETU8(reg) "# ret\n" 1stmt: RETP8(reg) "# ret\n" 1stmt: RETV(reg) "# ret\n" 1stmt: ARGF4(reg) "# arg\n" 1stmt: ARGF8(reg) "# arg\n" 1stmt: ARGI4(reg) "# arg\n" 1stmt: ARGI8(reg) "# arg\n" 1stmt: ARGP8(reg) "# arg\n" 1stmt: ARGU4(reg) "# arg\n" 1stmt: ARGU8(reg) "# arg\n" 1stmt: ARGB(INDIRB(reg)) "# argb %0\n" 1stmt: ASGNB(reg,INDIRB(reg)) "# asgnb %0 %1\n" 1%%static void progend(void){}static void progbeg(int argc, char *argv[]) { int i; { union { char c; int i; } u; u.i = 0; u.c = 1; swap = ((int)(u.i == 1)) != IR->little_endian; } parseflags(argc, argv); for (i = 0; i < 32; i++) freg[i] = mkreg("%d", i, 1, FREG); for (i = 0; i < 32; i++) ireg[i] = mkreg("%d", i, 1, IREG); ireg[29]->x.name = "gp"; ireg[30]->x.name = "sp"; fregw = mkwildcard(freg); iregw = mkwildcard(ireg); tmask[IREG] = INTTMP; tmask[FREG] = FLTTMP; vmask[IREG] = INTVAR; vmask[FREG] = FLTVAR; blkreg = mkreg("1", 1, 0xf, IREG);}static Symbol rmap(int opk) { switch (optype(opk)) { case I: case U: case P: case B: return iregw; case F: return fregw; default: return 0; }}static Symbol argreg(int offset, int ty) { if (offset >= 48) return NULL; else if (ty == F) return freg[(offset/8) + 16]; else return ireg[(offset/8) + 16];}static void target(Node p) { assert(p); switch (specific(p->op)) { case CNST+I: case CNST+U: case CNST+P: if (range(p, 0, 0) == 0) { setreg(p, ireg[31]); p->x.registered = 1; } break; case CNST+F: if (p->syms[0]->u.c.v.d == 0) { setreg(p, freg[31]); p->x.registered = 1; } break; case CALL+V: rtarget(p, 0, ireg[27]); break; case CALL+F: rtarget(p, 0, ireg[27]); setreg(p, freg[0]); break; case CALL+I: case CALL+P: case CALL+U: rtarget(p, 0, ireg[27]); setreg(p, ireg[0]); break; case RET+F: rtarget(p, 0, freg[0]); break; case RET+I: case RET+U: case RET+P: rtarget(p, 0, ireg[0]); break; case ARG+F: case ARG+I: case ARG+P: case ARG+U: { Symbol q = argreg(p->syms[2]->u.c.v.i, optype(p->op)); if (q) rtarget(p, 0, q); break; } case ASGN+B: rtarget(p->kids[1], 0, blkreg); break; case ARG+B: rtarget(p->kids[0], 0, blkreg); break; }}static void clobber(Node p) { assert(p); switch (specific(p->op)) { case ASGN+I: case ASGN+U: if (opsize(p->op) <= 2) spill(1<<24, IREG, p); break; case DIV+I: case DIV+U: case MOD+I: case MOD+U: spill(((1<<27)|(3<<24))&~p->syms[RX]->x.regnode->mask, IREG, p); break; case CALL+F: spill(INTTMP | INTRET, IREG, p); spill(FLTTMP, FREG, p); break; case CALL+I: case CALL+P: case CALL+U: spill(INTTMP, IREG, p); spill(FLTTMP | FLTRET, FREG, p); break; case CALL+V: spill(INTTMP | INTRET, IREG, p); spill(FLTTMP | FLTRET, FREG, p); break; }}static void emit2(Node p) { int dst, n, src, sz, ty; static int ty0; Symbol q; switch (specific(p->op)) { case ARG+F: case ARG+I: case ARG+P: case ARG+U: ty = optype(p->op); sz = opsize(p->op); q = argreg(p->syms[2]->u.c.v.i, ty); src = getregnum(p->x.kids[0]); if (q) break; else if (ty == F && sz == 4) print("sts $f%d,%d($sp)\n", src, p->syms[2]->u.c.v.i - 48); else if (ty == F && sz == 8) print("stt $f%d,%d($sp)\n", src, p->syms[2]->u.c.v.i - 48); else if (sz == 4) print("stq $%d,%d($sp)\n", src, p->syms[2]->u.c.v.i - 48); else if (sz == 8) print("stq $%d,%d($sp)\n", src, p->syms[2]->u.c.v.i - 48); else assert(0); break; case ASGN+B: dalign = salign = p->syms[1]->u.c.v.i; blkcopy(getregnum(p->x.kids[0]), 0, getregnum(p->x.kids[1]), 0, p->syms[0]->u.c.v.i, tmpregs); break; case ARG+B: { int doff = p->syms[2]->u.c.v.i, soff = 0, sreg = getregnum(p->x.kids[0]); dalign = 8; salign = p->syms[1]->u.c.v.i; n = p->syms[0]->u.c.v.i; for ( ; doff <= 40 && n > 0; doff += 8) { print("uldq $%d,%d($%d)\n", (doff/8)+16, soff, sreg); soff += 8; n -= 8; } if (n > 0) blkcopy(30, doff - 48, sreg, soff, n, tmpregs);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -