10class FunctionWriterA64 :
public FunctionWriter<FunctionWriterA64> {
11 friend class FunctionWriter<FunctionWriterA64>;
13 util::SmallVector<u32, 16> veneers;
14 u32 unresolved_cond_brs, unresolved_test_brs;
16 static const TargetCIEInfo CIEInfo;
19 static constexpr u32 JumpTableCodeSize = 24;
22 FunctionWriterA64() : FunctionWriter(CIEInfo) {}
24 void begin_func(u32 align, u32 expected_size) {
27 unresolved_cond_brs = unresolved_test_brs = 0;
28 FunctionWriter::begin_func(align, expected_size);
32 void more_space(u32 size);
35 JumpTable &create_jump_table(u32 size, Reg idx, Reg tmp,
bool is32) {
38 ensure_space(JumpTableCodeSize);
43 void ensure_space(
size_t size) {
48 assert(size <= (4 << (14 - 1 - 1)) &&
"cannot skip beyond tbz max dist");
52 bool try_write_inst(u32 inst) {
60 void write_inst(u32 inst) {
65 void write_inst_unchecked(u32 inst) {
67 write_unchecked(inst);
70 void label_ref(Label label, u32 off, LabelFixupKind kind) {
72 if (kind == LabelFixupKind::AARCH64_COND_BR) {
73 unresolved_cond_brs++;
74 }
else if (kind == LabelFixupKind::AARCH64_TEST_BR) {
75 unresolved_test_brs++;