summaryrefslogtreecommitdiff
path: root/compiler/js/cpubase.pas
diff options
context:
space:
mode:
authorflorian <florian@3ad0048d-3df7-0310-abae-a5850022a9f2>2014-04-06 12:49:38 +0000
committerflorian <florian@3ad0048d-3df7-0310-abae-a5850022a9f2>2014-04-06 12:49:38 +0000
commitc31849d95470a761adb8c76f563baf26e6ae7bcd (patch)
tree250428351814b3b897beddd084fac97b79f316c3 /compiler/js/cpubase.pas
parent87496a06da21831d719eabd81808523542f1d809 (diff)
downloadfpc-js.tar.gz
+ initial skeleton of the js backendjs
git-svn-id: http://svn.freepascal.org/svn/fpc/branches/js@27484 3ad0048d-3df7-0310-abae-a5850022a9f2
Diffstat (limited to 'compiler/js/cpubase.pas')
-rw-r--r--compiler/js/cpubase.pas338
1 files changed, 338 insertions, 0 deletions
diff --git a/compiler/js/cpubase.pas b/compiler/js/cpubase.pas
new file mode 100644
index 0000000000..32294a4ba6
--- /dev/null
+++ b/compiler/js/cpubase.pas
@@ -0,0 +1,338 @@
+{
+ Copyright (c) 2010 by Jonas Maebe
+
+ Contains the base types for the Java VM
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+ ****************************************************************************
+}
+{ This Unit contains the base types for the Java Virtual Machine
+}
+unit cpubase;
+
+{$i fpcdefs.inc}
+
+interface
+
+uses
+ globtype,
+ aasmbase,cpuinfo,cgbase;
+
+
+{*****************************************************************************
+ Assembler Opcodes
+*****************************************************************************}
+
+ type
+ TAsmOp=(A_None,
+ a_aaload, a_aastore, a_aconst_null,
+ a_aload, a_aload_0, a_aload_1, a_aload_2, a_aload_3,
+ a_anewarray, a_areturn, a_arraylength,
+ a_astore, a_astore_0, a_astore_1, a_astore_2, a_astore_3,
+ a_athrow, a_baload, a_bastore, a_bipush, a_breakpoint,
+ a_caload, a_castore, a_checkcast,
+ a_d2f, a_d2i, a_d2l, a_dadd, a_daload, a_dastore, a_dcmpg, a_dcmpl,
+ a_dconst_0, a_dconst_1, a_ddiv,
+ a_dload, a_dload_0, a_dload_1, a_dload_2, a_dload_3,
+ a_dmul, a_dneg, a_drem, a_dreturn,
+ a_dstore, a_dstore_0, a_dstore_1, a_dstore_2, a_dstore_3,
+ a_dsub,
+ a_dup, a_dup2, a_dup2_x1, a_dup2_x2, a_dup_x1, a_dup_x2,
+ a_f2d, a_f2i, a_f2l, a_fadd, a_faload, a_fastore, a_fcmpg, a_fcmpl,
+ a_fconst_0, a_fconst_1, a_fconst_2, a_fdiv,
+ a_fload, a_fload_0, a_fload_1, a_fload_2, a_fload_3,
+ a_fmul, a_fneg, a_frem, a_freturn,
+ a_fstore, a_fstore_0, a_fstore_1, a_fstore_2, a_fstore_3,
+ a_fsub,
+ a_getfield, a_getstatic,
+ a_goto, a_goto_w,
+ a_i2b, a_i2c, a_i2d, a_i2f, a_i2l, a_i2s,
+ a_iadd, a_iaload, a_iand, a_iastore,
+ a_iconst_m1, a_iconst_0, a_iconst_1, a_iconst_2, a_iconst_3,
+ a_iconst_4, a_iconst_5,
+ a_idiv,
+ a_if_acmpeq, a_if_acmpne, a_if_icmpeq, a_if_icmpge, a_if_icmpgt,
+ a_if_icmple, a_if_icmplt, a_if_icmpne,
+ a_ifeq, a_ifge, a_ifgt, a_ifle, a_iflt, a_ifne, a_ifnonnull, a_ifnull,
+ a_iinc,
+ a_iload, a_iload_0, a_iload_1, a_iload_2, a_iload_3,
+ a_imul, a_ineg,
+ a_instanceof,
+ a_invokeinterface, a_invokespecial, a_invokestatic, a_invokevirtual,
+ a_ior, a_irem, a_ireturn, a_ishl, a_ishr,
+ a_istore, a_istore_0, a_istore_1, a_istore_2, a_istore_3,
+ a_isub, a_iushr, a_ixor,
+ a_jsr, a_jsr_w,
+ a_l2d, a_l2f, a_l2i, a_ladd, a_laload, a_land, a_lastore, a_lcmp,
+ a_lconst_0, a_lconst_1,
+ a_ldc, a_ldc2_w, a_ldc_w, a_ldiv,
+ a_lload, a_lload_0, a_lload_1, a_lload_2, a_lload_3,
+ a_lmul, a_lneg,
+ a_lookupswitch,
+ a_lor, a_lrem,
+ a_lreturn,
+ a_lshl, a_lshr,
+ a_lstore, a_lstore_0, a_lstore_1, a_lstore_2, a_lstore_3,
+ a_lsub, a_lushr, a_lxor,
+ a_monitorenter,
+ a_monitorexit,
+ a_multianewarray,
+ a_new,
+ a_newarray,
+ a_nop,
+ a_pop, a_pop2,
+ a_putfield, a_putstatic,
+ a_ret, a_return,
+ a_saload, a_sastore, a_sipush,
+ a_swap,
+ a_tableswitch,
+ a_wide
+ );
+
+ {# This should define the array of instructions as string }
+ op2strtable=array[tasmop] of string[8];
+
+ Const
+ {# First value of opcode enumeration }
+ firstop = low(tasmop);
+ {# Last value of opcode enumeration }
+ lastop = high(tasmop);
+
+
+{*****************************************************************************
+ Registers
+*****************************************************************************}
+
+ type
+ { Number of registers used for indexing in tables }
+ tregisterindex=0..{$i rjsnor.inc}-1;
+ totherregisterset = set of tregisterindex;
+
+ const
+ { Available Superregisters }
+ {$i rjssup.inc}
+
+ { No Subregisters }
+ R_SUBWHOLE = R_SUBNONE;
+
+ { Available Registers }
+ {$i rjscon.inc}
+
+ { aliases }
+ { used as base register in references for parameters passed to
+ subroutines: these are passed on the evaluation stack, but this way we
+ can use the offset field to indicate the order, which is used by ncal
+ to sort the parameters }
+ NR_EVAL_STACK_BASE = NR_R0;
+
+ maxvarregs = 1;
+ maxfpuvarregs = 1;
+
+ { Integer Super registers first and last }
+ first_int_imreg = 10;
+
+ { Float Super register first and last }
+ first_fpu_imreg = 10;
+
+ { MM Super register first and last }
+ first_mm_imreg = 10;
+
+ regnumber_table : array[tregisterindex] of tregister = (
+ {$i rjsnum.inc}
+ );
+
+ EVALSTACKLOCS = [LOC_REGISTER,LOC_CREGISTER,LOC_FPUREGISTER,LOC_CFPUREGISTER,
+ LOC_MMREGISTER,LOC_CMMREGISTER,LOC_SUBSETREG,LOC_CSUBSETREG];
+
+{*****************************************************************************
+ Conditions
+*****************************************************************************}
+
+ type
+ // not used by jvm target
+ TAsmCond=(C_None);
+
+{*****************************************************************************
+ Constants
+*****************************************************************************}
+
+ const
+ max_operands = 2;
+
+
+{*****************************************************************************
+ Default generic sizes
+*****************************************************************************}
+
+{$ifdef cpu64bitaddr}
+ {# Defines the default address size for a processor,
+ -- fake for JVM, only influences default width of
+ arithmetic calculations }
+ OS_ADDR = OS_64;
+ {# the natural int size for a processor,
+ has to match osuinttype/ossinttype as initialized in psystem }
+ OS_INT = OS_64;
+ OS_SINT = OS_S64;
+{$else}
+ {# Defines the default address size for a processor,
+ -- fake for JVM, only influences default width of
+ arithmetic calculations }
+ OS_ADDR = OS_32;
+ {# the natural int size for a processor,
+ has to match osuinttype/ossinttype as initialized in psystem }
+ OS_INT = OS_32;
+ OS_SINT = OS_S32;
+{$endif}
+ {# the maximum float size for a processor, }
+ OS_FLOAT = OS_F64;
+ {# the size of a vector register for a processor }
+ OS_VECTOR = OS_M128;
+
+{*****************************************************************************
+ Generic Register names
+*****************************************************************************}
+
+ { dummies, not used for JVM }
+
+ {# Stack pointer register }
+ { used as base register in references to indicate that it's a local }
+ NR_STACK_POINTER_REG = NR_R1;
+ RS_STACK_POINTER_REG = RS_R1;
+ {# Frame pointer register }
+ NR_FRAME_POINTER_REG = NR_STACK_POINTER_REG;
+ RS_FRAME_POINTER_REG = RS_STACK_POINTER_REG;
+
+ { Java results are returned on the evaluation stack, not via a register }
+
+ { Results are returned in this register (32-bit values) }
+ NR_FUNCTION_RETURN_REG = NR_NO;
+ RS_FUNCTION_RETURN_REG = RS_NO;
+ { Low part of 64bit return value }
+ NR_FUNCTION_RETURN64_LOW_REG = NR_NO;
+ RS_FUNCTION_RETURN64_LOW_REG = RS_NO;
+ { High part of 64bit return value }
+ NR_FUNCTION_RETURN64_HIGH_REG = NR_NO;
+ RS_FUNCTION_RETURN64_HIGH_REG = RS_NO;
+ { The value returned from a function is available in this register }
+ NR_FUNCTION_RESULT_REG = NR_FUNCTION_RETURN_REG;
+ RS_FUNCTION_RESULT_REG = RS_FUNCTION_RETURN_REG;
+ { The lowh part of 64bit value returned from a function }
+ NR_FUNCTION_RESULT64_LOW_REG = NR_FUNCTION_RETURN64_LOW_REG;
+ RS_FUNCTION_RESULT64_LOW_REG = RS_FUNCTION_RETURN64_LOW_REG;
+ { The high part of 64bit value returned from a function }
+ NR_FUNCTION_RESULT64_HIGH_REG = NR_FUNCTION_RETURN64_HIGH_REG;
+ RS_FUNCTION_RESULT64_HIGH_REG = RS_FUNCTION_RETURN64_HIGH_REG;
+
+ NR_FPU_RESULT_REG = NR_NO;
+ NR_MM_RESULT_REG = NR_NO;
+
+
+{*****************************************************************************
+ GCC /ABI linking information
+*****************************************************************************}
+
+ { dummies, not used for JVM }
+
+ {# Registers which must be saved when calling a routine
+
+ }
+ saved_standard_registers : array[0..0] of tsuperregister = (
+ RS_NO
+ );
+
+ { this is only for the generic code which is not used for this architecture }
+ saved_address_registers : array[0..0] of tsuperregister = (RS_INVALID);
+ saved_mm_registers : array[0..0] of tsuperregister = (RS_INVALID);
+
+ { Required parameter alignment when calling a routine }
+ std_param_align = 1;
+
+
+{*****************************************************************************
+ CPU Dependent Constants
+*****************************************************************************}
+
+ maxfpuregs = 0;
+
+{*****************************************************************************
+ Helpers
+*****************************************************************************}
+
+ function cgsize2subreg(regtype: tregistertype; s:Tcgsize):Tsubregister;
+ function reg_cgsize(const reg: tregister) : tcgsize;
+
+ function std_regnum_search(const s:string):Tregister;
+ function std_regname(r:Tregister):string;
+ function findreg_by_number(r:Tregister):tregisterindex;
+
+implementation
+
+uses
+ rgbase;
+
+{*****************************************************************************
+ Helpers
+*****************************************************************************}
+
+ const
+ std_regname_table : array[tregisterindex] of string[15] = (
+ {$i rjsstd.inc}
+ );
+
+ regnumber_index : array[tregisterindex] of tregisterindex = (
+ {$i rjsrni.inc}
+ );
+
+ std_regname_index : array[tregisterindex] of tregisterindex = (
+ {$i rjssri.inc}
+ );
+
+ function reg_cgsize(const reg: tregister): tcgsize;
+ begin
+ result:=OS_NO;
+ end;
+
+
+ function cgsize2subreg(regtype: tregistertype; s:Tcgsize):Tsubregister;
+ begin
+ cgsize2subreg:=R_SUBNONE;
+ end;
+
+
+ function std_regnum_search(const s:string):Tregister;
+ begin
+ result:=NR_NO;
+ end;
+
+
+ function findreg_by_number(r:Tregister):tregisterindex;
+ begin
+ result:=findreg_by_number_table(r,regnumber_index);
+ end;
+
+ function std_regname(r:Tregister):string;
+ var
+ p : tregisterindex;
+ begin
+ p:=findreg_by_number_table(r,regnumber_index);
+ if p<>0 then
+ result:=std_regname_table[p]
+ else
+ result:=generic_regname(r);
+ end;
+
+
+end.