Index: /BasicCompiler64/Compile_CallProc.cpp
===================================================================
--- /BasicCompiler64/Compile_CallProc.cpp	(revision 18)
+++ /BasicCompiler64/Compile_CallProc.cpp	(revision 19)
@@ -511,5 +511,4 @@
 		Call_DebugSys_SaveContext();
 
-	pdi->bUse=1;
 
 
@@ -539,8 +538,5 @@
 
 	//call dword ptr[ImportTable]
-	OpBuffer[obp++]=(char)0xFF;
-	OpBuffer[obp++]=(char)0x15;
-	pobj_ImportAddrSchedule->add(pdi);
-	obp+=sizeof(long);
+	op_call( pdi );
 
 	/* 64コンパイラでは不要
Index: /BasicCompiler64/Compile_ProcOp.cpp
===================================================================
--- /BasicCompiler64/Compile_ProcOp.cpp	(revision 18)
+++ /BasicCompiler64/Compile_ProcOp.cpp	(revision 19)
@@ -617,5 +617,5 @@
 			}
 		}
-		if(psi->name[0]=='~'){
+		else if(psi->name[0]=='~'){
 			//デストラクタをコンパイルしたとき
 
@@ -646,6 +646,5 @@
 			pobj_CompilingClass->NotifyFinishConstructorCompile();
 		}
-
-		if(psi->name[0]=='~'){
+		else if(psi->name[0]=='~'){
 			////////////////////////////////////
 			//デストラクタをコンパイルしたとき
Index: /BasicCompiler64/Compile_Var.cpp
===================================================================
--- /BasicCompiler64/Compile_Var.cpp	(revision 18)
+++ /BasicCompiler64/Compile_Var.cpp	(revision 19)
@@ -1181,5 +1181,25 @@
 			}
 			else{
-				//0初期化未完成
+				//0初期化
+
+				//mov r8, 0
+				op_zero_reg( REG_R8 );
+
+				//mov rdx, VarSize
+				op_mov_RV( sizeof(_int64), REG_RDX, VarSize );
+
+				//mov rcx, rsp
+				op_mov_RR( REG_RCX, REG_RSP );
+
+				//add rcx, offset
+				op_add64_value( REG_RCX, -pVar->offset );
+				obp-=sizeof(long);
+				AddLocalVarAddrSchedule();
+				obp+=sizeof(long);
+
+				//call FillMemory
+				DECLAREINFO *pdi;
+				pdi=GetDeclareHash("FillMemory");
+				op_call( pdi );
 			}
 		}
Index: /BasicCompiler64/NumOpe.cpp
===================================================================
--- /BasicCompiler64/NumOpe.cpp	(revision 18)
+++ /BasicCompiler64/NumOpe.cpp	(revision 19)
@@ -566,5 +566,5 @@
 							SetUseRegFromRax(RetTypeInfo.type,UseReg,XmmReg);
 
-							if(IsRealNumberType(i2)) bXmm=1;
+							if(IsRealNumberType(type[sp])) bXmm=1;
 							else bXmm=0;
 
Index: /BasicCompiler64/NumOpe_Arithmetic.cpp
===================================================================
--- /BasicCompiler64/NumOpe_Arithmetic.cpp	(revision 18)
+++ /BasicCompiler64/NumOpe_Arithmetic.cpp	(revision 19)
@@ -1,138 +1,4 @@
 #include "../BasicCompiler_Common/common.h"
 #include "Opcode.h"
-
-void GetStackData_ToRegister(int *type,int sp){
-	/*NumOpeポーランドのスタック蓄積による演算内容（2つのデータ）を
-		レジスタedx:eax、ecx:ebxに取得する*/
-
-	if(type[sp-1]==DEF_DOUBLE){
-		//fld qword ptr[esp]
-		op_fld_ptr_esp(DEF_DOUBLE);
-
-		//fistp qword ptr[esp]
-		OpBuffer[obp++]=(char)0xDF;
-		OpBuffer[obp++]=(char)0x3C;
-		OpBuffer[obp++]=(char)0x24;
-
-		//pop ebx
-		op_pop(REG_EBX);
-
-		//pop ecx
-		op_pop(REG_ECX);
-	}
-	else if(type[sp-1]==DEF_SINGLE){
-		//fld dword ptr[esp]
-		op_fld_ptr_esp(DEF_SINGLE);
-
-		//sub esp,4
-		op_sub_esp(4);
-
-		//fistp qword ptr[esp]
-		OpBuffer[obp++]=(char)0xDF;
-		OpBuffer[obp++]=(char)0x3C;
-		OpBuffer[obp++]=(char)0x24;
-
-		//pop ebx
-		op_pop(REG_EBX);
-
-		//pop ecx
-		op_pop(REG_ECX);
-	}
-	else if(type[sp-1]==DEF_INT64||type[sp-1]==DEF_QWORD){
-		//pop ebx
-		op_pop(REG_EBX);
-
-		//pop ecx
-		op_pop(REG_ECX);
-	}
-	else{
-		//pop eax
-		op_pop(REG_EAX);
-
-		if(IsSignedType(type[sp-1])){
-			//符号拡張
-			//edx:eax ← eax
-				
-			//cdq
-			OpBuffer[obp++]=(char)0x99;
-		}
-		else{
-			//ビット拡張
-			//edx:eax ← eax
-
-			//xor rdx,rdx
-			op_zero_reg(REG_RDX);
-		}
-
-		//mov ebx,eax
-		OpBuffer[obp++]=(char)0x8B;
-		OpBuffer[obp++]=(char)0xD8;
-
-		//mov ecx,edx
-		OpBuffer[obp++]=(char)0x8B;
-		OpBuffer[obp++]=(char)0xCA;
-	}
-
-	//第1項を64ビットに対応させる
-	if(type[sp-2]==DEF_DOUBLE){
-		//fld qword ptr[esp]
-		op_fld_ptr_esp(DEF_DOUBLE);
-
-		//fistp qword ptr[esp]
-		OpBuffer[obp++]=(char)0xDF;
-		OpBuffer[obp++]=(char)0x3C;
-		OpBuffer[obp++]=(char)0x24;
-
-		//pop eax
-		op_pop(REG_EAX);
-
-		//pop edx
-		op_pop(REG_EDX);
-	}
-	else if(type[sp-2]==DEF_SINGLE){
-		//fld dword ptr[esp]
-		op_fld_ptr_esp(DEF_SINGLE);
-
-		//sub esp,4
-		op_sub_esp(4);
-
-		//fistp qword ptr[esp]
-		OpBuffer[obp++]=(char)0xDF;
-		OpBuffer[obp++]=(char)0x3C;
-		OpBuffer[obp++]=(char)0x24;
-
-		//pop eax
-		op_pop(REG_EAX);
-
-		//pop edx
-		op_pop(REG_EDX);
-	}
-	else if(type[sp-2]==DEF_INT64||type[sp-2]==DEF_QWORD){
-		//pop eax
-		op_pop(REG_EAX);
-
-		//pop edx
-		op_pop(REG_EDX);
-	}
-	else{
-		//pop eax
-		op_pop(REG_EAX);
-
-		if(IsSignedType(type[sp-2])){
-			//符号拡張
-			//edx:eax ← eax
-				
-			//cdq
-			OpBuffer[obp++]=(char)0x99;
-		}
-		else{
-			//ビット拡張
-			//edx:eax ← eax
-
-			//xor rdx,rdx
-			op_zero_reg(REG_RDX);
-		}
-	}
-}
 
 BOOL CalcTwoTerm_Arithmetic(int idCalc,int *type,LONG_PTR *index_stack,int *pStackPointer){
@@ -316,50 +182,71 @@
 	}
 
