blob: 46c1ee6d95d9d7b6b08c8125b91a4ec49e8c8519 [file] [log] [blame]
// Copyright 2015 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
// This input was created by taking the instruction productions in
// the old assembler's (9a's) grammar and hand-writing complete
// instructions for each rule, to guarantee we cover the same space.
TEXT foo(SB),0,$0
//inst:
//
// load ints and bytes
//
// LMOVW rreg ',' rreg
// {
// outcode(int($1), &$2, 0, &$4);
// }
MOVW R1, R2
// LMOVW addr ',' rreg
// {
// outcode(int($1), &$2, 0, &$4);
// }
MOVW foo<>+3(SB), R2
MOVW 16(R1), R2
// LMOVW regaddr ',' rreg
// {
// outcode(int($1), &$2, 0, &$4);
// }
MOVW (R1), R2
MOVW (R1+R2), R3
// LMOVB rreg ',' rreg
// {
// outcode(int($1), &$2, 0, &$4);
// }
MOVW R1, R2
// LMOVB addr ',' rreg
// {
// outcode(int($1), &$2, 0, &$4);
// }
MOVB foo<>+3(SB), R2
MOVB 16(R1), R2
// LMOVB regaddr ',' rreg
// {
// outcode(int($1), &$2, 0, &$4);
// }
MOVB (R1), R2
MOVB (R1+R2), R3
//
// load floats
//
// LFMOV addr ',' freg
// {
// outcode(int($1), &$2, 0, &$4);
// }
FMOVD foo<>+3(SB), F2
FMOVD 16(R1), F2
// LFMOV regaddr ',' freg
// {
// outcode(int($1), &$2, 0, &$4);
// }
FMOVD (R1), F2
// LFMOV fimm ',' freg
// {
// outcode(int($1), &$2, 0, &$4);
// }
FMOVD $0.1, F2
// LFMOV freg ',' freg
// {
// outcode(int($1), &$2, 0, &$4);
// }
FMOVD F1, F2
// LFMOV freg ',' addr
// {
// outcode(int($1), &$2, 0, &$4);
// }
FMOVD F2, foo<>+3(SB)
FMOVD F2, 16(R1)
// LFMOV freg ',' regaddr
// {
// outcode(int($1), &$2, 0, &$4);
// }
FMOVD F2, (R1)
//
// store ints and bytes
//
// LMOVW rreg ',' addr
// {
// outcode(int($1), &$2, 0, &$4);
// }
MOVW R1, foo<>+3(SB)
MOVW R1, 16(R2)
// LMOVW rreg ',' regaddr
// {
// outcode(int($1), &$2, 0, &$4);
// }
MOVW R1, (R1)
MOVW R1, (R2+R3)
// LMOVB rreg ',' addr
// {
// outcode(int($1), &$2, 0, &$4);
// }
MOVB R1, foo<>+3(SB)
MOVB R1, 16(R2)
// LMOVB rreg ',' regaddr
// {
// outcode(int($1), &$2, 0, &$4);
// }
MOVB R1, (R1)
MOVB R1, (R2+R3)
//
// store floats
//
// LMOVW freg ',' addr
// {
// outcode(int($1), &$2, 0, &$4);
// }
FMOVD F1, foo<>+3(SB)
FMOVD F1, 16(R2)
// LMOVW freg ',' regaddr
// {
// outcode(int($1), &$2, 0, &$4);
// }
FMOVD F1, (R1)
//
// floating point status
//
// LMOVW fpscr ',' freg
// {
// outcode(int($1), &$2, 0, &$4);
// }
MOVFL FPSCR, F1
// LMOVW freg ',' fpscr
// {
// outcode(int($1), &$2, 0, &$4);
// }
MOVFL F1, FPSCR
// LMOVW freg ',' imm ',' fpscr
// {
// outgcode(int($1), &$2, 0, &$4, &$6);
// }
MOVFL F1, $4, FPSCR
// LMOVW fpscr ',' creg
// {
// outcode(int($1), &$2, 0, &$4);
// }
MOVFL FPSCR, CR0
// LMTFSB imm ',' con
// {
// outcode(int($1), &$2, int($4), &nullgen);
// }
//TODO 9a doesn't work MTFSB0 $4, 4
//
// field moves (mtcrf)
//
// LMOVW rreg ',' imm ',' lcr
// {
// outgcode(int($1), &$2, 0, &$4, &$6);
// }
// TODO 9a doesn't work MOVFL R1,$4,CR
// LMOVW rreg ',' creg
// {
// outcode(int($1), &$2, 0, &$4);
// }
MOVW R1, CR1
// LMOVW rreg ',' lcr
// {
// outcode(int($1), &$2, 0, &$4);
// }
MOVW R1, CR
//
// integer operations
// logical instructions
// shift instructions
// unary instructions
//
// LADDW rreg ',' sreg ',' rreg
// {
// outcode(int($1), &$2, int($4), &$6);
// }
ADD R1, R2, R3
// LADDW imm ',' sreg ',' rreg
// {
// outcode(int($1), &$2, int($4), &$6);
// }
ADD $1, R2, R3
// LADDW rreg ',' imm ',' rreg
// {
// outgcode(int($1), &$2, 0, &$4, &$6);
// }
//TODO 9a trouble ADD R1, $2, R3 maybe swap rreg and imm
// LADDW rreg ',' rreg
// {
// outcode(int($1), &$2, 0, &$4);
// }
ADD R1, R2
// LADDW imm ',' rreg
// {
// outcode(int($1), &$2, 0, &$4);
// }
ADD $4, R1
// LLOGW rreg ',' sreg ',' rreg
// {
// outcode(int($1), &$2, int($4), &$6);
// }
ADDE R1, R2, R3
// LLOGW rreg ',' rreg
// {
// outcode(int($1), &$2, 0, &$4);
// }
ADDE R1, R2
// LSHW rreg ',' sreg ',' rreg
// {
// outcode(int($1), &$2, int($4), &$6);
// }
SLW R1, R2, R3
// LSHW rreg ',' rreg
// {
// outcode(int($1), &$2, 0, &$4);
// }
SLW R1, R2
// LSHW imm ',' sreg ',' rreg
// {
// outcode(int($1), &$2, int($4), &$6);
// }
SLW $4, R1, R2
// LSHW imm ',' rreg
// {
// outcode(int($1), &$2, 0, &$4);
// }
SLW $4, R1
// LABS rreg ',' rreg
// {
// outcode(int($1), &$2, 0, &$4);
// }
SLW $4, R1
// LABS rreg
// {
// outcode(int($1), &$2, 0, &$2);
// }
SUBME R1
//
// multiply-accumulate
//
// LMA rreg ',' sreg ',' rreg
// {
// outcode(int($1), &$2, int($4), &$6);
// }
//TODO this instruction is undefined in lex.go LMA R1, R2, R3 NOT SUPPORTED (called MAC)
//
// move immediate: macro for cau+or, addi, addis, and other combinations
//
// LMOVW imm ',' rreg
// {
// outcode(int($1), &$2, 0, &$4);
// }
MOVW $1, R1
// LMOVW ximm ',' rreg
// {
// outcode(int($1), &$2, 0, &$4);
// }
MOVW $1, R1
MOVW $foo(SB), R1
// condition register operations
//
// LCROP cbit ',' cbit
// {
// outcode(int($1), &$2, int($4.Reg), &$4);
// }
//TODO 9a trouble CREQV 1, 2 delete? liblink encodes like a divide (maybe wrong too)
// LCROP cbit ',' con ',' cbit
// {
// outcode(int($1), &$2, int($4), &$6);
// }
//TODO 9a trouble CREQV 1, 2, 3
//
// condition register moves
// move from machine state register
//
// LMOVW creg ',' creg
// {
// outcode(int($1), &$2, 0, &$4);
// }
MOVFL CR0, CR1
// LMOVW psr ',' creg // TODO: should psr should be fpscr
// {
// outcode(int($1), &$2, 0, &$4);
// }
//TODO 9a trouble MOVW FPSCR, CR1
// LMOVW lcr ',' rreg
// {
// outcode(int($1), &$2, 0, &$4);
// }
MOVW CR, R1
// LMOVW psr ',' rreg
// {
// outcode(int($1), &$2, 0, &$4);
// }
MOVW SPR(0), R1
MOVW SPR(7), R1
// LMOVW xlreg ',' rreg
// {
// outcode(int($1), &$2, 0, &$4);
// }
MOVW LR, R1
MOVW CTR, R1
// LMOVW rreg ',' xlreg
// {
// outcode(int($1), &$2, 0, &$4);
// }
MOVW R1, LR
MOVW R1, CTR
// LMOVW creg ',' psr // TODO doesn't exist
// {
// outcode(int($1), &$2, 0, &$4);
// }
//TODO 9a trouble MOVW CR1, SPR(7)
// LMOVW rreg ',' psr
// {
// outcode(int($1), &$2, 0, &$4);
// }
MOVW R1, SPR(7)
//
// branch, branch conditional
// branch conditional register
// branch conditional to count register
//
// LBRA rel
// {
// outcode(int($1), &nullgen, 0, &$2);
// }
label0:
BR 1(PC)
BR label0+0
// LBRA addr
// {
// outcode(int($1), &nullgen, 0, &$2);
// }
BR 4(R1)
BR foo+0(SB)
// LBRA '(' xlreg ')'
// {
// outcode(int($1), &nullgen, 0, &$3);
// }
BR (CTR)
// LBRA ',' rel // asm doesn't support the leading comma
// {
// outcode(int($1), &nullgen, 0, &$3);
// }
// LBRA ',' addr // asm doesn't support the leading comma
// {
// outcode(int($1), &nullgen, 0, &$3);
// }
// LBRA ',' '(' xlreg ')' // asm doesn't support the leading comma
// {
// outcode(int($1), &nullgen, 0, &$4);
// }
// LBRA creg ',' rel
// {
// outcode(int($1), &$2, 0, &$4);
// }
label1:
BEQ CR1, 1(PC)
BEQ CR1, label1
// LBRA creg ',' addr // TODO DOES NOT WORK in 9a
// {
// outcode(int($1), &$2, 0, &$4);
// }
// LBRA creg ',' '(' xlreg ')' // TODO DOES NOT WORK in 9a
// {
// outcode(int($1), &$2, 0, &$5);
// }
// LBRA con ',' rel // TODO DOES NOT WORK in 9a
// {
// outcode(int($1), &nullgen, int($2), &$4);
// }
// LBRA con ',' addr // TODO DOES NOT WORK in 9a
// {
// outcode(int($1), &nullgen, int($2), &$4);
// }
// LBRA con ',' '(' xlreg ')'
// {
// outcode(int($1), &nullgen, int($2), &$5);
// }
BC 4, (CTR)
// LBRA con ',' con ',' rel
// {
// var g obj.Addr
// g = nullgen;
// g.Type = obj.TYPE_CONST;
// g.Offset = $2;
// outcode(int($1), &g, int(REG_R0+$4), &$6);
// }
BC 3, 4, label1
// LBRA con ',' con ',' addr // TODO mystery
// {
// var g obj.Addr
// g = nullgen;
// g.Type = obj.TYPE_CONST;
// g.Offset = $2;
// outcode(int($1), &g, int(REG_R0+$4), &$6);
// }
//TODO 9a trouble BC 3, 3, 4(R1)
// LBRA con ',' con ',' '(' xlreg ')'
// {
// var g obj.Addr
// g = nullgen;
// g.Type = obj.TYPE_CONST;
// g.Offset = $2;
// outcode(int($1), &g, int(REG_R0+$4), &$7);
// }
BC 3, 3, (LR)
//
// conditional trap // TODO NOT DEFINED
// TODO these instructions are not in lex.go
//
// LTRAP rreg ',' sreg
// {
// outcode(int($1), &$2, int($4), &nullgen);
// }
// LTRAP imm ',' sreg
// {
// outcode(int($1), &$2, int($4), &nullgen);
// }
// LTRAP rreg comma
// {
// outcode(int($1), &$2, 0, &nullgen);
// }
// LTRAP comma
// {
// outcode(int($1), &nullgen, 0, &nullgen);
// }
//
// floating point operate
//
// LFCONV freg ',' freg
// {
// outcode(int($1), &$2, 0, &$4);
// }
FABS F1, F2
// LFADD freg ',' freg
// {
// outcode(int($1), &$2, 0, &$4);
// }
FADD F1, F2
// LFADD freg ',' freg ',' freg
// {
// outcode(int($1), &$2, int($4.Reg), &$6);
// }
FADD F1, F2, F3
// LFMA freg ',' freg ',' freg ',' freg
// {
// outgcode(int($1), &$2, int($4.Reg), &$6, &$8);
// }
FMADD F1, F2, F3, F4
// LFCMP freg ',' freg
// {
// outcode(int($1), &$2, 0, &$4);
// }
FCMPU F1, F2
// LFCMP freg ',' freg ',' creg
// {
// outcode(int($1), &$2, int($6.Reg), &$4);
// }
FCMPU F1, F2, CR0
//
// CMP
//
// LCMP rreg ',' rreg
// {
// outcode(int($1), &$2, 0, &$4);
// }
CMP R1, R2
// LCMP rreg ',' imm
// {
// outcode(int($1), &$2, 0, &$4);
// }
CMP R1, $4
// LCMP rreg ',' rreg ',' creg
// {
// outcode(int($1), &$2, int($6.Reg), &$4);
// }
CMP R1, R2, CR0
// LCMP rreg ',' imm ',' creg
// {
// outcode(int($1), &$2, int($6.Reg), &$4);
// }
CMP R1, $4, CR0
//
// rotate and mask
//
// LRLWM imm ',' rreg ',' imm ',' rreg
// {
// outgcode(int($1), &$2, int($4.Reg), &$6, &$8);
// }
RLDC $4, R1, $5, R2
// LRLWM imm ',' rreg ',' mask ',' rreg
// {
// outgcode(int($1), &$2, int($4.Reg), &$6, &$8);
// }
RLDC $26, R1, 4, 5, R2
// LRLWM rreg ',' rreg ',' imm ',' rreg
// {
// outgcode(int($1), &$2, int($4.Reg), &$6, &$8);
// }
RLDC R1, R2, $4, R3
// LRLWM rreg ',' rreg ',' mask ',' rreg
// {
// outgcode(int($1), &$2, int($4.Reg), &$6, &$8);
// }
RLWMI R1, R2, 4, 5, R3
//
// load/store multiple
//
// LMOVMW addr ',' rreg
// {
// outcode(int($1), &$2, 0, &$4);
// }
MOVMW foo+0(SB), R2
MOVMW 4(R1), R2
// LMOVMW rreg ',' addr
// {
// outcode(int($1), &$2, 0, &$4);
// }
MOVMW R1, foo+0(SB)
MOVMW R1, 4(R2)
//
// various indexed load/store
// indexed unary (eg, cache clear)
//
// LXLD regaddr ',' rreg
// {
// outcode(int($1), &$2, 0, &$4);
// }
LSW (R1), R2
LSW (R1+R2), R3
// LXLD regaddr ',' imm ',' rreg
// {
// outgcode(int($1), &$2, 0, &$4, &$6);
// }
LSW (R1), $1, R2
LSW (R1+R2), $1, R3
// LXST rreg ',' regaddr
// {
// outcode(int($1), &$2, 0, &$4);
// }
STSW R1, (R2)
STSW R1, (R2+R3)
// LXST rreg ',' imm ',' regaddr
// {
// outgcode(int($1), &$2, 0, &$4, &$6);
// }
STSW R1, $1, (R2)
STSW R1, $1, (R2+R3)
// LXMV regaddr ',' rreg
// {
// outcode(int($1), &$2, 0, &$4);
// }
MOVHBR (R1), R2
MOVHBR (R1+R2), R3
// LXMV rreg ',' regaddr
// {
// outcode(int($1), &$2, 0, &$4);
// }
MOVHBR R1, (R2)
MOVHBR R1, (R2+R3)
// LXOP regaddr
// {
// outcode(int($1), &$2, 0, &nullgen);
// }
DCBF (R1)
DCBF (R1+R2)
//
// NOP
//
// LNOP comma // asm doesn't support the trailing comma.
// {
// outcode(int($1), &nullgen, 0, &nullgen);
// }
NOP
// LNOP rreg comma // asm doesn't support the trailing comma.
// {
// outcode(int($1), &$2, 0, &nullgen);
// }
NOP R2
// LNOP freg comma // asm doesn't support the trailing comma.
// {
// outcode(int($1), &$2, 0, &nullgen);
// }
NOP F2
// LNOP ',' rreg // asm doesn't support the leading comma.
// {
// outcode(int($1), &nullgen, 0, &$3);
// }
NOP R2
// LNOP ',' freg // asm doesn't support the leading comma.
// {
// outcode(int($1), &nullgen, 0, &$3);
// }
NOP F2
// LNOP imm // SYSCALL $num: load $num to R0 before syscall and restore R0 to 0 afterwards.
// {
// outcode(int($1), &$2, 0, &nullgen);
// }
NOP $4
// RET
//
// LRETRN comma // asm doesn't support the trailing comma.
// {
// outcode(int($1), &nullgen, 0, &nullgen);
// }
RET
// More BR/BL cases, and canonical names JMP, CALL.
BR foo(SB)
BL foo(SB)
JMP foo(SB)
CALL foo(SB)
// END
//
// LEND comma // asm doesn't support the trailing comma.
// {
// outcode(int($1), &nullgen, 0, &nullgen);
// }
END