1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker * Copyright © 2017 Rob Clark <[email protected]>
3*61046927SAndroid Build Coastguard Worker * SPDX-License-Identifier: MIT
4*61046927SAndroid Build Coastguard Worker */
5*61046927SAndroid Build Coastguard Worker
6*61046927SAndroid Build Coastguard Worker #ifndef _ASM_H_
7*61046927SAndroid Build Coastguard Worker #define _ASM_H_
8*61046927SAndroid Build Coastguard Worker
9*61046927SAndroid Build Coastguard Worker #include <stdbool.h>
10*61046927SAndroid Build Coastguard Worker #include <stdint.h>
11*61046927SAndroid Build Coastguard Worker #include "afuc.h"
12*61046927SAndroid Build Coastguard Worker
13*61046927SAndroid Build Coastguard Worker extern int gpuver;
14*61046927SAndroid Build Coastguard Worker
15*61046927SAndroid Build Coastguard Worker struct asm_label {
16*61046927SAndroid Build Coastguard Worker unsigned offset;
17*61046927SAndroid Build Coastguard Worker const char *label;
18*61046927SAndroid Build Coastguard Worker };
19*61046927SAndroid Build Coastguard Worker
20*61046927SAndroid Build Coastguard Worker struct afuc_instr *next_instr(afuc_opc opc);
21*61046927SAndroid Build Coastguard Worker void decl_label(const char *str);
22*61046927SAndroid Build Coastguard Worker void decl_jumptbl(void);
23*61046927SAndroid Build Coastguard Worker void align_instr(unsigned alignment);
24*61046927SAndroid Build Coastguard Worker void next_section(void);
25*61046927SAndroid Build Coastguard Worker void parse_version(struct afuc_instr *instr);
26*61046927SAndroid Build Coastguard Worker
27*61046927SAndroid Build Coastguard Worker static inline uint32_t
parse_reg(const char * str)28*61046927SAndroid Build Coastguard Worker parse_reg(const char *str)
29*61046927SAndroid Build Coastguard Worker {
30*61046927SAndroid Build Coastguard Worker char *retstr;
31*61046927SAndroid Build Coastguard Worker long int ret;
32*61046927SAndroid Build Coastguard Worker
33*61046927SAndroid Build Coastguard Worker if (!strcmp(str, "$rem"))
34*61046927SAndroid Build Coastguard Worker return REG_REM;
35*61046927SAndroid Build Coastguard Worker else if (!strcmp(str, "$memdata"))
36*61046927SAndroid Build Coastguard Worker return REG_MEMDATA;
37*61046927SAndroid Build Coastguard Worker else if (!strcmp(str, "$addr"))
38*61046927SAndroid Build Coastguard Worker return REG_ADDR;
39*61046927SAndroid Build Coastguard Worker else if (!strcmp(str, "$regdata"))
40*61046927SAndroid Build Coastguard Worker return REG_REGDATA;
41*61046927SAndroid Build Coastguard Worker else if (!strcmp(str, "$usraddr"))
42*61046927SAndroid Build Coastguard Worker return REG_USRADDR;
43*61046927SAndroid Build Coastguard Worker else if (!strcmp(str, "$data"))
44*61046927SAndroid Build Coastguard Worker return 0x1f;
45*61046927SAndroid Build Coastguard Worker else if (!strcmp(str, "$sp"))
46*61046927SAndroid Build Coastguard Worker return REG_SP;
47*61046927SAndroid Build Coastguard Worker else if (!strcmp(str, "$lr"))
48*61046927SAndroid Build Coastguard Worker return REG_LR;
49*61046927SAndroid Build Coastguard Worker
50*61046927SAndroid Build Coastguard Worker ret = strtol(str + 1, &retstr, 16);
51*61046927SAndroid Build Coastguard Worker
52*61046927SAndroid Build Coastguard Worker if (*retstr != '\0') {
53*61046927SAndroid Build Coastguard Worker printf("invalid register: %s\n", str);
54*61046927SAndroid Build Coastguard Worker exit(2);
55*61046927SAndroid Build Coastguard Worker }
56*61046927SAndroid Build Coastguard Worker
57*61046927SAndroid Build Coastguard Worker return ret;
58*61046927SAndroid Build Coastguard Worker }
59*61046927SAndroid Build Coastguard Worker
60*61046927SAndroid Build Coastguard Worker static inline uint32_t
parse_literal(const char * str)61*61046927SAndroid Build Coastguard Worker parse_literal(const char *str)
62*61046927SAndroid Build Coastguard Worker {
63*61046927SAndroid Build Coastguard Worker char *retstr;
64*61046927SAndroid Build Coastguard Worker long int ret;
65*61046927SAndroid Build Coastguard Worker
66*61046927SAndroid Build Coastguard Worker ret = strtol(str + 1, &retstr, 16);
67*61046927SAndroid Build Coastguard Worker
68*61046927SAndroid Build Coastguard Worker if (*retstr != ']') {
69*61046927SAndroid Build Coastguard Worker printf("invalid literal: %s\n", str);
70*61046927SAndroid Build Coastguard Worker exit(2);
71*61046927SAndroid Build Coastguard Worker }
72*61046927SAndroid Build Coastguard Worker
73*61046927SAndroid Build Coastguard Worker return ret;
74*61046927SAndroid Build Coastguard Worker }
75*61046927SAndroid Build Coastguard Worker
76*61046927SAndroid Build Coastguard Worker static inline uint32_t
parse_bit(const char * str)77*61046927SAndroid Build Coastguard Worker parse_bit(const char *str)
78*61046927SAndroid Build Coastguard Worker {
79*61046927SAndroid Build Coastguard Worker return strtol(str + 1, NULL, 10);
80*61046927SAndroid Build Coastguard Worker }
81*61046927SAndroid Build Coastguard Worker
82*61046927SAndroid Build Coastguard Worker unsigned parse_control_reg(const char *name);
83*61046927SAndroid Build Coastguard Worker unsigned parse_sqe_reg(const char *name);
84*61046927SAndroid Build Coastguard Worker
85*61046927SAndroid Build Coastguard Worker void yyset_in(FILE *_in_str);
86*61046927SAndroid Build Coastguard Worker
87*61046927SAndroid Build Coastguard Worker #endif /* _ASM_H_ */
88