Retargeting GCC to Spim: A Recap

Similar documents
Incremental Machine Descriptions for GCC

Introduction to Machine Descriptions

GCC Internals: A Conceptual View Part II

We can emit stack-machine-style code for expressions via recursion

Course Administration

COMP 303 Computer Architecture Lecture 3. Comp 303 Computer Architecture

Procedure Calls Main Procedure. MIPS Calling Convention. MIPS-specific info. Procedure Calls. MIPS-specific info who cares? Chapter 2.7 Appendix A.

Instruction Set Architecture part 1 (Introduction) Mehran Rezaei

Code Generation. The Main Idea of Today s Lecture. We can emit stack-machine-style code for expressions via recursion. Lecture Outline.

CS222: Dr. A. Sahu. Indian Institute of Technology Guwahati

Implementing Procedure Calls

specrtl: A Language for GCC Machine Descriptions

Chapter 2A Instructions: Language of the Computer

CS 61c: Great Ideas in Computer Architecture

MIPS Datapath. MIPS Registers (and the conventions associated with them) MIPS Instruction Types

Stored Program Concept. Instructions: Characteristics of Instruction Set. Architecture Specification. Example of multiple operands

Machine Language Instructions Introduction. Instructions Words of a language understood by machine. Instruction set Vocabulary of the machine

