Index: BasicCompiler64/NumOpe_Arithmetic.cpp
===================================================================
--- BasicCompiler64/NumOpe_Arithmetic.cpp	(revision 3)
+++ 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;
