ARC: add asm-compat macros

Add asm-compat macroses to be able to co create assembler code
which works and can be build for both ARCv2 and ARCv3 ISAs

Signed-off-by: Vineet Gupta <vgupta@synopsys.com>
Signed-off-by: Eugeniy Paltsev <Eugeniy.Paltsev@synopsys.com>
Signed-off-by: Evgeniy Paltsev <PaltsevEvgeniy@gmail.com>
This commit is contained in:
Vineet Gupta 2021-04-19 16:38:56 +03:00 committed by Kumar Gala
commit 3d56fff7a4
3 changed files with 261 additions and 0 deletions

View file

@ -0,0 +1,101 @@
/* SPDX-License-Identifier: Apache-2.0 */
/*
* Copyright (C) 2021 Synopsys, Inc. (www.synopsys.com)
*
* Author: Vineet Gupta <vgupta@synopsys.com>
*
* ALU/Memory instructions pseudo-mnemonics for ARCv2 and ARC32 ISA
*/
.irp cc,,.hi,.nz
.macro MOVR\cc d, s
mov\cc \d, \s
.endm
.endr
.irp aa,,.ab,.as,.aw
.macro LDR\aa d, s, off=0
ld\aa \d, [\s, \off]
.endm
.endr
.irp aa,,.ab,.as,.aw
.macro STR\aa d, s, off=0
; workaround assembler barfing for ST r, [@symb, 0]
.if \off == 0
st\aa \d, [\s]
.else
st\aa \d, [\s, \off]
.endif
.endm
.endr
.macro PUSHR r
push \r
.endm
.macro POPR r
pop \r
.endm
.macro LRR d, aux
lr \d, \aux
.endm
.macro SRR d, aux
sr \d, \aux
.endm
.irp cc,,.nz
.macro ADDR\cc d, s, v
add\cc \d, \s, \v
.endm
.endr
.irp cc,,.nz
.macro ADD2R\cc d, s, v
add2\cc \d, \s, \v
.endm
.endr
.macro ADD3R d, s, v
add3 \d, \s, \v
.endm
.macro SUBR d, s, v
sub \d, \s, \v
.endm
.macro BMSKNR d, s, v
bmskn \d, \s, \v
.endm
.macro LSRR d, s, v
lsr \d, \s, \v
.endm
.macro ASLR d, s, v
asl \d, \s, \v
.endm
.macro ANDR d, s, v
and \d, \s, \v
.endm
.macro ORR, d, s, v
or \d, \s, \v
.endm
.irp cc,ne,eq
.macro BRR\cc d, s, lbl
br\cc \d, \s, \lbl
.endm
.endr
.macro BREQR d, s, lbl
breq \d, \s, \lbl
.endm
.macro CMPR op1, op2
cmp \op1, \op2
.endm

View file

@ -0,0 +1,113 @@
/* SPDX-License-Identifier: Apache-2.0 */
/*
* Copyright (C) 2021 Synopsys, Inc. (www.synopsys.com)
*
* Author: Vineet Gupta <vgupta@synopsys.com>
*
* pseudo-mnemonics for ALU/Memory instructions for ARC64 ISA
*/
.irp cc,,.hi,.nz
.macro MOVR\cc d, s
movl\cc \d, \s
.endm
.endr
.irp aa,,.ab,.as,.aw
.macro LDR\aa d, s, off=0
ldl\aa \d, [\s, \off]
.endm
.endr
.irp aa,.ab,.as,.aw
.macro STR\aa d, s, off=0
; workaround assembler barfing for ST r, [@symb, 0]
.if \off == 0
stl\aa \d, [\s]
.else
stl\aa \d, [\s, \off]
.endif
.endm
.endr
.macro STR d, s, off=0
.if \off == 0
stl \d, [\s]
.else
.if \off > 256
STR.as \d, \s, \off / 8
.else
stl \d, [\s, \off]
.endif
.endif
.endm
.macro PUSHR r
pushl \r
.endm
.macro POPR r
popl \r
.endm
.macro LRR d, aux
lrl \d, \aux
.endm
.macro SRR d, aux
srl \d, \aux
.endm
.irp cc,,.nz
.macro ADDR\cc d, s, v
addl\cc \d, \s, \v
.endm
.endr
.irp cc,,.nz
.macro ADD2R\cc d, s, v
add2l\cc \d, \s, \v
.endm
.endr
.macro ADD3R d, s, v
add3l \d, \s, \v
.endm
.macro SUBR d, s, v
subl \d, \s, \v
.endm
.macro BMSKNR d, s, v
bmsknl \d, \s, \v
.endm
.macro LSRR d, s, v
lsrl \d, \s, \v
.endm
.macro ASLR d, s, v
asll \d, \s, \v
.endm
.macro ANDR d, s, v
andl \d, \s, \v
.endm
.macro ORR, d, s, v
orl \d, \s, \v
.endm
.irp cc,ne,eq
.macro BRR\cc d, s, lbl
br\cc\()l \d, \s, \lbl
.endm
.endr
.macro BREQR d, s, lbl
breql \d, \s, \lbl
.endm
.macro CMPR op1, op2
cmpl \op1, \op2
.endm

View file

@ -0,0 +1,47 @@
/* SPDX-License-Identifier: Apache-2.0 */
/*
* Copyright (C) 2021 Synopsys, Inc. (www.synopsys.com)
*
* Author: Vineet Gupta <vgupta@synopsys.com>
*
* Top level include file provding ISA pseudo-mnemonics for use in assemmler
* and inline assembly.
*
* - Helps code reuse across ARC64/ARC32/ARCv2
* e.g. "LDR" maps to 'LD' on 32-bit ISA, 'LDL' on 64-bit ARCv2/ARC64
*
* - Provides emulation with multiple instructions if the case be
* e.g. "DBNZ" implemented using 'SUB' and 'BRNE'
*
* - Looks more complex than it really is: mainly because Kconfig defines
* are not "honored" in inline assembly. So each varaint is unconditional
* code in a standalone file with Kconfig based #ifdef'ry here. During the
* build process, the "C" preprocessor runs through this file, leaving
* just the final variant include in code fed to compiler/assembler.
*/
#ifndef __ASM_ARC_ASM_H
#define __ASM_ARC_ASM_H 1
#ifdef _ASMLANGUAGE
#if defined(CONFIG_ISA_ARCV3) && defined(CONFIG_64BIT)
#define ARC_PTR .xword
#define ARC_REGSZ 8
#define ARC_REGSHIFT 3
#include "asm-macro-64-bit-gnu.h"
#else
#define ARC_PTR .word
#define ARC_REGSZ 4
#define ARC_REGSHIFT 2
#include "asm-macro-32-bit-mwdt.h"
#endif
#else /* !_ASMLANGUAGE */
#error "asm-compat macroses used not in assembler code!"
#endif /* _ASMLANGUAGE */
#endif