Do-While Example. In C++ In assembly language. do { z--; while (a == b); z = b; loop: addi $s2, $s2, -1 beq $s0, $s1, loop or $s2, $s1, $zero

Lectures 3-4: MIPS instructions

CS153: Compilers Lecture 8: Compiling Calls

Porting GCC for Dunces

Lecture 4: Instruction Set Architecture

Today s topics. MIPS operations and operands. MIPS arithmetic. CS/COE1541: Introduction to Computer Architecture. A Review of MIPS ISA.

CS 2210 Programming Project (Part IV)

Rui Wang, Assistant professor Dept. of Information and Communication Tongji University.

Review of Activation Frames. FP of caller Y X Return value A B C

MIPS and QTSPIM Recap. MIPS Architecture. Cptr280. Dr Curtis Nelson. Cptr280, Autumn

Compiling Code, Procedures and Stacks

Instruction Set Architectures Part I: From C to MIPS. Readings:

SPIM Procedure Calls

Code Generation. Lecture 30

CSCE 5610: Computer Architecture

We will study the MIPS assembly language as an exemplar of the concept.

Lectures 5. Announcements: Today: Oops in Strings/pointers (example from last time) Functions in MIPS

CSCI 402: Computer Architectures. Instructions: Language of the Computer (3) Fengguang Song Department of Computer & Information Science IUPUI.

CSE Lecture In Class Example Handout

Computer Organization MIPS Architecture. Department of Computer Science Missouri University of Science & Technology

Lecture 5: Procedure Calls

Optimization Prof. James L. Frankel Harvard University

CA Compiler Construction

Instructions: Language of the Computer

Functions in MIPS. Functions in MIPS 1

Arguments and Return Values. EE 109 Unit 16 Stack Frames. Assembly & HLL s. Arguments and Return Values

Math 230 Assembly Programming (AKA Computer Organization) Spring 2008

Lecture Outline. Code Generation. Lecture 30. Example of a Stack Machine Program. Stack Machines

Chapter 2. Instructions:

CENG3420 Lecture 03 Review

CSE Lecture In Class Example Handout

Branch Addressing. Jump Addressing. Target Addressing Example. The University of Adelaide, School of Computer Science 28 September 2015

Code Generation. Lecture 19

Thomas Polzer Institut für Technische Informatik

Control Instructions. Computer Organization Architectures for Embedded Computing. Thursday, 26 September Summary

Control Instructions

Computer Science 2500 Computer Organization Rensselaer Polytechnic Institute Spring Topic Notes: MIPS Programming

CS3350B Computer Architecture MIPS Introduction

Computer Science 324 Computer Architecture Mount Holyoke College Fall Topic Notes: MIPS Instruction Set Architecture

Stored Program Concept. Instructions: Characteristics of Instruction Set. Architecture Specification. Example of multiple operands

ECE 473 Computer Architecture and Organization Lab 4: MIPS Assembly Programming Due: Wednesday, Oct. 19, 2011 (30 points)

Code Generation. Lecture 12

Lecture 5. Announcements: Today: Finish up functions in MIPS

instructions aligned is little-endian

Computer Architecture Instruction Set Architecture part 2. Mehran Rezaei

Contents. Slide Set 2. Outline of Slide Set 2. More about Pseudoinstructions. Avoid using pseudoinstructions in ENCM 369 labs

CPSC 330 Computer Organization

Chapter 2. Computer Abstractions and Technology. Lesson 4: MIPS (cont )

Subroutines. int main() { int i, j; i = 5; j = celtokel(i); i = j; return 0;}

Math 230 Assembly Programming (AKA Computer Organization) Spring MIPS Intro

Calling Conventions. Hakim Weatherspoon CS 3410, Spring 2012 Computer Science Cornell University. See P&H 2.8 and 2.12

Lecture 4: MIPS Instruction Set

Today. Putting it all together

Computer Architecture. Chapter 2-2. Instructions: Language of the Computer

Instructions: Assembly Language

ECE232: Hardware Organization and Design. Computer Organization - Previously covered

Function Calling Conventions 1 CS 64: Computer Organization and Design Logic Lecture #9

Lecture Outline. Topic 1: Basic Code Generation. Code Generation. Lecture 12. Topic 2: Code Generation for Objects. Simulating a Stack Machine

ECE260: Fundamentals of Computer Engineering. Supporting Procedures in Computer Hardware

ENGN1640: Design of Computing Systems Topic 03: Instruction Set Architecture Design

Chapter 3. Instructions:

comp 180 Lecture 10 Outline of Lecture Procedure calls Saving and restoring registers Summary of MIPS instructions

ECE 331 Hardware Organization and Design. Professor Jay Taneja UMass ECE - Discussion 3 2/8/2018

Announcements HW1 is due on this Friday (Sept 12th) Appendix A is very helpful to HW1. Check out system calls

Computer Architecture. The Language of the Machine

EE 361 University of Hawaii Fall

An Overview of Compilation

Lecture 5: Procedure Calls

CS3350B Computer Architecture

Course Administration

ECE 30 Introduction to Computer Engineering

Topic Notes: MIPS Instruction Set Architecture

Computer Architecture

Lecture 2. Instructions: Language of the Computer (Chapter 2 of the textbook)

Reduced Instruction Set Computer (RISC)

Sparse Notes on an MIPS Processor s Architecture and its Assembly Language

MIPS Functions and the Runtime Stack

Instruction Set Architecture

See P&H 2.8 and 2.12, and A.5-6. Prof. Hakim Weatherspoon CS 3410, Spring 2015 Computer Science Cornell University

CISC 662 Graduate Computer Architecture. Lecture 4 - ISA MIPS ISA. In a CPU. (vonneumann) Processor Organization

Prof. Kavita Bala and Prof. Hakim Weatherspoon CS 3410, Spring 2014 Computer Science Cornell University. See P&H 2.8 and 2.12, and A.

101 Assembly. ENGR 3410 Computer Architecture Mark L. Chang Fall 2009

The plot thickens. Some MIPS instructions you can write cannot be translated to a 32-bit number

Transcription:

Workshop on Essential Abstractions in GCC July 09 Spim MD Levels 0 & 1: Outline 1/32 Outline Incremental Machine Descriptions for Spim: Levels 0 and 1 GCC Resource Center (www.cse.iitb.ac.in/grc Department of Computer Science and Engineering, Indian Institute of Technology, Bombay Retargetting GCC to spim spim is mips simulator developed by James Larus RISC machine Assembly level simulator: No need of assembler, linkers, or libraries Level 0 of spim machine descriptions Level 1 of spim machine descriptions July 2009 Part 1 Retargeting GCC to Spim: A Recap

July 09 Spim MD Levels 0 & 1: Retargeting GCC to Spim: A Recap 2/32 Retargeting GCC to Spim July 09 Spim MD Levels 0 & 1: Retargeting GCC to Spim: A Recap 2/32 Retargeting GCC to Spim Registering spim target with GCC build process Making machine description files available Building the compiler July 09 Spim MD Levels 0 & 1: Retargeting GCC to Spim: A Recap 3/32 Registering Spim with GCC Build Process July 09 Spim MD Levels 0 & 1: Retargeting GCC to Spim: A Recap 3/32 Registering Spim with GCC Build Process We want to add multiple descriptions: Step 1. In the file $(SOURCE/config.sub Add to the case $basic machine spim* in the part following # Recognize the basic CPU types without company name. spim*-* in the part following # Recognize the basic CPU types with company name.

July 09 Spim MD Levels 0 & 1: Retargeting GCC to Spim: A Recap 4/32 Registering Spim with GCC Build Process Step 2. In the file $(SOURCE/gcc/config.gcc In case ${target} used for defining cpu type, add spim*-*-* cpu type=spim ;; This specifies the directory $(SOURCE/gcc/config/spim in which the machine descriptions files are supposed to be made available. In case ${target} for # Support site-specific machine types. add spim*-*-* gas=no gnu ld=no tm file=spim/$target noncanonical.h md file=spim/$target noncanonical.md out file=spim/$target noncanonical.c tm p file=spim/$target noncanonical-protos.h ;; July 09 Spim MD Levels 0 & 1: Retargeting GCC to Spim: A Recap 4/32 Registering Spim with GCC Build Process July 09 Spim MD Levels 0 & 1: Retargeting GCC to Spim: A Recap 5/32 Building a Cross-Compiler for Spim July 09 Spim MD Levels 0 & 1: Retargeting GCC to Spim: A Recap 5/32 Building a Cross-Compiler for Spim Normal cross compiler build process attempts to use the generated cc1 to compile the emulation libraries (LIBGCC into executables using the assembler, linker, and archiver. We are interested in only the cc1 compiler.

July 09 Spim MD Levels 0 & 1: Retargeting GCC to Spim: A Recap 6/32 Building a Cross-Compiler for Spim July 09 Spim MD Levels 0 & 1: Retargeting GCC to Spim: A Recap 6/32 Building a Cross-Compiler for Spim Create directories $(BUILD and $(INSTALL in a tree not rooted at $(SOURCE. Change the directory to $(BUILD and execute the command make cc1 $(SOURCE/configure --prefix=$(install --target=spim<n> --enable-languages=c Pray for 5 minutes :- files spim<n>.h, spim<n>.md, spim<n>.c in the directory $(SOURCE/gcc/config/spim Part 2 Level 0 of Spim Machine Descriptions

July 09 Spim MD Levels 0 & 1: Level 0 of Spim Machine Descriptions 7/32 Sub-levels of Level 0 July 09 Spim MD Levels 0 & 1: Level 0 of Spim Machine Descriptions 7/32 Sub-levels of Level 0 Three sub-levels Level 0.0: Merely build GCC for spim simulator Does not compile any program (i.e. compilation aborts Level 0.1: Compiles empty parameterless void function void fun( { } void fun( { L: goto L; } Level 0.2: Incorporates complete activation record structure Required for Level 1 July 09 Spim MD Levels 0 & 1: Level 0 of Spim Machine Descriptions 8/32 Category of Macros in Level 0 July 09 Spim MD Levels 0 & 1: Level 0 of Spim Machine Descriptions 8/32 Category of Macros in Level 0 Category Level 0.0 Level 0.1 Level 0.2 Memory Layout complete complete complete Registers partial partial complete Addressing Modes none partial partial Activation Record Conventions dummy dummy complete Calling Conventions dummy dummy partial Assembly Output Format dummy partial partial Complete specification of activation record in level 0.2 is not necessary but is provided to facilitate local variables in level 1. Complete specification of registers in level 0.2 follows the complete specification of activation record.

July 09 Spim MD Levels 0 & 1: Level 0 of Spim Machine Descriptions 9/32 Memory Layout Related Macros for Level 0 July 09 Spim MD Levels 0 & 1: Level 0 of Spim Machine Descriptions 9/32 Memory Layout Related Macros for Level 0 #define BITS BIG ENDIAN 0 #define BIGGEST ALIGNMENT 64 #define BYTES BIG ENDIAN 0 #define WORDS BIG ENDIAN 0 #define UNITS PER WORD 4 #define PARM BOUNDARY 32 #define STRICT ALIGNMENT 0 #define MOVE MAX 4 #define Pmode SImode #define FUNCTION MODE SImode #define STACK BOUNDARY 64 #define SLOW BYTE ACCESS 0 #define FUNCTION BOUNDARY 32 #define CASE VECTOR MODE SImode July 09 Spim MD Levels 0 & 1: Level 0 of Spim Machine Descriptions 10/32 Register Categories for Spim July 09 Spim MD Levels 0 & 1: Level 0 of Spim Machine Descriptions 10/32 Register Categories for Spim All Registers GPRs (address + data Available to Compiler General Address Floating Point Fixed Data Not Available to Compiler Caller-saved Callee-saved

July 09 Spim MD Levels 0 & 1: Level 0 of Spim Machine Descriptions 11/32 Registers in Spim July 09 Spim MD Levels 0 & 1: Level 0 of Spim Machine Descriptions 11/32 Registers in Spim $zero 00 32 constant data $at 01 32 NA $v0 02 32,64 result caller $v1 03 32 result caller $a0 04 32,64 argument caller $a1 05 32 argument caller $a2 06 32,64 argument caller $a3 07 32 argument caller $t0 08 32,64 temporary caller $t1 09 32 temporary caller $t2 10 32,64 temporary caller $t3 11 32 temporary caller $t4 12 32,64 temporary caller $t5 13 32 temporary caller $t6 14 32,64 temporary caller $t7 15 32 temporary caller $s0 16 32,64 temporary callee $s1 17 32 temporary callee $s2 18 32,64 result callee $s3 19 32 result callee $s4 20 32,64 temporary callee $s5 21 32 temporary callee $s6 22 32,64 temporary callee $s7 23 32 temporary callee $t8 24 32,64 temporary caller $t9 25 32 temporary caller $k0 26 32,64 NA $k1 27 32 NA $gp 28 32,64 global pointer address $sp 29 32 stack pointer address $fp 30 32,64 frame pointer address $ra 31 32 return address address July 09 Spim MD Levels 0 & 1: Level 0 of Spim Machine Descriptions 12/32 Register Information in Level 0.2 $zero,$at $k0,$k1 #define FIRST PSEUDO REGISTER 32 $gp,$sp,$fp,$ra July 09 Spim MD Levels 0 & 1: Level 0 of Spim Machine Descriptions 12/32 Register Information in Level 0.2 #define FIXED REGISTERS \ /* not for global */ \ /* register allocation */ \ { 1,1,0,0, 0,0,0,0, \ 0,0,0,0, 0,0,0,0, \ 0,0,0,0, 0,0,0,0, \ 0,0,1,1,1,1,1,1} #define CALL USED REGISTERS \ /* Caller-saved registers */ \ { 1,1,1,1, 1,1,1,1, \ 1,1,1,1, 1,1,1,1, \ 0,0,0,0, 0,0,0,0,\ 1,1,1,1, 1,1,1,1 } /* Register sizes */ #define HARD REGNO NREGS(R,M\ ((GET MODE SIZE (M + \ UNITS PER WORD - 1 \ / UNITS PER WORD #define HARD REGNO MODE OK(R,M\ hard regno mode ok (R, M #define MODES TIEABLE P(M1,M2\ modes tieable p (M1,M2 $s0 to $s7

July 09 Spim MD Levels 0 & 1: Level 0 of Spim Machine Descriptions 13/32 Register Classes in Level 0.2 enum reg class \ { NO REGS, CALLER SAVED REGS, \ CALLEE SAVED REGS, BASE REGS,\ GENERAL REGS, ALL REGS, \ LIM REG CLASSES \ }; #define N REG CLASSES \ LIM REG CLASSES #define REG CLASS NAMES \ { "NO REGS","CALLER SAVED REGS",\ "CALLEE SAVED REGS", \ "BASE REGS", "GEN REGS", \ "ALL REGS" \ } #define REG CLASS CONTENTS \ /* Register numbers */ \ { 0x00000000,0x0200ff00, \ 0x00ff0000,0xf2fffffc, \ 0xffffffff,0xffffffff } address registers #define REGNO REG CLASS(REGNO \ regno reg class(regno #define BASE REG CLASS \ BASE REGS #define INDEX REG CLASS NO REGS #define REG CLASS FROM LETTER(c\ NO REGS #define REGNO OK FOR BASE P(R 1 #define REGNO OK FOR INDEX P(R 0 #define PREFERRED RELOAD CLASS(X,C\ CLASS /* Max reg required for a class */ #define CLASS MAX NREGS(C, M \ ((GET MODE SIZE (M + \ UNITS PER WORD - 1 \ / UNITS PER WORD #define LEGITIMATE CONSTANT P(x \ legitimate constant p(x July 09 Spim MD Levels 0 & 1: Level 0 of Spim Machine Descriptions 13/32 Register Classes in Level 0.2 July 09 Spim MD Levels 0 & 1: Level 0 of Spim Machine Descriptions 14/32 Addressing Modes July 09 Spim MD Levels 0 & 1: Level 0 of Spim Machine Descriptions 14/32 Addressing Modes / Validate use of labels as symbolic references or numeric addresses / #define CONSTANT ADDRESS P(X constant address p(x / Since we don t have base indexed mode, we do not need more than one register for any address. / #define MAX REGS PER ADDRESS 1 / Validate the addressing mode of an operand of an insn / #define GO IF LEGITIMATE ADDRESS(mode,x,label...... Address of data in the #define LEGITIMIZE ADDRESS(x,oldx,mode,win program being compiled rtx IITB rtx op; IITB rtx op=legitimize address(x,oldx,mode; if(memory address p(mode,iitb rtx op x=iitb rtx op; goto win; Control transfer in the compiler source #define GO IF MODE DEPENDENT ADDRESS(addr,label

July 09 Spim MD Levels 0 & 1: Level 0 of Spim Machine Descriptions 15/32 Function Calling Conventions July 09 Spim MD Levels 0 & 1: Level 0 of Spim Machine Descriptions 15/32 Function Calling Conventions Pass arguments on stack. Return values goes in register $v0 (in level 1. #define ACCUMULATE OUTGOING ARGS 0 /* Callee does not pop args */ #define RETURN POPS ARGS(FUN, TYPE, SIZE 0 #define FUNCTION ARG(CUM, MODE, TYPE, NAMED 0 #define FUNCTION ARG REGNO P(r 0 /*Data structure to record the information about args passed in *registers. Irrelevant in this level so a simple int will do. */ #define CUMULATIVE ARGS int #define INIT CUMULATIVE ARGS(CUM, FNTYPE, LIBNAME, FNDECL, NAMED ARGS \ { CUM = 0; } #define FUNCTION ARG ADVANCE(cum, mode, type, named cum++ #define FUNCTION VALUE(valtype, func function value( #define LIBCALL VALUE(MODE function value( #define FUNCTION VALUE REGNO P(REGN ((REGN == 2 July 09 Spim MD Levels 0 & 1: Level 0 of Spim Machine Descriptions 16/32 Activation Record Structure in Spim July 09 Spim MD Levels 0 & 1: Level 0 of Spim Machine Descriptions 16/32 Activation Record Structure in Spim Caller s Activation Record Caller s Responsibility Callee s Responsibility Parameter n Parameter n 1... Parameter 1 Return Address Caller s FPR (Control Link Caller s SPR Argument Pointer Size is known only after register allocation Callee Saved Registers Local Variable 1 Local Variable 2... Local Variable n Initial Frame Pointer Stack Pointer

July 09 Spim MD Levels 0 & 1: Level 0 of Spim Machine Descriptions 17/32 Minimizing Registers for Accessing Activation Records Reduce four pointer registers (stack, frame, args, and hard frame to fewer registers. July 09 Spim MD Levels 0 & 1: Level 0 of Spim Machine Descriptions 17/32 Minimizing Registers for Accessing Activation Records #define ELIMINABLE REGS {{FRAME POINTER REGNUM, STACK POINTER REGNUM}, {FRAME POINTER REGNUM, HARD FRAME POINTER REGNUM}, {ARG POINTER REGNUM, STACK POINTER REGNUM}, {HARD FRAME POINTER REGNUM, STACK POINTER REGNUM} } #define CAN ELIMINATE(FROM, TO ((FROM == FRAME POINTER REGNUM && (TO == STACK POINTER REGNUM TO == HARD FRAME POINTER REGNUM (FROM == ARG POINTER REGNUM && TO == STACK POINTER REGNUM (FROM == HARD FRAME POINTER REGNUM && TO == STACK POINTER REGNUM /Recomputes new offsets, after eliminating./ #define INITIAL ELIMINATION OFFSET(FROM, TO, VAR (VAR = initial elimination offset(from, TO July 09 Spim MD Levels 0 & 1: Level 0 of Spim Machine Descriptions 18/32 Specifying Activation Record July 09 Spim MD Levels 0 & 1: Level 0 of Spim Machine Descriptions 18/32 Specifying Activation Record #define STACK_GROWS_DOWNWARD 1 #define FRAME_GROWS_DOWNWARD 1 /* "Initial" frame pointer */ /* before register allocation */ #define FRAME_POINTER_REGNUM 1 #define STARTING_FRAME_OFFSET starting_frame_offset ( #define STACK_POINTER_OFFSET 0 #define FIRST_PARM_OFFSET(FUN 0 /* "Final" frame pointer */ /* after register allocation */ #define HARD_FRAME_POINTER_REGNUM 30 #define ARG_POINTER_REGNUM HARD_FRAME_POINTER_REGNUM #define STACK_POINTER_REGNUM 29 #define FRAME_POINTER_REQUIRED 0

July 09 Spim MD Levels 0 & 1: Level 0 of Spim Machine Descriptions 19/32 Operations in Level 0.0 July 09 Spim MD Levels 0 & 1: Level 0 of Spim Machine Descriptions 19/32 Operations in Level 0.0 In principle spim0.0.md can be empty. However, this results in empty data structures in the C source. Empty arrays in declarations are not acceptable in ANSI C. If we remove -pedantic option while building gcc, the compiler gets built. If we do not want to change the configuration system, spim0.0.md can be defined to contain (define insn "dummy pattern" [(reg:si 0] "1" "This stmnt should not be emitted!" July 09 Spim MD Levels 0 & 1: Level 0 of Spim Machine Descriptions 20/32 Operations in Level 0 July 09 Spim MD Levels 0 & 1: Level 0 of Spim Machine Descriptions 20/32 Operations in Level 0 Operations Level 0.0 Level 0.1 Level 0.2 JUMP direct dummy actual actual JUMP indirect dummy dummy dummy RETURN not required partial partial spim0.0.c rtx gen jump (... { return 0; } rtx gen indirect jump (... { return 0; } spim0.0.h #define CODE FOR indirect jump 8 spim0.2.md (define insn "jump" [(set (pc (label ref (match operand 0 ] "j %l0"

July 09 Spim MD Levels 0 & 1: Level 0 of Spim Machine Descriptions 20/32 Operations in Level 0 July 09 Spim MD Levels 0 & 1: Level 0 of Spim Machine Descriptions 20/32 Operations in Level 0 Operations Level 0.0 Level 0.1 Level 0.2 JUMP direct dummy actual actual JUMP indirect dummy dummy dummy RETURN not required partial partial (define expand "epilogue" [(clobber (const int 0] { spim epilogue(; DONE; } (define insn "IITB return" [(return] "jr \\$ra" spim0.2.md spim0.2.c void spim epilogue( { emit insn(gen IITB return(; } Part 3 Level 1 of Spim Machine Descriptions

July 09 Spim MD Levels 0 & 1: Level 1 of Spim Machine Descriptions 21/32 Increments for Level 1 July 09 Spim MD Levels 0 & 1: Level 1 of Spim Machine Descriptions 21/32 Increments for Level 1 Addition to the source language Assignment statements involving integer constant, integer local or global variables. Returning values. (No calls, though! Changes in machine descriptions Minor changes in macros required for level 0 $zero now belongs to new class Assembly output needs to change Some function bodies expanded New operations included in the.md file diff -w shows the changes! July 09 Spim MD Levels 0 & 1: Level 1 of Spim Machine Descriptions 22/32 Operations Required in Level 1 July 09 Spim MD Levels 0 & 1: Level 1 of Spim Machine Descriptions 22/32 Operations Required in Level 1 Operation Primitive Implementation Remark Variants Dest Src R i R j move rj, ri R M global lw r, m R M local lw r, c($fp R C li r, c M R sw r, m RETURN Src RETURN Src $v0 Src j $ra level 0 Dest Src 1 + Src 2 R i R j + R k add ri, rj, rk R i R j + C addi ri, rj, c

July 09 Spim MD Levels 0 & 1: Level 1 of Spim Machine Descriptions 23/32 Move Operations in spim1.md July 09 Spim MD Levels 0 & 1: Level 1 of Spim Machine Descriptions 23/32 Move Operations in spim1.md Multiple primitive variants require us to map a single operation in IR to multiple RTL patterns use define expand Ensure that the second operand is in a register (define_expand "movsi" [(set (match_operand:si 0 "nonimmediate_operand" (match_operand:si 1 "general_operand" ] if(get_code(operands[0]==mem && GET_CODE(operands[1]!=REG && (can_create_pseudo_p( /* force conversion only */ /* before register allocation */ operands[1]=force_reg(simode,operands[1]; July 09 Spim MD Levels 0 & 1: Level 1 of Spim Machine Descriptions 24/32 Move Operations in spim1.md July 09 Spim MD Levels 0 & 1: Level 1 of Spim Machine Descriptions 24/32 Move Operations in spim1.md Load from Memory R M (define_insn "*load_word" [(set (match_operand:si 0 "register_operand" "=r" (mem:si (match_operand:si 1 "memory_operand" "m"] "lw \t%0, %m1" Load Constant R C (define_insn "*constant_load" [(set (match_operand:si 0 "register_operand" "=r" (match_operand:si 1 "const_int_operand" "i"] "li \t%0, %c1"

July 09 Spim MD Levels 0 & 1: Level 1 of Spim Machine Descriptions 25/32 Move Operations in spim1.md July 09 Spim MD Levels 0 & 1: Level 1 of Spim Machine Descriptions 25/32 Move Operations in spim1.md Register Move R i R j (define_insn "*move_regs" [(set (match_operand:si 0 "register_operand" "=r" (match_operand:si 1 "register_operand" "r" ] "move \t%0,%1" Store into M R (define_insn "*store_word" [(set (mem:si (match_operand:si 0 "memory_operand" "m" (match_operand:si 1 "register_operand" "r"] "sw \t%1, %m0" July 09 Spim MD Levels 0 & 1: Level 1 of Spim Machine Descriptions 26/32 Using register $zero for constant 0 July 09 Spim MD Levels 0 & 1: Level 1 of Spim Machine Descriptions 26/32 Using register $zero for constant 0 Introduce new register class zero register operand in spim1.h and define move zero (define_insn "IITB_move_zero" [(set (match_operand:si 0 "nonimmediate_operand" "=r,m" (match_operand:si 1 "zero_register_operand" "z,z" ] "@ move \t%0,%1 sw \t%1, %m0" How do we get zero register operand in an RTL?

July 09 Spim MD Levels 0 & 1: Level 1 of Spim Machine Descriptions 27/32 Using register $zero for constant 0 July 09 Spim MD Levels 0 & 1: Level 1 of Spim Machine Descriptions 27/32 Using register $zero for constant 0 Use define expand "movsi" to get zero register operand in an RTL if(get_code(operands[1]==const_int && INTVAL(operands[1]==0 emit_insn(gen_iitb_move_zero(operands[0], gen_rtx_reg(simode,0; DONE; else /* Usual processing */ DONE says do not generate the RTL template associated with "movsi" required template is generated by emit insn(gen IITB move zero(... July 09 Spim MD Levels 0 & 1: Level 1 of Spim Machine Descriptions 28/32 Our Conventions in.md File July 09 Spim MD Levels 0 & 1: Level 1 of Spim Machine Descriptions 28/32 Our Conventions in.md File A pattern which is not used for generating the first RTL is preceded by * in its name (eg. "*store word" A pattern with a name preceded by IITB is used for generating The specified RTL template by explicitly calling the associated gen function. For example, the RTL template associated with "IITB move zero" is generated by calling gen IITB move zero in define expand "movsi".

July 09 Spim MD Levels 0 & 1: Level 1 of Spim Machine Descriptions 29/32 Supporting Addition in Level 1 July 09 Spim MD Levels 0 & 1: Level 1 of Spim Machine Descriptions 29/32 Supporting Addition in Level 1 (define_insn "addsi3" [(set (match_operand:si 0 "register_operand" "=r,r" (plus:si (match_operand:si 1 "register_operand" "r,r" (match_operand:si 2 "nonmemory_operand" "r,i" ] "@ add \t%0, %1, %2 addi \t%0, %1, %c2" Constraints combination 1 of three operands: R, R, R Constraints combination 2 of three operands: R, R, C July 09 Spim MD Levels 0 & 1: Level 1 of Spim Machine Descriptions 30/32 Comparing movsi and addsi3 July 09 Spim MD Levels 0 & 1: Level 1 of Spim Machine Descriptions 30/32 Comparing movsi and addsi3 movsi uses define expand whereas addsi3 uses combination of operands Why not use constraints for movsi too? movsi combines loads and stores Thus we will need to support memory as both source and destination Will also allow memory to memory move Not supported by the machine!

July 09 Spim MD Levels 0 & 1: Level 1 of Spim Machine Descriptions 31/32 Choices for Mapping Compound Operations to Primitive Operations July 09 Spim MD Levels 0 & 1: Level 1 of Spim Machine Descriptions 31/32 Choices for Mapping Compound Operations to Primitive Operations Gimple First RTL RTL for Assembly MD Construct Operation Scheduling Compound Split Split Split define expand Compound Compound Split Split define split Compound Compound Compound Split ASM string define expand may be used for selecting one alternative from among multiple possibilities at the time of first RTL generation. @ in ASM string achieves the same effect at the time of emitting assembly instruction. July 09 Spim MD Levels 0 & 1: Lab Exercises 32/32 Lab exercises on Spim Levels 0 & 1 Part 4 Lab Exercises Will be given in the lab :- You may need to refer to chapter 16 and 17 in the GCC Internals document