[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