[pypy-svn] r15544 - in pypy/dist/pypy/translator/llvm2: . module

rxe at codespeak.net rxe at codespeak.net
Wed Aug 3 11:00:51 CEST 2005


Author: rxe
Date: Wed Aug  3 11:00:49 2005
New Revision: 15544

Modified:
   pypy/dist/pypy/translator/llvm2/genllvm.py
   pypy/dist/pypy/translator/llvm2/module/ll_time.py
Log:
Generate the time code from genc's c code.


Modified: pypy/dist/pypy/translator/llvm2/genllvm.py
==============================================================================
--- pypy/dist/pypy/translator/llvm2/genllvm.py	(original)
+++ pypy/dist/pypy/translator/llvm2/genllvm.py	Wed Aug  3 11:00:49 2005
@@ -20,6 +20,18 @@
 
 function_count = {}
 
+# XXX Temp
+raise_impl = """
+ccc void %RaiseSimpleException(int %t, sbyte* %ptErr) {
+entry:
+        unwind
+	ret void
+}
+"""
+
+# XXX Temp
+raise_decl = "declare ccc void %RaiseSimpleException(int, sbyte*)"
+
 class GenLLVM(object):
 
     def __init__(self, translator, debug=False, embedexterns=True):
@@ -77,6 +89,7 @@
             
         nl(); comment("Function Prototypes") ; nl()
         if self.embedexterns:
+            codewriter.append(raise_decl)
             for extdecl in extdeclarations.split('\n'):
                 codewriter.append(extdecl)
 
@@ -112,6 +125,9 @@
                         codewriter.append(extfunc)
                     depdone[dep] = True
 
+        if self.embedexterns:
+            codewriter.append(raise_impl)
+
         #XXX use codewriter methods here
         decl = self.entrynode.getdecl()
         t = decl.split('%', 1)

Modified: pypy/dist/pypy/translator/llvm2/module/ll_time.py
==============================================================================
--- pypy/dist/pypy/translator/llvm2/module/ll_time.py	(original)
+++ pypy/dist/pypy/translator/llvm2/module/ll_time.py	Wed Aug  3 11:00:49 2005
@@ -1,37 +1,86 @@
 extdeclarations = '''
 ;ll_time.py
-declare ccc int %time(int*) ;void* actually
+
+%struct.timeval = type { int, int }
+%struct.timezone = type { int, int }
+%typedef.fd_set = type { [32 x int] }
+
+%.str_1 = internal constant [16 x sbyte] c"select() failed\\00"		; <[16 x sbyte]*> [#uses=1]
+
+declare ccc double %floor(double)
+declare ccc double %fmod(double, double)
 declare ccc int %clock()
-declare ccc void %sleep(int)
+declare ccc int %select(int, %typedef.fd_set*, %typedef.fd_set*, %typedef.fd_set*, %struct.timeval*)
+declare ccc int %gettimeofday(%struct.timeval*, %struct.timeval*)
+declare ccc int %time( int* )
 '''
 
 extfunctions = {}
 
 extfunctions["%ll_time_time"] = ((), """
+
 fastcc double %ll_time_time() {
-    %v0 = call ccc int %time(int* null)
-    %v1 = cast int %v0 to double
-    ret double %v1
+	%t = alloca %struct.timeval		; <%struct.timeval*> [#uses=3]
+	%secs = alloca int		; <int*> [#uses=2]
+	%tmp.0 = call int %gettimeofday( %struct.timeval* %t, %struct.timeval* null )		; <int> [#uses=1]
+	%tmp.1 = seteq int %tmp.0, 0		; <bool> [#uses=2]
+	%tmp.2 = cast bool %tmp.1 to int		; <int> [#uses=0]
+	br bool %tmp.1, label %then, label %endif
+
+then:		; preds = %entry
+	%tmp.3 = getelementptr %struct.timeval* %t, int 0, uint 0		; <int*> [#uses=1]
+	%tmp.4 = load int* %tmp.3		; <int> [#uses=1]
+	%tmp.5 = cast int %tmp.4 to double		; <double> [#uses=1]
+	%tmp.6 = getelementptr %struct.timeval* %t, int 0, uint 1		; <int*> [#uses=1]
+	%tmp.7 = load int* %tmp.6		; <int> [#uses=1]
+	%tmp.8 = cast int %tmp.7 to double		; <double> [#uses=1]
+	%tmp.9 = mul double %tmp.8, 1.000000e-06		; <double> [#uses=1]
+	%tmp.10 = add double %tmp.5, %tmp.9		; <double> [#uses=1]
+	ret double %tmp.10
+
+endif:		; preds = %entry
+	%tmp.11 = call int %time( int* %secs )		; <int> [#uses=0]
+	%tmp.12 = load int* %secs		; <int> [#uses=1]
+	%tmp.13 = cast int %tmp.12 to double		; <double> [#uses=1]
+	ret double %tmp.13
 }
 
 """)
 
 extfunctions["%ll_time_clock"] = ((), """
 fastcc double %ll_time_clock() {
-    %v0 = call ccc int %clock()
-    %v1 = cast int %v0 to double
-    ; XXX how to get at the proper division (or any other) constant per platform?
-    %v2 = div double %v1, 1000000.0    ;CLOCKS_PER_SEC accrdoing to single unix spec
-    ret double %v2
+entry:
+	%tmp.0 = call int %clock( )		; <int> [#uses=1]
+	%tmp.1 = cast int %tmp.0 to double		; <double> [#uses=1]
+	%tmp.2 = div double %tmp.1, 1.000000e+06		; <double> [#uses=1]
+	ret double %tmp.2
 }
-
 """)
 
 extfunctions["%ll_time_sleep"] = ((), """
-fastcc void %ll_time_sleep(double %f) {
-    %i = cast double %f to int
-    call ccc void %sleep(int %i)
-    ret void
+fastcc void %ll_time_sleep(double %secs) {
+entry:
+	%t = alloca %struct.timeval		; <%struct.timeval*> [#uses=3]
+	%tmp.0 = call double %fmod( double %secs, double 1.000000e+00 )		; <double> [#uses=1]
+	%tmp.2 = call double %floor( double %secs )		; <double> [#uses=1]
+	%tmp.4 = getelementptr %struct.timeval* %t, int 0, uint 0		; <int*> [#uses=1]
+	%tmp.6 = cast double %tmp.2 to int		; <int> [#uses=1]
+	store int %tmp.6, int* %tmp.4
+	%tmp.7 = getelementptr %struct.timeval* %t, int 0, uint 1		; <int*> [#uses=1]
+	%tmp.9 = mul double %tmp.0, 1.000000e+06		; <double> [#uses=1]
+	%tmp.10 = cast double %tmp.9 to int		; <int> [#uses=1]
+	store int %tmp.10, int* %tmp.7
+	%tmp.11 = call int %select( int 0, %typedef.fd_set* null, %typedef.fd_set* null, %typedef.fd_set* null, %struct.timeval* %t )		; <int> [#uses=1]
+	%tmp.12 = setne int %tmp.11, 0		; <bool> [#uses=2]
+	%tmp.13 = cast bool %tmp.12 to int		; <int> [#uses=0]
+	br bool %tmp.12, label %then.1, label %return
+
+then.1:		; preds = %entry
+	call void %RaiseSimpleException( int 1, sbyte* getelementptr ([16 x sbyte]* %.str_1, int 0, int 0) )
+	ret void
+
+return:		; preds = %entry
+	ret void
 }
 
 """)



More information about the Pypy-commit mailing list