Home | History | Annotate | Download | only in testdata
      1 // Copyright 2016 The Go Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style
      3 // license that can be found in the LICENSE file.
      4 
      5 // This input was created by taking the mips64 testcase and modified
      6 // by hand.
      7 
      8 #include "../../../../../runtime/textflag.h"
      9 
     10 TEXT foo(SB),DUPOK|NOSPLIT,$0
     11 
     12 	//inst:
     13 	//
     14 	// load ints and bytes
     15 	//
     16 	//	LMOVW rreg ',' rreg
     17 	//	{
     18 	//		outcode(int($1), &$2, 0, &$4);
     19 	//	}
     20 	MOVW	R1, R2
     21 	MOVW	LO, R1
     22 	MOVW	HI, R1
     23 	MOVW	R1, LO
     24 	MOVW	R1, HI
     25 	MOVW	R1, R2
     26 	MOVW	LO, R1
     27 	MOVW	HI, R1
     28 	MOVW	R1, LO
     29 	MOVW	R1, HI
     30 
     31 	//	LMOVW addr ',' rreg
     32 	//	{
     33 	//		outcode(int($1), &$2, 0, &$4);
     34 	//	}
     35 	MOVW	foo<>+3(SB), R2
     36 	MOVW	16(R1), R2
     37 	MOVW	(R1), R2
     38 	MOVW	foo<>+3(SB), R2
     39 	MOVW	16(R1), R2
     40 	MOVW	(R1), R2
     41 	LL	(R1), R2
     42 
     43 	//	LMOVB rreg ',' rreg
     44 	//	{
     45 	//		outcode(int($1), &$2, 0, &$4);
     46 	//	}
     47 	MOVB	R1, R2
     48 
     49 	//	LMOVB addr ',' rreg
     50 	//	{
     51 	//		outcode(int($1), &$2, 0, &$4);
     52 	//	}
     53 	MOVB	foo<>+3(SB), R2
     54 	MOVB	16(R1), R2
     55 	MOVB	(R1), R2
     56 
     57 	//
     58 	// load floats
     59 	//
     60 	//	LFMOV addr ',' freg
     61 	//	{
     62 	//		outcode(int($1), &$2, 0, &$4);
     63 	//	}
     64 	MOVF	foo<>+3(SB), F2
     65 	MOVF	16(R1), F2
     66 	MOVF	(R1), F2
     67 
     68 	//	LFMOV fimm ',' freg
     69 	//	{
     70 	//		outcode(int($1), &$2, 0, &$4);
     71 	//	}
     72 	MOVF	$0.1, F2	// MOVF $(0.10000000000000001), F2
     73 
     74 	//	LFMOV freg ',' freg
     75 	//	{
     76 	//		outcode(int($1), &$2, 0, &$4);
     77 	//	}
     78 	MOVF	F1, F2
     79 
     80 	//	LFMOV freg ',' addr
     81 	//	{
     82 	//		outcode(int($1), &$2, 0, &$4);
     83 	//	}
     84 	MOVF	F2, foo<>+3(SB)
     85 	MOVF	F2, 16(R1)
     86 	MOVF	F2, (R1)
     87 
     88 	//
     89 	// store ints and bytes
     90 	//
     91 	//	LMOVW rreg ',' addr
     92 	//	{
     93 	//		outcode(int($1), &$2, 0, &$4);
     94 	//	}
     95 	MOVW	R1, foo<>+3(SB)
     96 	MOVW	R1, 16(R2)
     97 	MOVW	R1, (R2)
     98 	MOVW	R1, foo<>+3(SB)
     99 	MOVW	R1, 16(R2)
    100 	MOVW	R1, (R2)
    101 	SC	R1, (R2)
    102 
    103 	//	LMOVB rreg ',' addr
    104 	//	{
    105 	//		outcode(int($1), &$2, 0, &$4);
    106 	//	}
    107 	MOVB	R1, foo<>+3(SB)
    108 	MOVB	R1, 16(R2)
    109 	MOVB	R1, (R2)
    110 
    111 	//
    112 	// store floats
    113 	//
    114 	//	LMOVW freg ',' addr
    115 	//	{
    116 	//		outcode(int($1), &$2, 0, &$4);
    117 	//	}
    118 	MOVD	F1, foo<>+3(SB)
    119 	MOVD	F1, 16(R2)
    120 	MOVD	F1, (R2)
    121 
    122 	//
    123 	// floating point status
    124 	//
    125 	//	LMOVW fpscr ',' freg
    126 	//	{
    127 	//		outcode(int($1), &$2, 0, &$4);
    128 	//	}
    129 	MOVW	FCR0, R1
    130 
    131 	//	LMOVW freg ','  fpscr
    132 	//	{
    133 	//		outcode(int($1), &$2, 0, &$4);
    134 	//	}
    135 	MOVW	R1, FCR0
    136 
    137 	//	LMOVW rreg ',' mreg
    138 	//	{
    139 	//		outcode(int($1), &$2, 0, &$4);
    140 	//	}
    141 	MOVW	R1, M1
    142 	MOVW	R1, M1
    143 
    144 	//	LMOVW mreg ',' rreg
    145 	//	{
    146 	//		outcode(int($1), &$2, 0, &$4);
    147 	//	}
    148 	MOVW	M1, R1
    149 	MOVW	M1, R1
    150 
    151 
    152 	//
    153 	// integer operations
    154 	// logical instructions
    155 	// shift instructions
    156 	// unary instructions
    157 	//
    158 	//	LADDW rreg ',' sreg ',' rreg
    159 	//	{
    160 	//		outcode(int($1), &$2, int($4), &$6);
    161 	//	}
    162 	ADD	R1, R2, R3
    163 
    164 	//	LADDW imm ',' sreg ',' rreg
    165 	//	{
    166 	//		outcode(int($1), &$2, int($4), &$6);
    167 	//	}
    168 	ADD	$1, R2, R3
    169 
    170 	//	LADDW rreg ',' rreg
    171 	//	{
    172 	//		outcode(int($1), &$2, 0, &$4);
    173 	//	}
    174 	ADD	R1, R2
    175 
    176 	//	LADDW imm ',' rreg
    177 	//	{
    178 	//		outcode(int($1), &$2, 0, &$4);
    179 	//	}
    180 	ADD	$4, R1
    181 
    182 	//	LMUL rreg ',' rreg
    183 	//	{
    184 	//		outcode(int($1), &$2, 0, &$4);
    185 	//	}
    186 	MUL	R1, R2
    187 
    188 	//	LSHW rreg ',' sreg ',' rreg
    189 	//	{
    190 	//		outcode(int($1), &$2, int($4), &$6);
    191 	//	}
    192 	SLL	R1, R2, R3
    193 
    194 	//	LSHW rreg ',' rreg
    195 	//	{
    196 	//		outcode(int($1), &$2, 0, &$4);
    197 	//	}
    198 	SLL	R1, R2
    199 
    200 	//	LSHW imm ',' sreg ',' rreg
    201 	//	{
    202 	//		outcode(int($1), &$2, int($4), &$6);
    203 	//	}
    204 	SLL	$4, R1, R2
    205 
    206 	//	LSHW imm ',' rreg
    207 	//	{
    208 	//		outcode(int($1), &$2, 0, &$4);
    209 	//	}
    210 	SLL	$4, R1
    211 
    212 	//
    213 	// move immediate: macro for lui+or, addi, addis, and other combinations
    214 	//
    215 	//	LMOVW imm ',' rreg
    216 	//	{
    217 	//		outcode(int($1), &$2, 0, &$4);
    218 	//	}
    219 	MOVW	$1, R1
    220 	MOVW	$1, R1
    221 
    222 	//	LMOVW ximm ',' rreg
    223 	//	{
    224 	//		outcode(int($1), &$2, 0, &$4);
    225 	//	}
    226 	MOVW	$1, R1
    227 	MOVW	$foo(SB), R1
    228 	MOVW	$1, R1
    229 	MOVW	$foo(SB), R1
    230 
    231 
    232 	//
    233 	// branch
    234 	//
    235 	//	LBRA rel
    236 	//	{
    237 	//		outcode(int($1), &nullgen, 0, &$2);
    238 	//	}
    239 	BEQ	R1, 2(PC)
    240 label0:
    241 	JMP	1(PC)
    242 	BEQ	R1, 2(PC)
    243 	JMP	label0+0	// JMP 66
    244 	BEQ	R1, 2(PC)
    245 	JAL	1(PC)	// CALL 1(PC)
    246 	BEQ	R1, 2(PC)
    247 	JAL	label0+0	// CALL 66
    248 
    249 	//	LBRA addr
    250 	//	{
    251 	//		outcode(int($1), &nullgen, 0, &$2);
    252 	//	}
    253 	BEQ	R1, 2(PC)
    254 	JMP	0(R1)	// JMP (R1)
    255 	BEQ	R1, 2(PC)
    256 	JMP	foo+0(SB)	// JMP foo(SB)
    257 	BEQ	R1, 2(PC)
    258 	JAL	0(R1)	// CALL (R1)
    259 	BEQ	R1, 2(PC)
    260 	JAL	foo+0(SB)	// CALL foo(SB)
    261 
    262 //
    263 // BEQ/BNE
    264 //
    265 //	LBRA rreg ',' rel
    266 //	{
    267 //		outcode(int($1), &$2, 0, &$4);
    268 //	}
    269 label1:
    270 	BEQ	R1, 1(PC)
    271 	BEQ	R1, label1	// BEQ R1, 81
    272 
    273 //	LBRA rreg ',' sreg ',' rel
    274 //	{
    275 //		outcode(int($1), &$2, 0, &$4);
    276 //	}
    277 label2:
    278 	BEQ	R1, R2, 1(PC)
    279 	BEQ	R1, R2, label2	// BEQ R1, R2, 83
    280 
    281 //
    282 // other integer conditional branch
    283 //
    284 //	LBRA rreg ',' rel
    285 //	{
    286 //		outcode(int($1), &$2, 0, &$4);
    287 //	}
    288 label3:
    289 	BLTZ	R1, 1(PC)
    290 	BLTZ	R1, label3	// BLTZ R1, 85
    291 
    292 //
    293 // floating point conditional branch
    294 //
    295 //	LBRA rel
    296 label4:
    297 	BFPT	1(PC)
    298 	BFPT	label4	// BFPT 87
    299 
    300 
    301 	//
    302 	// floating point operate
    303 	//
    304 	//	LFCONV freg ',' freg
    305 	//	{
    306 	//		outcode(int($1), &$2, 0, &$4);
    307 	//	}
    308 	ABSD	F1, F2
    309 
    310 	//	LFADD freg ',' freg
    311 	//	{
    312 	//		outcode(int($1), &$2, 0, &$4);
    313 	//	}
    314 	ADDD	F1, F2
    315 
    316 	//	LFADD freg ',' freg ',' freg
    317 	//	{
    318 	//		outcode(int($1), &$2, int($4.Reg), &$6);
    319 	//	}
    320 	ADDD	F1, F2, F3
    321 
    322 	//	LFCMP freg ',' freg
    323 	//	{
    324 	//		outcode(int($1), &$2, 0, &$4);
    325 	//	}
    326 	CMPEQD	F1, F2
    327 
    328 
    329 	//
    330 	// WORD
    331 	//
    332 	WORD	$1
    333 
    334 	//
    335 	// NOP
    336 	//
    337 	//	LNOP comma // asm doesn't support the trailing comma.
    338 	//	{
    339 	//		outcode(int($1), &nullgen, 0, &nullgen);
    340 	//	}
    341 	NOP
    342 
    343 	//	LNOP rreg comma // asm doesn't support the trailing comma.
    344 	//	{
    345 	//		outcode(int($1), &$2, 0, &nullgen);
    346 	//	}
    347 	NOP	R2
    348 
    349 	//	LNOP freg comma // asm doesn't support the trailing comma.
    350 	//	{
    351 	//		outcode(int($1), &$2, 0, &nullgen);
    352 	//	}
    353 	NOP	F2
    354 
    355 	//	LNOP ',' rreg // asm doesn't support the leading comma.
    356 	//	{
    357 	//		outcode(int($1), &nullgen, 0, &$3);
    358 	//	}
    359 	NOP	R2
    360 
    361 	//	LNOP ',' freg // asm doesn't support the leading comma.
    362 	//	{
    363 	//		outcode(int($1), &nullgen, 0, &$3);
    364 	//	}
    365 	NOP	F2
    366 
    367 	//	LNOP imm
    368 	//	{
    369 	//		outcode(int($1), &$2, 0, &nullgen);
    370 	//	}
    371 	NOP	$4
    372 
    373 	//
    374 	// special
    375 	//
    376 	SYSCALL
    377 	BREAK
    378 	SYNC
    379 
    380 	//
    381 	// conditional move on zero/nonzero gp value
    382 	//
    383 	CMOVN	R1, R2, R3
    384 	CMOVZ	R1, R2, R3
    385 
    386 	//
    387 	// conditional move on fp false/true
    388 	//
    389 	CMOVF	R1, R2
    390 	CMOVT	R1, R2
    391 
    392 	//
    393 	// conditional traps
    394 	//
    395 	TEQ	$1, R1, R2
    396 	TEQ	$1, R1
    397 
    398 
    399 	//
    400 	// other
    401 	//
    402 	CLO	R1, R2
    403 	SQRTD	F0, F1
    404 	MUL	R1, R2, R3
    405 
    406 
    407 	//
    408 	// RET
    409 	//
    410 	//	LRETRN	comma // asm doesn't support the trailing comma.
    411 	//	{
    412 	//		outcode(int($1), &nullgen, 0, &nullgen);
    413 	//	}
    414 	SYSCALL
    415 	BEQ	R1, 2(PC)
    416 	RET
    417 
    418 
    419 	// More JMP/JAL cases, and canonical names JMP, CALL.
    420 
    421 	JAL	foo(SB)	// CALL foo(SB)
    422 	BEQ	R1, 2(PC)
    423 	JMP	foo(SB)
    424 	CALL	foo(SB)
    425 
    426 	// END
    427 	//
    428 	//	LEND	comma // asm doesn't support the trailing comma.
    429 	//	{
    430 	//		outcode(int($1), &nullgen, 0, &nullgen);
    431 	//	}
    432 	END
    433