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