* Another patch for frysk assembly
@ 2007-10-16 22:07 Jose Flavio Aguilar Paulino
0 siblings, 0 replies; only message in thread
From: Jose Flavio Aguilar Paulino @ 2007-10-16 22:07 UTC (permalink / raw)
To: Frysk
[-- Attachment #1: Type: text/plain, Size: 301 bytes --]
I need to update a unit test (other ones will be needed to be updated)
Could community review it before I commit?
Thanks a lot,
best regards,
--
Jose Flavio Aguilar Paulino
(jflavio@br.ibm.com)
http://www.j-fap.com
System / Software Engineer
Toolchain Team
LTC, Linux Technology Center
IBM Brazil
[-- Attachment #2: frysk_assembly_4_power --]
[-- Type: text/x-patch, Size: 5956 bytes --]
Index: frysk/frysk-core/frysk/pkglibdir/funit-frameless.S
===================================================================
--- frysk.orig/frysk-core/frysk/pkglibdir/funit-frameless.S
+++ frysk/frysk-core/frysk/pkglibdir/funit-frameless.S
@@ -50,8 +50,10 @@
MOV(REG0, REG1)
FRAMELESS_ADJ_RETURN (REG1)
NO_OP ; NO_OP
+#if !defined __powerpc__
LOAD_IMMED_WORD(REG0, .L1)
JUMP(bar) // _stepFramelessEntry_
+#endif
.L1:
NO_OP ; NO_OP // _stepFramelessReturn_
JUMP_REG(REG1)
@@ -59,9 +61,11 @@
FUNCTION_BEGIN(main, 0)
- MAIN_PROLOGUE(0)
+ MAIN_PROLOGUE(0)
+#if !defined __powerpc__
LOAD_IMMED_WORD(REG0, .L2)
JUMP(foo)
+#endif
.L2:
NO_OP
MAIN_EPILOGUE(0)
Index: frysk/frysk-imports/include/frysk-asm.h
===================================================================
--- frysk.orig/frysk-imports/include/frysk-asm.h
+++ frysk/frysk-imports/include/frysk-asm.h
@@ -133,17 +133,14 @@
# define REG3 %rdx
# define SP %rsp
#elif defined __powerpc__
-# define REG0 3
-# define REG1 4
-# define REG2 5
-# define REG3 6
+// System call number goes in GPR00
+# define REG0 0
+// Function (integer) parameters should be in GPR03 to GPR10
+# define REG1 3
+# define REG2 4
+# define REG3 5
+// PowerPC Abi defines that the GPR01 should be used as stack pointer
# define SP 1
-#elif defined __powerpc64__
-# define REG0 %gpr3
-# define REG1 %gpr4
-# define REG2 %gpr5
-# define REG3 %gpr6
-# define SP %gpr1
#else
# warning "no general purpose registers"
#endif
@@ -289,8 +286,8 @@
# define ADD(DEST_REG, SOURCE_REG) addl DEST_REG, SOURCE_REG
#elif defined __x86_64__
# define ADD(DEST_REG, SOURCE_REG) addq DEST_REG, SOURCE_REG
-//#elif defined __powerpc__
-//# define ADD(DEST_REG, SOURCE_REG)
+#elif defined __powerpc__
+# define ADD(DEST_REG, SOURCE_REG) add DEST_REG, SOURCE_REG, DEST_REG
//#elif defined __powerpc64__
//# define ADD(DEST_REG, SOURCE_REG)
#else
@@ -301,8 +298,8 @@
# define SUB(DEST_REG, SOURCE_REG) subl DEST_REG, SOURCE_REG
#elif defined __x86_64__
# define SUB(DEST_REG, SOURCE_REG) subq DEST_REG, SOURCE_REG
-//#elif defined __powerpc__
-//# define SUB(DEST_REG, SOURCE_REG)
+#elif defined __powerpc__
+# define SUB(DEST_REG, SOURCE_REG) subf DEST_REG, SOURCE_REG, DEST_REG
//#elif defined __powerpc64__
//# define SUB(DEST_REG, SOURCE_REG)
#else
@@ -313,8 +310,8 @@
# define MOV(SOURCE_REG, DEST_REG) movl SOURCE_REG, DEST_REG
#elif defined __x86_64__
# define MOV(SOURCE_REG, DEST_REG) movq SOURCE_REG, DEST_REG
-//#elif defined __powerpc__
-//# define MOV(SOURCE_REG, DEST_REG)
+#elif defined __powerpc__
+# define MOV(SOURCE_REG, DEST_REG) mr DEST_REG, SOURCE_REG
//#elif defined __powerpc64__
//# define MOV(SOURCE_REG, DEST_REG)
#else
@@ -325,8 +322,8 @@
# define COMPARE(LHS_REG,RHS_REG) cmpl LHS_REG, RHS_REG
#elif defined __x86_64__
# define COMPARE(LHS_REG,RHS_REG) cmpq LHS_REG, RHS_REG
-//#elif defined __powerpc__
-//# define COMPARE(LHS_REG,RHS_REG)
+#elif defined __powerpc__
+# define COMPARE(LHS_REG,RHS_REG) cmpw cr7, LHS_REG, RHS_REG
//#elif defined __powerpc64__
//# define COMPARE(LHS_REG,RHS_REG)
#else
@@ -381,9 +378,11 @@
#elif defined __x86_64__
# define JUMP_REG(REG) jmp *REG
#elif defined __powerpc__
-# define JUMP_REG(REG) br *REG
-#elif defined __powerpc64__
-# define JUMP_REG(REG) br *REG
+// PowerPC do not have a instructio for jumping for a REG,
+// so the solution is to use a special reg (here counter reg)
+// copy the value to him, and them jump. The problem is that you
+// will lose the old value of CTR reg
+# define JUMP_REG(REG) mtctr REG; bctrl
#else
# warning "No indirect or register jump instruction defined"
#endif
@@ -521,15 +520,11 @@
mflr 0 ; \
stw 0, 36(1) ; \
stw 31, 28(1) ; \
- mr 31, 1 ; \
- stw REG1, 12(31) ; \
- stw REG2, 16(31) ; \
- stw REG3, 20(31) ; \
- stw REG4, 24(31)
-#elif defined __powerpc64__
-# define FUNCTION_PROLOGUE(FUNC,SLOTS) \
- push %gpr0; \
- push %gpr3
+ mr 31, 1 ; \
+ stw REG0, 12(31) ; \
+ stw REG1, 16(31) ; \
+ stw REG2, 20(31) ; \
+ stw REG3, 24(31)
#else
# warning "No function-prologue compound instruction defined"
#endif
@@ -546,17 +541,15 @@
.cfi_adjust_cfa_offset -8
#elif defined __powerpc__
# define FUNCTION_EPILOGUE(FUNC,SLOTS) \
- lwz REG4, 24(31) ; \
- lwz REG3, 20(31) ; \
- lwz REG2, 16(31) ; \
- lwz REG1, 12(31) ; \
+ lwz REG3, 24(31) ; \
+ lwz REG2, 20(31) ; \
+ lwz REG1, 16(31) ; \
+ lwz REG0, 12(31) ; \
lwz 11, 0(1) ; \
lwz 0, 4(11) ; \
mtlr 0 ; \
lwz 31, -4(11) ; \
mr 1, 11
-#elif defined __powerpc64__
-# define FUNCTION_EPILOGUE(FUNC,SLOTS) pop %gpr0
#else
# warning "No function-epilogue instruction sequence defined"
#endif
@@ -655,10 +648,11 @@
# define SYSCALL int $0x80
#elif defined __x86_64__
# define SYSCALL syscall
-//#elif defined __powerpc__
+#elif defined __powerpc__
+# define SYSCALL sc
//#elif defined __powerpc64__
#else
-# warning "No stack-store instruction sequence defined"
+# warning "No sys-call instruction sequence defined"
#endif
\f
@@ -706,6 +700,10 @@
.cfi_startproc; \
.cfi_def_cfa rsp, 0; \
.cfi_return_column rax
+#elif defined __powerpc64__
+#define FRAMELESS_FUNCTION_BEGIN(FUNC) \
+ FUNC: \
+
#else
# warning "No frameless function beginning instructions defined"
#endif
@@ -716,6 +714,8 @@
#elif defined __x86_64__
#define FRAMELESS_ADJ_RETURN(REG) \
.cfi_register rax, REG
+#elif defined __powerpc64__
+#define FRAMELESS_ADJ_RETURN(REG)
#else
# warning "No frameless function return adjustment defined"
#endif
@@ -726,6 +726,9 @@
#elif defined __x86_64__
#define FRAMELESS_FUNCTION_END(FUNC) \
.cfi_endproc
+#elif defined __powerpc64__
+#define FRAMELESS_FUNCTION_END(FUNC) \
+ blr
#else
# warning "No frameless function ending instructions defined"
#endif
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2007-10-16 22:07 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2007-10-16 22:07 Another patch for frysk assembly Jose Flavio Aguilar Paulino
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).