99#include " codegen.h"
1010#include " fgwasm.h"
1111
12+ #ifdef TARGET_64BIT
13+ static const instruction INS_I_const = INS_i64_const;
14+ static const instruction INS_I_add = INS_i64_add;
15+ #else // !TARGET_64BIT
16+ static const instruction INS_I_const = INS_i32_const;
17+ static const instruction INS_I_add = INS_i32_add;
18+ #endif // !TARGET_64BIT
19+
1220void CodeGen::genMarkLabelsForCodegen ()
1321{
1422 // No work needed here for now.
@@ -268,6 +276,14 @@ void CodeGen::genCodeForTreeNode(GenTree* treeNode)
268276 genCodeForCompare (treeNode->AsOp ());
269277 break ;
270278
279+ case GT_LCL_ADDR:
280+ genCodeForLclAddr (treeNode->AsLclFld ());
281+ break ;
282+
283+ case GT_LCL_FLD:
284+ genCodeForLclFld (treeNode->AsLclFld ());
285+ break ;
286+
271287 case GT_LCL_VAR:
272288 genCodeForLclVar (treeNode->AsLclVar ());
273289 break ;
@@ -741,6 +757,38 @@ void CodeGen::genCodeForNegNot(GenTreeOp* tree)
741757 genProduceReg (tree);
742758}
743759
760+ // ------------------------------------------------------------------------
761+ // genCodeForLclAddr: Generates the code for GT_LCL_ADDR.
762+ //
763+ // Arguments:
764+ // lclAddrNode - the node.
765+ //
766+ void CodeGen::genCodeForLclAddr (GenTreeLclFld* lclAddrNode)
767+ {
768+ assert (lclAddrNode->OperIs (GT_LCL_ADDR));
769+
770+ GetEmitter ()->emitIns_I (INS_local_get, EA_PTRSIZE, WasmRegToIndex (GetFramePointerReg ()));
771+ GetEmitter ()->emitIns_S (INS_I_const, EA_PTRSIZE, lclAddrNode->GetLclNum (), lclAddrNode->GetLclOffs ());
772+ GetEmitter ()->emitIns (INS_I_add);
773+ genProduceReg (lclAddrNode);
774+ }
775+
776+ // ------------------------------------------------------------------------
777+ // genCodeForLclFld: Produce code for a GT_LCL_FLD node.
778+ //
779+ // Arguments:
780+ // tree - the GT_LCL_FLD node
781+ //
782+ void CodeGen::genCodeForLclFld (GenTreeLclFld* tree)
783+ {
784+ assert (tree->OperIs (GT_LCL_FLD));
785+ LclVarDsc* varDsc = compiler->lvaGetDesc (tree);
786+
787+ GetEmitter ()->emitIns_I (INS_local_get, EA_PTRSIZE, WasmRegToIndex (GetFramePointerReg ()));
788+ GetEmitter ()->emitIns_S (ins_Load (tree->TypeGet ()), emitTypeSize (tree), tree->GetLclNum (), tree->GetLclOffs ());
789+ genProduceReg (tree);
790+ }
791+
744792// ------------------------------------------------------------------------
745793// genCodeForLclVar: Produce code for a GT_LCL_VAR node.
746794//
@@ -759,14 +807,14 @@ void CodeGen::genCodeForLclVar(GenTreeLclVar* tree)
759807 if (!varDsc->lvIsRegCandidate ())
760808 {
761809 var_types type = varDsc->GetRegisterType (tree);
762- // TODO-WASM: actually local.get the frame base local here.
810+ GetEmitter ()-> emitIns_I (INS_local_get, EA_PTRSIZE, WasmRegToIndex ( GetFramePointerReg ()));
763811 GetEmitter ()->emitIns_S (ins_Load (type), emitTypeSize (tree), tree->GetLclNum (), 0 );
764812 genProduceReg (tree);
765813 }
766814 else
767815 {
768816 assert (genIsValidReg (varDsc->GetRegNum ()));
769- unsigned wasmLclIndex = UnpackWasmReg (varDsc->GetRegNum ());
817+ unsigned wasmLclIndex = WasmRegToIndex (varDsc->GetRegNum ());
770818 GetEmitter ()->emitIns_I (INS_local_get, emitTypeSize (tree), wasmLclIndex);
771819 }
772820}
@@ -785,23 +833,15 @@ void CodeGen::genCodeForStoreLclVar(GenTreeLclVar* tree)
785833 assert (!op1->IsMultiRegNode ());
786834 genConsumeRegs (op1);
787835
836+ // We rewrite all stack stores to STOREIND because the address must be first on the operand stack, so here only
837+ // enregistered locals need to be handled.
788838 LclVarDsc* varDsc = compiler->lvaGetDesc (tree);
789839 regNumber targetReg = varDsc->GetRegNum ();
840+ assert (genIsValidReg (targetReg) && varDsc->lvIsRegCandidate ());
790841
791- if (!varDsc->lvIsRegCandidate ())
792- {
793- // TODO-WASM: handle these cases in lower/ra.
794- // Emit drop for now to simulate the store effect on the wasm stack.
795- GetEmitter ()->emitIns (INS_drop);
796- genUpdateLife (tree);
797- }
798- else
799- {
800- assert (genIsValidReg (targetReg));
801- unsigned wasmLclIndex = UnpackWasmReg (targetReg);
802- GetEmitter ()->emitIns_I (INS_local_set, emitTypeSize (tree), wasmLclIndex);
803- genUpdateLifeStore (tree, targetReg, varDsc);
804- }
842+ unsigned wasmLclIndex = WasmRegToIndex (targetReg);
843+ GetEmitter ()->emitIns_I (INS_local_set, emitTypeSize (tree), wasmLclIndex);
844+ genUpdateLifeStore (tree, targetReg, varDsc);
805845}
806846
807847// ------------------------------------------------------------------------
0 commit comments