// 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 (6a's) grammar and hand-writing complete // instructions for each rule, to guarantee we cover the same space. #include "../../../../../runtime/textflag.h" TEXT foo(SB), DUPOK|NOSPLIT, $0 // LTYPE1 nonrem { outcode($1, &$2); } NEGQ R11 NEGQ 4(R11) NEGQ foo+4(SB) // LTYPE2 rimnon { outcode($1, &$2); } INT $4 DIVB R11 DIVB 4(R11) DIVB foo+4(SB) // LTYPE3 rimrem { outcode($1, &$2); } SUBQ $4, DI SUBQ R11, DI SUBQ 4(R11), DI SUBQ foo+4(SB), DI SUBQ $4, 8(R12) SUBQ R11, 8(R12) SUBQ R11, foo+4(SB) // LTYPE4 remrim { outcode($1, &$2); } CMPB CX, $4 // LTYPER nonrel { outcode($1, &$2); } label: JB -4(PC) // JCS -4(PC) JB label // JCS 17 // LTYPEC spec3 { outcode($1, &$2); } JCS 2(PC) JMP -4(PC) JCS 2(PC) JMP label // JMP 17 JCS 2(PC) JMP foo+4(SB) JCS 2(PC) JMP bar<>+4(SB) JCS 2(PC) JMP bar<>+4(SB)(R11*4) JCS 2(PC) JMP *4(SP) // JMP 4(SP) JCS 2(PC) JMP *(R12) // JMP (R12) JCS 2(PC) // JMP *(R12*4) // TODO: This line is silently dropped on the floor! JCS 2(PC) JMP *(R12)(R13*4) // JMP (R12)(R13*4) JCS 2(PC) JMP *(AX) // JMP (AX) JCS 2(PC) JMP *(SP) // JMP (SP) JCS 2(PC) // JMP *(AX*4) // TODO: This line is silently dropped on the floor! JCS 2(PC) JMP *(AX)(AX*4) // JMP (AX)(AX*4) JCS 2(PC) JMP 4(SP) JCS 2(PC) JMP (R12) JCS 2(PC) // JMP (R12*4) // TODO: This line is silently dropped on the floor! JCS 2(PC) JMP (R12)(R13*4) JCS 2(PC) JMP (AX) JCS 2(PC) JMP (SP) JCS 2(PC) // JMP (AX*4) // TODO: This line is silently dropped on the floor! JCS 2(PC) JMP (AX)(AX*4) JCS 2(PC) JMP R13 // LTYPEN spec4 { outcode($1, &$2); } NOP NOP AX NOP foo+4(SB) // LTYPES spec5 { outcode($1, &$2); } SHLL CX, R12 SHLL CX, foo+4(SB) // Old syntax, still accepted: SHLL CX, R11:AX // SHLL CX, AX, R11 // LTYPEM spec6 { outcode($1, &$2); } MOVL AX, R11 MOVL $4, R11 // MOVL AX, 0(AX):DS // no longer works - did it ever? // LTYPEI spec7 { outcode($1, &$2); } IMULB DX IMULW DX, BX IMULL R11, R12 IMULQ foo+4(SB), R11 // LTYPEXC spec8 { outcode($1, &$2); } CMPPD X1, X2, 4 CMPPD foo+4(SB), X2, 4 // LTYPEX spec9 { outcode($1, &$2); } PINSRW $4, AX, X2 PINSRW $4, foo+4(SB), X2 // LTYPERT spec10 { outcode($1, &$2); } JCS 2(PC) RETFL $4 // Was bug: LOOP is a branch instruction. JCS 2(PC) loop: LOOP loop // LOOP // Intel pseudonyms for our own renamings. PADDD M2, M1 // PADDL M2, M1 MOVDQ2Q X1, M1 // MOVQ X1, M1 MOVNTDQ X1, (AX) // MOVNTO X1, (AX) MOVOA (AX), X1 // MOVO (AX), X1 // Tests for SP indexed addresses. MOVQ foo(SP)(AX*1), BX // 488b1c04 MOVQ foo+32(SP)(CX*2), DX // 488b544c20 MOVQ foo+32323(SP)(R8*4), R9 // 4e8b8c84437e0000 MOVL foo(SP)(SI*8), DI // 8b3cf4 MOVL foo+32(SP)(R10*1), R11 // 468b5c1420 MOVL foo+32323(SP)(R12*2), R13 // 468bac64437e0000 MOVW foo(SP)(AX*4), R8 // 66448b0484 MOVW foo+32(SP)(R9*8), CX // 66428b4ccc20 MOVW foo+32323(SP)(AX*1), DX // 668b9404437e0000 MOVB foo(SP)(AX*2), AL // 8a0444 MOVB foo+32(SP)(CX*4), AH // 8a648c20 MOVB foo+32323(SP)(CX*8), R9 // 448a8ccc437e0000 // Tests for TLS reference. MOVQ (TLS), AX MOVQ 8(TLS), DX // LTYPE0 nonnon { outcode($1, &$2); } RET // c3 RET foo(SB)