blob: 1dec7f4135a541c0c881ade29b900c281868ef7d [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 (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)