17118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu/* 27118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu * Mesa 3-D graphics library 37118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu * 47118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu * Copyright (C) 2012-2013 LunarG, Inc. 57118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu * 67118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu * Permission is hereby granted, free of charge, to any person obtaining a 77118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu * copy of this software and associated documentation files (the "Software"), 87118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu * to deal in the Software without restriction, including without limitation 97118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu * the rights to use, copy, modify, merge, publish, distribute, sublicense, 107118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu * and/or sell copies of the Software, and to permit persons to whom the 117118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu * Software is furnished to do so, subject to the following conditions: 127118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu * 137118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu * The above copyright notice and this permission notice shall be included 147118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu * in all copies or substantial portions of the Software. 157118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu * 167118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 177118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 187118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 197118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 207118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 217118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 227118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu * DEALINGS IN THE SOFTWARE. 237118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu * 247118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu * Authors: 257118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu * Chia-I Wu <olv@lunarg.com> 267118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu */ 277118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu 287118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu#ifndef TOY_COMPILER_H 297118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu#define TOY_COMPILER_H 307118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu 3101e3e82a56310932667c60bcca9cc9fdfd8b87c4Chia-I Wu#include "genhw/genhw.h" 32e7a73b75a0dbd599187b8980b2e1e1cb5dfdaf6dMarek Olšák#include "util/slab.h" 337118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu 347118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu#include "ilo_common.h" 357118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu#include "toy_compiler_reg.h" 367118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu 377118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu/** 387118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu * Toy opcodes. 397118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu */ 407118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wuenum toy_opcode { 416c6bd796adda4173ebaf494d6cd2a96d511f1ea3Chia-I Wu /* 0..127 are reserved for GEN6_OPCODE_x */ 427118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu TOY_OPCODE_LAST_HW = 127, 437118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu 44ad39b991ce34d8af11589c78102873d8c28b1682Chia-I Wu TOY_OPCODE_DO, 45ad39b991ce34d8af11589c78102873d8c28b1682Chia-I Wu 467118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu /* TGSI register functions */ 477118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu TOY_OPCODE_TGSI_IN, 487118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu TOY_OPCODE_TGSI_CONST, 497118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu TOY_OPCODE_TGSI_SV, 507118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu TOY_OPCODE_TGSI_IMM, 517118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu TOY_OPCODE_TGSI_INDIRECT_FETCH, 527118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu TOY_OPCODE_TGSI_INDIRECT_STORE, 537118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu 547118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu /* TGSI sampling functions */ 557118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu TOY_OPCODE_TGSI_TEX, 567118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu TOY_OPCODE_TGSI_TXB, 577118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu TOY_OPCODE_TGSI_TXD, 587118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu TOY_OPCODE_TGSI_TXL, 597118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu TOY_OPCODE_TGSI_TXP, 607118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu TOY_OPCODE_TGSI_TXF, 617118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu TOY_OPCODE_TGSI_TXQ, 627118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu TOY_OPCODE_TGSI_TXQ_LZ, 637118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu TOY_OPCODE_TGSI_TEX2, 647118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu TOY_OPCODE_TGSI_TXB2, 657118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu TOY_OPCODE_TGSI_TXL2, 667118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu TOY_OPCODE_TGSI_SAMPLE, 677118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu TOY_OPCODE_TGSI_SAMPLE_I, 687118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu TOY_OPCODE_TGSI_SAMPLE_I_MS, 697118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu TOY_OPCODE_TGSI_SAMPLE_B, 707118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu TOY_OPCODE_TGSI_SAMPLE_C, 717118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu TOY_OPCODE_TGSI_SAMPLE_C_LZ, 727118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu TOY_OPCODE_TGSI_SAMPLE_D, 737118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu TOY_OPCODE_TGSI_SAMPLE_L, 747118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu TOY_OPCODE_TGSI_GATHER4, 757118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu TOY_OPCODE_TGSI_SVIEWINFO, 767118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu TOY_OPCODE_TGSI_SAMPLE_POS, 777118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu TOY_OPCODE_TGSI_SAMPLE_INFO, 787118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu 797118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu /* math functions */ 807118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu TOY_OPCODE_INV, 817118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu TOY_OPCODE_LOG, 827118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu TOY_OPCODE_EXP, 837118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu TOY_OPCODE_SQRT, 847118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu TOY_OPCODE_RSQ, 857118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu TOY_OPCODE_SIN, 867118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu TOY_OPCODE_COS, 877118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu TOY_OPCODE_FDIV, 887118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu TOY_OPCODE_POW, 897118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu TOY_OPCODE_INT_DIV_QUOTIENT, 907118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu TOY_OPCODE_INT_DIV_REMAINDER, 917118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu 927118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu /* URB functions */ 937118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu TOY_OPCODE_URB_WRITE, 947118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu 957118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu /* GS-specific functions */ 967118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu TOY_OPCODE_EMIT, 977118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu TOY_OPCODE_ENDPRIM, 987118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu 997118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu /* FS-specific functions */ 1007118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu TOY_OPCODE_DDX, 1017118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu TOY_OPCODE_DDY, 1027118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu TOY_OPCODE_FB_WRITE, 1037118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu TOY_OPCODE_KIL, 1047118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu}; 1057118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu 1067118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu/** 1077118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu * Toy instruction. 1087118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu */ 1097118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wustruct toy_inst { 1107118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu unsigned opcode:8; /* enum toy_opcode */ 1116c6bd796adda4173ebaf494d6cd2a96d511f1ea3Chia-I Wu unsigned access_mode:1; /* GEN6_ALIGN_x */ 1126c6bd796adda4173ebaf494d6cd2a96d511f1ea3Chia-I Wu unsigned mask_ctrl:1; /* GEN6_MASKCTRL_x */ 1136c6bd796adda4173ebaf494d6cd2a96d511f1ea3Chia-I Wu unsigned dep_ctrl:2; /* GEN6_DEPCTRL_x */ 1146c6bd796adda4173ebaf494d6cd2a96d511f1ea3Chia-I Wu unsigned qtr_ctrl:2; /* GEN6_QTRCTRL_x */ 1156c6bd796adda4173ebaf494d6cd2a96d511f1ea3Chia-I Wu unsigned thread_ctrl:2; /* GEN6_THREADCTRL_x */ 1166c6bd796adda4173ebaf494d6cd2a96d511f1ea3Chia-I Wu unsigned pred_ctrl:4; /* GEN6_PREDCTRL_x */ 1177118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu unsigned pred_inv:1; /* true or false */ 1186c6bd796adda4173ebaf494d6cd2a96d511f1ea3Chia-I Wu unsigned exec_size:3; /* GEN6_EXECSIZE_x */ 1196c6bd796adda4173ebaf494d6cd2a96d511f1ea3Chia-I Wu unsigned cond_modifier:4; /* GEN6_COND_x */ 1207118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu unsigned acc_wr_ctrl:1; /* true or false */ 1217118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu unsigned saturate:1; /* true or false */ 1227118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu 1237118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu /* true if the instruction should be ignored for instruction iteration */ 1247118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu unsigned marker:1; 1257118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu 1267118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu unsigned pad:1; 1277118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu 1287118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu struct toy_dst dst; 1297118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu struct toy_src src[5]; /* match TGSI_FULL_MAX_SRC_REGISTERS */ 1307118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu 1317118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu struct { 1327118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu int target; /* TGSI_TEXTURE_x */ 1337118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu struct toy_src offsets[1]; /* need to be 4 when GATHER4 is supported */ 1347118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu } tex; 1357118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu 1367118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu struct list_head list; 1377118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu}; 1387118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu 139566d1889eaceaa174f1f16f6ff1553154626be11Chia-I Wustruct toy_compaction_table { 140566d1889eaceaa174f1f16f6ff1553154626be11Chia-I Wu uint32_t control[32]; 141566d1889eaceaa174f1f16f6ff1553154626be11Chia-I Wu uint32_t datatype[32]; 142566d1889eaceaa174f1f16f6ff1553154626be11Chia-I Wu uint32_t subreg[32]; 143566d1889eaceaa174f1f16f6ff1553154626be11Chia-I Wu uint32_t src[32]; 144a7911620f61a10f6297155d58445ed146bbcb056Chia-I Wu 145a7911620f61a10f6297155d58445ed146bbcb056Chia-I Wu uint32_t control_3src[4]; 146a7911620f61a10f6297155d58445ed146bbcb056Chia-I Wu uint64_t source_3src[4]; 147566d1889eaceaa174f1f16f6ff1553154626be11Chia-I Wu}; 148566d1889eaceaa174f1f16f6ff1553154626be11Chia-I Wu 1497118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu/** 1507118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu * Toy compiler. 1517118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu */ 1527118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wustruct toy_compiler { 1537562f9e907d9bb00832c6b75b833acd169bfe0eaChia-I Wu const struct ilo_dev *dev; 1547118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu 1557118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu struct toy_inst templ; 156e7a73b75a0dbd599187b8980b2e1e1cb5dfdaf6dMarek Olšák struct slab_mempool mempool; 1577118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu struct list_head instructions; 1587118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu struct list_head *iter, *iter_next; 1597118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu 1607118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu /* this is not set until toy_compiler_legalize_for_asm() */ 1617118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu int num_instructions; 1627118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu 1637118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu int rect_linear_width; 1647118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu int next_vrf; 1657118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu 1667118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu bool fail; 1677118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu const char *reason; 1687118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu}; 1697118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu 1707118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu/** 1717118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu * Allocate the given number of VRF registers. 1727118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu */ 1737118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wustatic inline int 1747118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wutc_alloc_vrf(struct toy_compiler *tc, int count) 1757118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu{ 1767118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu const int vrf = tc->next_vrf; 1777118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu 1787118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu tc->next_vrf += count; 1797118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu 1807118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu return vrf; 1817118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu} 1827118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu 1837118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu/** 1847118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu * Allocate a temporary register. 1857118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu */ 1867118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wustatic inline struct toy_dst 1877118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wutc_alloc_tmp(struct toy_compiler *tc) 1887118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu{ 1897118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu return tdst(TOY_FILE_VRF, tc_alloc_vrf(tc, 1), 0); 1907118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu} 1917118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu 1927118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu/** 1937118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu * Allocate four temporary registers. 1947118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu */ 1957118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wustatic inline void 1967118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wutc_alloc_tmp4(struct toy_compiler *tc, struct toy_dst *tmp) 1977118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu{ 1987118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu tmp[0] = tc_alloc_tmp(tc); 1997118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu tmp[1] = tc_alloc_tmp(tc); 2007118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu tmp[2] = tc_alloc_tmp(tc); 2017118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu tmp[3] = tc_alloc_tmp(tc); 2027118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu} 2037118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu 2047118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu/** 2057118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu * Duplicate an instruction at the current location. 2067118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu */ 2077118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wustatic inline struct toy_inst * 2087118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wutc_duplicate_inst(struct toy_compiler *tc, const struct toy_inst *inst) 2097118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu{ 2107118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu struct toy_inst *new_inst; 2117118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu 212e7a73b75a0dbd599187b8980b2e1e1cb5dfdaf6dMarek Olšák new_inst = slab_alloc_st(&tc->mempool); 2137118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu if (!new_inst) 2147118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu return NULL; 2157118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu 2167118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu *new_inst = *inst; 2177118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu list_addtail(&new_inst->list, tc->iter_next); 2187118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu 2197118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu return new_inst; 2207118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu} 2217118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu 2227118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu/** 2237118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu * Move an instruction to the current location. 2247118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu */ 2257118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wustatic inline void 2267118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wutc_move_inst(struct toy_compiler *tc, struct toy_inst *inst) 2277118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu{ 2287118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu list_del(&inst->list); 2297118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu list_addtail(&inst->list, tc->iter_next); 2307118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu} 2317118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu 2327118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu/** 2337118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu * Discard an instruction. 2347118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu */ 2357118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wustatic inline void 2367118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wutc_discard_inst(struct toy_compiler *tc, struct toy_inst *inst) 2377118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu{ 2387118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu list_del(&inst->list); 239e7a73b75a0dbd599187b8980b2e1e1cb5dfdaf6dMarek Olšák slab_free_st(&tc->mempool, inst); 2407118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu} 2417118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu 2427118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu/** 2437118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu * Add a new instruction at the current location, using tc->templ as the 2447118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu * template. 2457118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu */ 2467118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wustatic inline struct toy_inst * 2477118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wutc_add(struct toy_compiler *tc) 2487118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu{ 2497118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu return tc_duplicate_inst(tc, &tc->templ); 2507118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu} 2517118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu 2527118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu/** 2537118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu * A convenient version of tc_add() for instructions with 3 source operands. 2547118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu */ 2557118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wustatic inline struct toy_inst * 2567118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wutc_add3(struct toy_compiler *tc, unsigned opcode, 2577118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu struct toy_dst dst, 2587118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu struct toy_src src0, 2597118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu struct toy_src src1, 2607118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu struct toy_src src2) 2617118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu{ 2627118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu struct toy_inst *inst; 2637118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu 2647118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu inst = tc_add(tc); 2657118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu if (!inst) 2667118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu return NULL; 2677118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu 2687118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu inst->opcode = opcode; 2697118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu inst->dst = dst; 2707118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu inst->src[0] = src0; 2717118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu inst->src[1] = src1; 2727118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu inst->src[2] = src2; 2737118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu 2747118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu return inst; 2757118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu} 2767118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu 2777118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu/** 2787118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu * A convenient version of tc_add() for instructions with 2 source operands. 2797118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu */ 2807118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wustatic inline struct toy_inst * 2817118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wutc_add2(struct toy_compiler *tc, int opcode, 2827118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu struct toy_dst dst, 2837118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu struct toy_src src0, 2847118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu struct toy_src src1) 2857118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu{ 2867118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu return tc_add3(tc, opcode, dst, src0, src1, tsrc_null()); 2877118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu} 2887118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu 2897118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu/** 2907118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu * A convenient version of tc_add() for instructions with 1 source operand. 2917118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu */ 2927118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wustatic inline struct toy_inst * 2937118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wutc_add1(struct toy_compiler *tc, unsigned opcode, 2947118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu struct toy_dst dst, 2957118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu struct toy_src src0) 2967118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu{ 2977118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu return tc_add2(tc, opcode, dst, src0, tsrc_null()); 2987118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu} 2997118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu 3007118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu/** 3017118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu * A convenient version of tc_add() for instructions without source or 3027118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu * destination operands. 3037118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu */ 3047118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wustatic inline struct toy_inst * 3057118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wutc_add0(struct toy_compiler *tc, unsigned opcode) 3067118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu{ 3077118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu return tc_add1(tc, opcode, tdst_null(), tsrc_null()); 3087118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu} 3097118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu 3107118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu#define TC_ALU0(func, opcode) \ 3117118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wustatic inline struct toy_inst * \ 3127118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wufunc(struct toy_compiler *tc) \ 3137118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu{ \ 3147118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu return tc_add0(tc, opcode); \ 3157118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu} 3167118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu 3177118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu#define TC_ALU1(func, opcode) \ 3187118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wustatic inline struct toy_inst * \ 3197118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wufunc(struct toy_compiler *tc, \ 3207118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu struct toy_dst dst, \ 3217118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu struct toy_src src) \ 3227118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu{ \ 3237118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu return tc_add1(tc, opcode, dst, src); \ 3247118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu} 3257118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu 3267118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu#define TC_ALU2(func, opcode) \ 3277118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wustatic inline struct toy_inst * \ 3287118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wufunc(struct toy_compiler *tc, \ 3297118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu struct toy_dst dst, \ 3307118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu struct toy_src src0, \ 3317118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu struct toy_src src1) \ 3327118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu{ \ 3337118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu return tc_add2(tc, opcode, \ 3347118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu dst, src0, src1); \ 3357118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu} 3367118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu 3377118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu#define TC_ALU3(func, opcode) \ 3387118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wustatic inline struct toy_inst * \ 3397118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wufunc(struct toy_compiler *tc, \ 3407118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu struct toy_dst dst, \ 3417118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu struct toy_src src0, \ 3427118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu struct toy_src src1, \ 3437118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu struct toy_src src2) \ 3447118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu{ \ 3457118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu return tc_add3(tc, opcode, \ 3467118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu dst, src0, src1, src2); \ 3477118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu} 3487118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu 3497118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu#define TC_CND2(func, opcode) \ 3507118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wustatic inline struct toy_inst * \ 3517118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wufunc(struct toy_compiler *tc, \ 3527118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu struct toy_dst dst, \ 3537118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu struct toy_src src0, \ 3547118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu struct toy_src src1, \ 3557118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu unsigned cond_modifier) \ 3567118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu{ \ 3577118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu struct toy_inst *inst; \ 3587118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu inst = tc_add2(tc, opcode, \ 3597118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu dst, src0, src1); \ 3607118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu inst->cond_modifier = cond_modifier; \ 3617118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu return inst; \ 3627118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu} 3637118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu 3646c6bd796adda4173ebaf494d6cd2a96d511f1ea3Chia-I WuTC_ALU0(tc_NOP, GEN6_OPCODE_NOP) 3656c6bd796adda4173ebaf494d6cd2a96d511f1ea3Chia-I WuTC_ALU0(tc_ELSE, GEN6_OPCODE_ELSE) 3666c6bd796adda4173ebaf494d6cd2a96d511f1ea3Chia-I WuTC_ALU0(tc_ENDIF, GEN6_OPCODE_ENDIF) 3676c6bd796adda4173ebaf494d6cd2a96d511f1ea3Chia-I WuTC_ALU1(tc_MOV, GEN6_OPCODE_MOV) 3686c6bd796adda4173ebaf494d6cd2a96d511f1ea3Chia-I WuTC_ALU1(tc_RNDD, GEN6_OPCODE_RNDD) 3697118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I WuTC_ALU1(tc_INV, TOY_OPCODE_INV) 3706c6bd796adda4173ebaf494d6cd2a96d511f1ea3Chia-I WuTC_ALU1(tc_FRC, GEN6_OPCODE_FRC) 3717118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I WuTC_ALU1(tc_EXP, TOY_OPCODE_EXP) 3727118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I WuTC_ALU1(tc_LOG, TOY_OPCODE_LOG) 3736c6bd796adda4173ebaf494d6cd2a96d511f1ea3Chia-I WuTC_ALU2(tc_ADD, GEN6_OPCODE_ADD) 3746c6bd796adda4173ebaf494d6cd2a96d511f1ea3Chia-I WuTC_ALU2(tc_MUL, GEN6_OPCODE_MUL) 3756c6bd796adda4173ebaf494d6cd2a96d511f1ea3Chia-I WuTC_ALU2(tc_AND, GEN6_OPCODE_AND) 3766c6bd796adda4173ebaf494d6cd2a96d511f1ea3Chia-I WuTC_ALU2(tc_OR, GEN6_OPCODE_OR) 3776c6bd796adda4173ebaf494d6cd2a96d511f1ea3Chia-I WuTC_ALU2(tc_DP2, GEN6_OPCODE_DP2) 3786c6bd796adda4173ebaf494d6cd2a96d511f1ea3Chia-I WuTC_ALU2(tc_DP3, GEN6_OPCODE_DP3) 3796c6bd796adda4173ebaf494d6cd2a96d511f1ea3Chia-I WuTC_ALU2(tc_DP4, GEN6_OPCODE_DP4) 3806c6bd796adda4173ebaf494d6cd2a96d511f1ea3Chia-I WuTC_ALU2(tc_SHL, GEN6_OPCODE_SHL) 3816c6bd796adda4173ebaf494d6cd2a96d511f1ea3Chia-I WuTC_ALU2(tc_SHR, GEN6_OPCODE_SHR) 3827118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I WuTC_ALU2(tc_POW, TOY_OPCODE_POW) 3836c6bd796adda4173ebaf494d6cd2a96d511f1ea3Chia-I WuTC_ALU3(tc_MAC, GEN6_OPCODE_MAC) 3846c6bd796adda4173ebaf494d6cd2a96d511f1ea3Chia-I WuTC_CND2(tc_SEL, GEN6_OPCODE_SEL) 3856c6bd796adda4173ebaf494d6cd2a96d511f1ea3Chia-I WuTC_CND2(tc_CMP, GEN6_OPCODE_CMP) 3866c6bd796adda4173ebaf494d6cd2a96d511f1ea3Chia-I WuTC_CND2(tc_IF, GEN6_OPCODE_IF) 3876c6bd796adda4173ebaf494d6cd2a96d511f1ea3Chia-I WuTC_CND2(tc_SEND, GEN6_OPCODE_SEND) 3887118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu 3897118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu/** 3907118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu * Upcast a list_head to an instruction. 3917118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu */ 3927118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wustatic inline struct toy_inst * 3937118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wutc_list_to_inst(struct toy_compiler *tc, struct list_head *item) 3947118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu{ 3957118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu return container_of(item, (struct toy_inst *) NULL, list); 3967118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu} 3977118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu 3987118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu/** 3997118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu * Return the instruction at the current location. 4007118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu */ 4017118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wustatic inline struct toy_inst * 4027118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wutc_current(struct toy_compiler *tc) 4037118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu{ 4047118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu return (tc->iter != &tc->instructions) ? 4057118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu tc_list_to_inst(tc, tc->iter) : NULL; 4067118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu} 4077118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu 4087118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu/** 4097118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu * Set the current location to the head. 4107118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu */ 4117118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wustatic inline void 4127118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wutc_head(struct toy_compiler *tc) 4137118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu{ 4147118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu tc->iter = &tc->instructions; 4157118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu tc->iter_next = tc->iter->next; 4167118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu} 4177118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu 4187118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu/** 4197118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu * Set the current location to the tail. 4207118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu */ 4217118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wustatic inline void 4227118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wutc_tail(struct toy_compiler *tc) 4237118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu{ 4247118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu tc->iter = &tc->instructions; 4257118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu tc->iter_next = tc->iter; 4267118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu} 4277118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu 4287118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu/** 4297118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu * Advance the current location. 4307118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu */ 4317118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wustatic inline struct toy_inst * 4327118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wutc_next_no_skip(struct toy_compiler *tc) 4337118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu{ 4347118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu /* stay at the tail so that new instructions are added there */ 4357118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu if (tc->iter_next == &tc->instructions) { 4367118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu tc_tail(tc); 4377118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu return NULL; 4387118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu } 4397118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu 4407118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu tc->iter = tc->iter_next; 4417118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu tc->iter_next = tc->iter_next->next; 4427118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu 4437118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu return tc_list_to_inst(tc, tc->iter); 4447118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu} 4457118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu 4467118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu/** 4477118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu * Advance the current location, skipping markers. 4487118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu */ 4497118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wustatic inline struct toy_inst * 4507118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wutc_next(struct toy_compiler *tc) 4517118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu{ 4527118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu struct toy_inst *inst; 4537118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu 4547118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu do { 4557118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu inst = tc_next_no_skip(tc); 4567118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu } while (inst && inst->marker); 4577118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu 4587118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu return inst; 4597118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu} 4607118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu 4617118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wustatic inline void 4627118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wutc_fail(struct toy_compiler *tc, const char *reason) 4637118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu{ 4647118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu if (!tc->fail) { 4657118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu tc->fail = true; 4667118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu tc->reason = reason; 4677118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu } 4687118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu} 4697118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu 4707118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wuvoid 4717562f9e907d9bb00832c6b75b833acd169bfe0eaChia-I Wutoy_compiler_init(struct toy_compiler *tc, const struct ilo_dev *dev); 4727118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu 4737118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wuvoid 4747118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wutoy_compiler_cleanup(struct toy_compiler *tc); 4757118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu 4767118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wuvoid 4777118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wutoy_compiler_dump(struct toy_compiler *tc); 4787118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu 4797118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wuvoid * 4807118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wutoy_compiler_assemble(struct toy_compiler *tc, int *size); 4817118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu 482566d1889eaceaa174f1f16f6ff1553154626be11Chia-I Wuconst struct toy_compaction_table * 4837562f9e907d9bb00832c6b75b833acd169bfe0eaChia-I Wutoy_compiler_get_compaction_table(const struct ilo_dev *dev); 484566d1889eaceaa174f1f16f6ff1553154626be11Chia-I Wu 4857118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wuvoid 4867562f9e907d9bb00832c6b75b833acd169bfe0eaChia-I Wutoy_compiler_disassemble(const struct ilo_dev *dev, 48743bf14eaeb3e93bb9f69966331d001922954acabChia-I Wu const void *kernel, int size, 48843bf14eaeb3e93bb9f69966331d001922954acabChia-I Wu bool dump_hex); 4897118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu 4907118ff8bb02046bb2f440e2a5c48d9a41bb057b1Chia-I Wu#endif /* TOY_COMPILER_H */ 491