xref: /aosp_15_r20/external/mesa3d/src/freedreno/afuc/asm.h (revision 6104692788411f58d303aa86923a9ff6ecaded22)
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