-	//mov qword ptr[rsp+offset],rax     ※スタックフレームを利用
-	pobj_sf->push(REG_RAX);
-
-	if(reg1!=REG_RDX){
+	//raxまたはrdxが使用中かどうかを調べる( true/使用中, false/未使用 )
+	bool isUsingRax = pobj_reg->IsUsing( REG_RAX );
+	bool isUsingRdx = pobj_reg->IsUsing( REG_RDX );
+
+	if(reg1!=REG_RDX && isUsingRdx){
+		//結果レジスタがrdxでない場合（使用されている可能性があるとき）
+
 		//mov qword ptr[rsp+offset],rdx     ※スタックフレームを利用
 		pobj_sf->push(REG_RDX);
 	}
 
-	//mov rax,reg1
-	op_mov64_ToReg_FromReg(REG_RAX,reg1);
-
-	if(IsSignedType(type[sp-2])){
-		//符号拡張
-		//rdx:rax ← rax
-
-		//cqo
-		OpBuffer[obp++]=(char)0x48;
-		OpBuffer[obp++]=(char)0x99;
-	}
-	else{
-		//ビット拡張
-		//rdx:rax ← rax
-
-		//xor rdx,rdx
-		op_zero_reg(REG_RDX);
-	}
-
-	if(IsSignedType(AnswerType)){
-		//idiv reg2
-		op_idiv64_reg(reg2);
-	}
-	else{
-		//div reg2
-		op_div64_reg(reg2);
-	}
-
-	//mov rax,qword ptr[rsp+offset]     ※スタックフレームを利用
-	pobj_sf->pop(REG_RAX);
-
-	//mov reg1,rdx
-	op_mov64_ToReg_FromReg(reg1,REG_RDX);
-
-	if(reg1!=REG_RDX){
+	if(reg1!=REG_RAX && isUsingRax){
+		//結果レジスタがraxでない場合（使用されている可能性があるとき）
+
+		//mov qword ptr[rsp+offset],rax     ※スタックフレームを利用
+		pobj_sf->push(REG_RAX);
+	}
+
+	{
+
+		//mov rax,reg1
+		op_mov64_ToReg_FromReg(REG_RAX,reg1);
+
+		if(IsSignedType(type[sp-2])){
+			//符号拡張
+			//rdx:rax ← rax
+
+			//cqo
+			OpBuffer[obp++]=(char)0x48;
+			OpBuffer[obp++]=(char)0x99;
+		}
+		else{
+			//ビット拡張
+			//rdx:rax ← rax
+
+			//xor rdx,rdx
+			op_zero_reg(REG_RDX);
+		}
+
+		if(IsSignedType(AnswerType)){
+			//idiv reg2
+			op_idiv64_reg(reg2);
+		}
+		else{
+			//div reg2
+			op_div64_reg(reg2);
+		}
+
+		//mov reg1,rdx
+		op_mov64_ToReg_FromReg(reg1,REG_RDX);
+
+	}
+
+	if(reg1!=REG_RAX && isUsingRax){
+		//結果レジスタがraxでない場合（使用されている可能性があるとき）
+
+		//mov rax,qword ptr[rsp+offset]     ※スタックフレームを利用
+		pobj_sf->pop(REG_RAX);
+	}
+
+	if(reg1!=REG_RDX && isUsingRdx){
+		//結果レジスタがrdxでない場合（使用されている可能性があるとき）
+
 		//mov rdx,qword ptr[rsp+offset]     ※スタックフレームを利用
 		pobj_sf->pop(REG_RDX);
 	}
+
 
 	if(reg1==REG_R14){
@@ -471,50 +358,70 @@
 	}
 
-	//mov qword ptr[rsp+offset],rdx     ※スタックフレームを利用
-	pobj_sf->push(REG_RDX);
-
-	if(reg1!=REG_RAX){
+	//raxまたはrdxが使用中かどうかを調べる( true/使用中, false/未使用 )
+	bool isUsingRax = pobj_reg->IsUsing( REG_RAX );
+	bool isUsingRdx = pobj_reg->IsUsing( REG_RDX );
+
+	if(reg1!=REG_RDX && isUsingRdx){
+		//結果レジスタがrdxでない場合（使用されている可能性があるとき）
+
+		//mov qword ptr[rsp+offset],rdx     ※スタックフレームを利用
+		pobj_sf->push(REG_RDX);
+	}
+
+	if(reg1!=REG_RAX && isUsingRax){
+		//結果レジスタがraxでない場合（使用されている可能性があるとき）
+
 		//mov qword ptr[rsp+offset],rax     ※スタックフレームを利用
 		pobj_sf->push(REG_RAX);
 	}
 
-	//mov rax,reg1
-	op_mov64_ToReg_FromReg(REG_RAX,reg1);
-
-	if(IsSignedType(type[sp-2])){
-		//符号拡張
-		//rdx:rax ← rax
-
-		//cqo
-		OpBuffer[obp++]=(char)0x48;
-		OpBuffer[obp++]=(char)0x99;
-	}
-	else{
-		//ビット拡張
-		//rdx:rax ← rax
-
-		//xor rdx,rdx
-		op_zero_reg(REG_RDX);
-	}
-
-	if(IsSignedType(AnswerType)){
-		//idiv reg2
-		op_idiv64_reg(reg2);
-	}
-	else{
-		//div reg2
-		op_div64_reg(reg2);
-	}
-
-	//mov reg1,rax
-	op_mov64_ToReg_FromReg(reg1,REG_RAX);
-
-	if(reg1!=REG_RAX){
+	{
+
+		//mov rax,reg1
+		op_mov64_ToReg_FromReg(REG_RAX,reg1);
+
+		if(IsSignedType(type[sp-2])){
+			//符号拡張
+			//rdx:rax ← rax
+
+			//cqo
+			OpBuffer[obp++]=(char)0x48;
+			OpBuffer[obp++]=(char)0x99;
+		}
+		else{
+			//ビット拡張
+			//rdx:rax ← rax
+
+			//xor rdx,rdx
+			op_zero_reg(REG_RDX);
+		}
+
+		if(IsSignedType(AnswerType)){
+			//idiv reg2
+			op_idiv64_reg(reg2);
+		}
+		else{
+			//div reg2
+			op_div64_reg(reg2);
+		}
+
+		//mov reg1,rax
+		op_mov64_ToReg_FromReg(reg1,REG_RAX);
+
+	}
+
+	if(reg1!=REG_RAX && isUsingRax){
+		//結果レジスタがraxでない場合（使用されている可能性があるとき）
+
 		//mov rax,qword ptr[rsp+offset]     ※スタックフレームを利用
 		pobj_sf->pop(REG_RAX);
 	}
 
-	//mov rdx,qword ptr[rsp+offset]     ※スタックフレームを利用
-	pobj_sf->pop(REG_RDX);
+	if(reg1!=REG_RDX && isUsingRdx){
+		//結果レジスタがrdxでない場合（使用されている可能性があるとき）
+
+		//mov rdx,qword ptr[rsp+offset]     ※スタックフレームを利用
+		pobj_sf->pop(REG_RDX);
+	}
 
 
@@ -526,5 +433,4 @@
 	sp--;
 	type[sp-1]=AnswerType;
-
 
 	*pStackPointer=sp;
Index: /BasicCompiler64/Opcode.h
===================================================================
--- /BasicCompiler64/Opcode.h	(revision 18)
+++ /BasicCompiler64/Opcode.h	(revision 19)
@@ -185,4 +185,7 @@
 	int UnlockXmmReg();
 
+	//レジスタが利用中かどうかを調べる
+	bool IsUsing( int reg );
+
 	//レジスタのバックアップと復旧
 	void backup();
@@ -253,5 +256,4 @@
 
 //NumOpe_Arithmetic.cpp
-void GetStackData_ToRegister(int *type,int sp);
 BOOL CalcTwoTerm_Arithmetic(int idCalc,int *type,LONG_PTR *index_stack,int *pStackPointer);
 BOOL Calc_Mod(int *type,LONG_PTR *index_stack,int *pStackPointer);
@@ -503,3 +505,4 @@
 void op_fld_ptr_esp(int type);
 void op_zero_reg(int reg);
-void op_call(SUBINFO *psi);
+void op_call( SUBINFO *psi );
+void op_call( DECLAREINFO *pdi );
Index: /BasicCompiler64/Register.cpp
===================================================================
--- /BasicCompiler64/Register.cpp	(revision 18)
+++ /BasicCompiler64/Register.cpp	(revision 19)
@@ -226,4 +226,23 @@
 	return GetNextXmmReg();
 }
+bool CRegister::IsUsing( int reg ){
+	int i;
+
+	//汎用レジスタを調べる
+	for(i=init_sp_reg;i>sp_UseReg;i--){
+		if( array_UseReg[i] == reg ) return true;
+	}
+
+	//XMMレジスタを調べる
+	for(i=init_sp_xmm_reg;i>sp_XmmReg;i--){
+		if( array_XmmReg[i] == reg ) return true;
+	}
+
+	//ブロックされている場合を考慮
+	if( pobj_BlockReg->check( reg ) ) return true;
+
+	//使用中でないとき
+	return false;
+}
 void CRegister::backup(){
 	int i;
Index: /BasicCompiler64/amd64_main.cpp
===================================================================
--- /BasicCompiler64/amd64_main.cpp	(revision 18)
+++ /BasicCompiler64/amd64_main.cpp	(revision 19)
@@ -1765,8 +1765,16 @@
 /////////////////////////////
 
-void op_call(SUBINFO *psi){
-	OpBuffer[obp++]=(char)0xE8;
-	pobj_SubAddrSchedule->add(psi,1);
-	psi->bUse=1;
-	obp+=sizeof(long);
-}
+void op_call( SUBINFO *psi ){
+	OpBuffer[obp++] = (char)0xE8;
+	pobj_SubAddrSchedule->add( psi, 1 );
+	psi->bUse = 1;
+	obp += sizeof(long);
+}
+void op_call( DECLAREINFO *pdi ){
+	OpBuffer[obp++] = (char)0xFF;
+	OpBuffer[obp++] = (char)0x15;
+	pobj_ImportAddrSchedule->add(pdi);
+	obp += sizeof(long);
+
+	pdi->bUse=1;
+}
