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