// Test file for AArch64 GAS -- instructions with relocation operators.

func:
	// BFD_RELOC_AARCH64_MOVW_G0
	// immediate
	movz	x0,#:abs_g0:u12

	// BFD_RELOC_AARCH64_MOVW_G0_S
	// immediate
	movz	x0,#:abs_g0_s:s12
	
	// BFD_RELOC_AARCH64_MOVW_G1
	// immediate
	movz	x1,#:abs_g1:u32
	movk	x1,#:abs_g0_nc:u32
	
	// BFD_RELOC_AARCH64_MOVW_G1_S
	// immediate
	movz	x1,#:abs_g1_s:s12
	movk	x1,#:abs_g0_nc:s12
	
	// BFD_RELOC_AARCH64_MOVW_G2
	// immediate
	movz	x1,#:abs_g2:u48
	movk	x1,#:abs_g1_nc:u48
	movk	x1,#:abs_g0_nc:u48
	
	// local data (section relative)
	movz	x1,#:abs_g2:ldata
	movk	x1,#:abs_g1_nc:ldata
	movk	x1,#:abs_g0_nc:ldata
	
	// external data
	movz	x1,#:abs_g2:xdata
	movk	x1,#:abs_g1_nc:xdata
	movk	x1,#:abs_g0_nc:xdata
	
	// BFD_RELOC_AARCH64_MOVW_G2_S
	// immediate
	movz	x1,#:abs_g2_s:s12
	movk	x1,#:abs_g1_nc:s12
	movk	x1,#:abs_g0_nc:s12

	// BFD_RELOC_AARCH64_MOVW_G3
	// immediate
	movz	x1,#:abs_g3:s12
	movk	x1,#:abs_g2_nc:s12
	movk	x1,#:abs_g1_nc:s12
	movk	x1,#:abs_g0_nc:s12
	
	movz	x1,#:abs_g3:u64
	movk	x1,#:abs_g2_nc:u64
	movk	x1,#:abs_g1_nc:u64
	movk	x1,#:abs_g0_nc:u64
	
	// BFD_RELOC_AARCH64_LD_LO19_PCREL
	ldr	x0,llit
	ldr	x1,ldata
	ldr	x2,xdata+12

	// BFD_RELOC_AARCH64_ADR_LO21_PCREL
	//  AARCH64 ADR instruction, holding a simple 21 bit pc-relative byte offset.
	adr	x0,llit
	adr	x1,ldata
	adr	x2,ldata+4088
	adr	x3,xlit
	adr	x4,xdata+16
	adr	x5,xdata+4088
	
	// BFD_RELOC_AARCH64_ADR_HI21_PCREL
	adrp	x0,llit
	adrp	x1,ldata
	adrp	x2,ldata+4088
	adrp	x3,xlit
	adrp	x4,xdata+16
	adrp	x5,xdata+4088
	
	// BFD_RELOC_AARCH64_ADR_HI21_PCREL
	adrp	x0,:pg_hi21:llit
	adrp	x1,:pg_hi21:ldata
	adrp	x2,:pg_hi21:ldata+4088
	adrp	x3,:pg_hi21:xlit
	adrp	x4,:pg_hi21:xdata+16
	adrp	x5,:pg_hi21:xdata+4088

	// BFD_RELOC_AARCH64_ADD_LO12
	add	x0,x0,#:lo12:llit
	add	x1,x1,#:lo12:ldata
	add	x2,x2,#:lo12:ldata+4088
	add	x3,x3,#:lo12:xlit
	add	x4,x4,#:lo12:xdata+16
	add	x5,x5,#:lo12:xdata+4088
	add	x6,x6,u12
	
	// BFD_RELOC_AARCH64_LDST8_LO12
	ldrb	w0, [x0, #:lo12:llit]
	ldrb	w1, [x1, #:lo12:ldata]
	ldrb	w2, [x2, #:lo12:ldata+4088]
	ldrb	w3, [x3, #:lo12:xlit]
	ldrb	w4, [x4, #:lo12:xdata+16]
	ldrb	w5, [x5, #:lo12:xdata+4088]
	ldrb	w6, [x6, u12]

	// BFD_RELOC_AARCH64_TSTBR14
	tbz	x0,#0,lab
	tbz	x1,#63,xlab
	tbnz	x2,#8,lab
	tbnz	x2,#47,xlab
	
	// BFD_RELOC_AARCH64_BRANCH19
	b.eq	lab
	b.eq	xlab

	// BFD_RELOC_AARCH64_COMPARE19
	cbz	x0,lab
	cbnz	x30,xlab

	// BFD_RELOC_AARCH64_JUMP26
	b	lab
	b	xlab

	// BFD_RELOC_AARCH64_CALL26
	bl	lab
	bl	xlab
	
	// BFD_RELOC_AARCH64_MOVW_IMM
	movz	x0, #0x1234, lsl #48
	movk	x0, #0x5678, lsl #32
	movk	x0, #0x9abc, lsl #16
	movk	x0, #0xdef0, lsl #0

	movz	x0, (u64>>48)&0xffff, lsl #48
	movk	x0, (u64>>32)&0xffff, lsl #32
	movk	x0, (u64>>16)&0xffff, lsl #16
	movk	x0, (u64>>0)&0xffff, lsl #0
	
	// BFD_RELOC_AARCH64_BIT_IMM
	orr	x0,x0,bit1
	and	x0,x0,bit2
	and	w0,w0,bit2
	
	// BFD_RELOC_AARCH64_ADD_U12
	add	x0,x0,s12
	add	x0,x0,u12
	sub	x0,x0,s12
	sub	x0,x0,u12

	// BFD_RELOC_AARCH64_EXC_U16
	svc	u16

	// BFD_RELOC_AARCH64_LDST_I9
	//  Signed 9-bit byte offset for load/store single item with writeback options.
	//  Used internally by the AARCH64 assembler and not (currently)
	//  written to any object files.
	ldr	x0,[x1],#s9
	ldr	x0,[x1,#s9]!

	// No writeback, but a negative offset should cause this
	// to be converted to a LDST_I9 relocation
	ldr	x0,[x1,#s9]

	// BFD_RELOC_AARCH64_LDST_U12
	//  Unsigned 12-bit byte offset for load/store single item without options.
	//  Used internally by the AARCH64 assembler and not (currently)
	//  written to any object files.
	ldr	x0,[x1,#(u12*8)]

	// BFD_RELOC_AARCH64_LDST16_LO12
	ldrh	w0, [x0, #:lo12:llit]
	// BFD_RELOC_AARCH64_LDST32_LO12
	ldr	w1, [x1, #:lo12:ldata]
	// BFD_RELOC_AARCH64_LDST64_LO12
	ldr	x2, [x2, #:lo12:ldata+4088]
	// BFD_RELOC_AARCH64_LDST128_LO12
	ldr	q3, [x3, #:lo12:xlit]

	// BFD_RELOC_AARCH64_LDST64_LO12
	prfm	pstl1keep, [x7, #:lo12:ldata+4100]
	
	ret
	
llit:	.word	0xdeadf00d
	
lab:	
		
	.data
	.align 8
	
dummy:	.xword  0
	
ldata:	.xword	0x1122334455667788
	.space	8184
	
.set u8, 248
.set s9, -256
.set s12, -2048	
.set u12, 4095
.set u16, 65535
.set u32, 0x12345678
.set u48, 0xaabbccddeeff
.set u64, 0xfedcba9876543210
.set bit1,0xf000000000000000
.set bit2,~0xf
