#define NULL ((void *)0)
typedef unsigned long size_t; // Customize by platform.
typedef long intptr_t;
typedef unsigned long uintptr_t;
typedef long scalar_t__; // Either arithmetic or pointer type.
/* By default, we understand bool (as a convenience). */
typedef int bool;
#define false 0
#define true 1

/* Forward declarations */

/* Type definitions */

/* Variables and functions */
int /*<<< orphan*/ puts(char *);
int GaussLaguerreRule(const double **x, const double **w, int npoints) {
  int status = 0;
  static const double x5[] = {0.263560319718140910203061943361E+00,
                              0.141340305910651679221840798019E+01,
                              0.359642577104072208122318658878E+01,
                              0.708581000585883755692212418111E+01,
                              0.126408008442757826594332193066E+02};
  static const double w5[] = {0.521755610582808652475860928792E+00,
                              0.398666811083175927454133348144E+00,
                              0.759424496817075953876533114055E-01,
                              0.361175867992204845446126257304E-02,
                              0.233699723857762278911490845516E-04};
  static const double x10[] = {0.137793470540492430830772505653E+00,
                               0.729454549503170498160373121676E+00,
                               0.180834290174031604823292007575E+01,
                               0.340143369785489951448253222141E+01,
                               0.555249614006380363241755848687E+01,
                               0.833015274676449670023876719727E+01,
                               0.118437858379000655649185389191E+02,
                               0.162792578313781020995326539358E+02,
                               0.219965858119807619512770901956E+02,
                               0.299206970122738915599087933408E+02};
  static const double w10[] = {0.308441115765020141547470834678E+00,
                               0.401119929155273551515780309913E+00,
                               0.218068287611809421588648523475E+00,
                               0.620874560986777473929021293135E-01,
                               0.950151697518110055383907219417E-02,
                               0.753008388587538775455964353676E-03,
                               0.282592334959956556742256382685E-04,
                               0.424931398496268637258657665975E-06,
                               0.183956482397963078092153522436E-08,
                               0.991182721960900855837754728324E-12};
  static const double x20[] = {0.705398896919887533666890045842E-01,
                               0.372126818001611443794241388761E+00,
                               0.916582102483273564667716277074E+00,
                               0.170730653102834388068768966741E+01,
                               0.274919925530943212964503046049E+01,
                               0.404892531385088692237495336913E+01,
                               0.561517497086161651410453988565E+01,
                               0.745901745367106330976886021837E+01,
                               0.959439286958109677247367273428E+01,
                               0.120388025469643163096234092989E+02,
                               0.148142934426307399785126797100E+02,
                               0.179488955205193760173657909926E+02,
                               0.214787882402850109757351703696E+02,
                               0.254517027931869055035186774846E+02,
                               0.299325546317006120067136561352E+02,
                               0.350134342404790000062849359067E+02,
                               0.408330570567285710620295677078E+02,
                               0.476199940473465021399416271529E+02,
                               0.558107957500638988907507734445E+02,
                               0.665244165256157538186403187915E+02};
  static const double w20[] = {0.168746801851113862149223899689E+00,
                               0.291254362006068281716795323812E+00,
                               0.266686102867001288549520868998E+00,
                               0.166002453269506840031469127816E+00,
                               0.748260646687923705400624639615E-01,
                               0.249644173092832210728227383234E-01,
                               0.620255084457223684744754785395E-02,
                               0.114496238647690824203955356969E-02,
                               0.155741773027811974779809513214E-03,
                               0.154014408652249156893806714048E-04,
                               0.108648636651798235147970004439E-05,
                               0.533012090955671475092780244305E-07,
                               0.175798117905058200357787637840E-08,
                               0.372550240251232087262924585338E-10,
                               0.476752925157819052449488071613E-12,
                               0.337284424336243841236506064991E-14,
                               0.115501433950039883096396247181E-16,
                               0.153952214058234355346383319667E-19,
                               0.528644272556915782880273587683E-23,
                               0.165645661249902329590781908529E-27};
  if (npoints == 5) {
    *x = x5;
    *w = w5;
  } else if (npoints == 10) {
    *x = x10;
    *w = w10;
  } else if (npoints == 20) {
    *x = x20;
    *w = w20;
  } else {
    puts("use 5, 10, 20 nodes for GaussLaguerreRule.");
    status = -1;
  }
  return (status);
}


x86 assembly (clang, -O0):
<GaussLaguerreRule>:
push   %rbp
mov    %rsp,%rbp
sub    $0x20,%rsp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %edx,-0x14(%rbp)
movl   $0x0,-0x18(%rbp)
cmpl   $0x5,-0x14(%rbp)
jne    1155 <GaussLaguerreRule+0x45>
mov    -0x8(%rbp),%rax
lea    0xec1(%rip),%rcx
mov    %rcx,(%rax)
mov    -0x10(%rbp),%rax
lea    0xee3(%rip),%rcx
mov    %rcx,(%rax)
jmp    11c8 <GaussLaguerreRule+0xb8>
cmpl   $0xa,-0x14(%rbp)
jne    1180 <GaussLaguerreRule+0x70>
mov    -0x8(%rbp),%rax
lea    0xef6(%rip),%rcx
mov    %rcx,(%rax)
mov    -0x10(%rbp),%rax
lea    0xf38(%rip),%rcx
mov    %rcx,(%rax)
jmp    11c3 <GaussLaguerreRule+0xb3>
cmpl   $0x14,-0x14(%rbp)
jne    11ab <GaussLaguerreRule+0x9b>
mov    -0x8(%rbp),%rax
lea    0xf6b(%rip),%rcx
mov    %rcx,(%rax)
mov    -0x10(%rbp),%rax
lea    0xffd(%rip),%rcx
mov    %rcx,(%rax)
jmp    11be <GaussLaguerreRule+0xae>
lea    0x108e(%rip),%rdi
call   1030 <puts@plt>
movl   $0xffffffff,-0x18(%rbp)
jmp    11c3 <GaussLaguerreRule+0xb3>
jmp    11c8 <GaussLaguerreRule+0xb8>
mov    -0x18(%rbp),%eax
add    $0x20,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<GaussLaguerreRule>:
push   %rax
cmp    $0x14,%edx
je     1133 <GaussLaguerreRule+0x23>
cmp    $0xa,%edx
je     1146 <GaussLaguerreRule+0x36>
cmp    $0x5,%edx
jne    115e <GaussLaguerreRule+0x4e>
lea    0xed9(%rip),%rax
mov    %rax,(%rdi)
lea    0xeff(%rip),%rax
jmp    1157 <GaussLaguerreRule+0x47>
lea    0xfc6(%rip),%rax
mov    %rax,(%rdi)
lea    0x105c(%rip),%rax
jmp    1157 <GaussLaguerreRule+0x47>
lea    0xf13(%rip),%rax
mov    %rax,(%rdi)
lea    0xf59(%rip),%rax
mov    %rax,(%rsi)
xor    %eax,%eax
pop    %rcx
ret
lea    0x10db(%rip),%rdi
call   1030 <puts@plt>
mov    $0xffffffff,%eax
pop    %rcx
ret

LLVM IR (-O0):
@GaussLaguerreRule.x5 = internal constant [5 x double] [double 0x3FD0DE2C1A6D9D31, double 0x3FF69D4C86AEDC8C, double 0x400CC57ADFE8E452, double 0x401C57DE94035546, double 0x402948170C5AD3CD]
@GaussLaguerreRule.w5 = internal constant [5 x double] [double 0x3FE0B238D27EA545, double 0x3FD983C1CCE6951C, double 0x3FB370F6E1C2D4D0, double 0x3F6D96682D29722F, double 0x3EF8815446103D98]
@GaussLaguerreRule.x10 = internal constant [10 x double] [double 0x3FC1A33768C970C9, double 0x3FE757B111411ADF, double 0x3FFCEEF8F76EDAB9, double 0x400B3622DEDE64A3, double 0x401635C18C52F60A, double 0x4020A909C7E41380, double 0x4027B004B28537AD, double 0x4030477D70F4EBBC, double 0x4035FF203F6E1D6F, double 0x403DEBB2CCA53DC4]
@GaussLaguerreRule.w10 = internal constant [10 x double] [double 0x3FD3BD7FCE3CF5F3, double 0x3FD9ABF2EC5FBA27, double 0x3FCBE9A961CB3158, double 0x3FAFC9ED52DF0E64, double 0x3F837588055DC806, double 0x3F48ACB133884D94, double 0x3EFDA1C7BD225785, double 0x3E9C84440DFB409F, double 0x3E1F9A7DDD2BCDA1, double 0x3D716FE3E009670F]
@GaussLaguerreRule.x20 = internal constant [20 x double] [double 0x3FB20EE6F74A60C7, double 0x3FD7D0ED00520387, double 0x3FED54A3FD487771, double 0x3FFB5120A7303920, double 0x4005FE5C2DDDEEBA, double 0x401032197A3BBE90, double 0x401675F06D74AC70, double 0x401DD608ABDF3DDD, double 0x40233054431FA71E, double 0x402813DDED6C6D2E, double 0x402DA0EB11F2E47F, double 0x4031F2EAD11BF39D, double 0x40357A91DDB9BBC7, double 0x403973A2CB543FE6, double 0x403DEEBBE67CE330, double 0x404181B83693C080, double 0x40446AA19D172CF5, double 0x4047CF5BF70688B1, double 0x404BE7C827B7214F, double 0x4050A1900A54C01A]
@GaussLaguerreRule.w20 = internal constant [20 x double] [double 0x3FC5997EC5A0A7FB, double 0x3FD2A3E955E889C3, double 0x3FD1116296872233, double 0x3FC53F9181EC9519, double 0x3FB327CD0CA40E5F, double 0x3F999045AFA0D65E, double 0x3F7967D89077AA15, double 0x3F52C25200530A8D, double 0x3F2469D3A4BFC261, double 0x3EF0264AF50D987D, double 0x3EB23A6C64B64BD1, double 0x3E6C9DA992D7A69F, double 0x3E1E33AED8816084, double 0x3DC47B2DB2D35F63, double 0x3D60C635664C02D4, double 0x3CEE613FD36ADC87, double 0x3C6AA20052414DDA, double 0x3BD22CEB8FDEF44A, double 0x3B19904C92D33029, double 0x3A2A3F62E4A099FB]
@.str = [43 x i8] c"use 5, 10, 20 nodes for GaussLaguerreRule.\00"
define i32 @GaussLaguerreRule(double** %0, double** %1, i32 %2) {
%4 = alloca double**
%5 = alloca double**
%6 = alloca i32
%7 = alloca i32
store double** %0, double*** %4
store double** %1, double*** %5
store i32 %2, i32* %6
store i32 0, i32* %7
%8 = load i32, i32* %6
%9 = icmp eq i32 %8, 5
br i1 %9, label %10, label %13
10: ; preds = %3
%11 = load double**, double*** %4
store double* getelementptr inbounds ([5 x double], [5 x double]* @GaussLaguerreRule.x5, i64 0, i64 0), double** %11
%12 = load double**, double*** %5
store double* getelementptr inbounds ([5 x double], [5 x double]* @GaussLaguerreRule.w5, i64 0, i64 0), double** %12
br label %29
13: ; preds = %3
%14 = load i32, i32* %6
%15 = icmp eq i32 %14, 10
br i1 %15, label %16, label %19
16: ; preds = %13
%17 = load double**, double*** %4
store double* getelementptr inbounds ([10 x double], [10 x double]* @GaussLaguerreRule.x10, i64 0, i64 0), double** %17
%18 = load double**, double*** %5
store double* getelementptr inbounds ([10 x double], [10 x double]* @GaussLaguerreRule.w10, i64 0, i64 0), double** %18
br label %28
19: ; preds = %13
%20 = load i32, i32* %6
%21 = icmp eq i32 %20, 20
br i1 %21, label %22, label %25
22: ; preds = %19
%23 = load double**, double*** %4
store double* getelementptr inbounds ([20 x double], [20 x double]* @GaussLaguerreRule.x20, i64 0, i64 0), double** %23
%24 = load double**, double*** %5
store double* getelementptr inbounds ([20 x double], [20 x double]* @GaussLaguerreRule.w20, i64 0, i64 0), double** %24
br label %27
25: ; preds = %19
%26 = call i32 @puts(i8* getelementptr inbounds ([43 x i8], [43 x i8]* @.str, i64 0, i64 0))
store i32 -1, i32* %7
br label %27
27: ; preds = %25, %22
br label %28
28: ; preds = %27, %16
br label %29
29: ; preds = %28, %10
%30 = load i32, i32* %7
ret i32 %30
}

LLVM IR (-O2):
@GaussLaguerreRule.x5 = internal constant [5 x double] [double 0x3FD0DE2C1A6D9D31, double 0x3FF69D4C86AEDC8C, double 0x400CC57ADFE8E452, double 0x401C57DE94035546, double 0x402948170C5AD3CD]
@GaussLaguerreRule.w5 = internal constant [5 x double] [double 0x3FE0B238D27EA545, double 0x3FD983C1CCE6951C, double 0x3FB370F6E1C2D4D0, double 0x3F6D96682D29722F, double 0x3EF8815446103D98]
@GaussLaguerreRule.x10 = internal constant [10 x double] [double 0x3FC1A33768C970C9, double 0x3FE757B111411ADF, double 0x3FFCEEF8F76EDAB9, double 0x400B3622DEDE64A3, double 0x401635C18C52F60A, double 0x4020A909C7E41380, double 0x4027B004B28537AD, double 0x4030477D70F4EBBC, double 0x4035FF203F6E1D6F, double 0x403DEBB2CCA53DC4]
@GaussLaguerreRule.w10 = internal constant [10 x double] [double 0x3FD3BD7FCE3CF5F3, double 0x3FD9ABF2EC5FBA27, double 0x3FCBE9A961CB3158, double 0x3FAFC9ED52DF0E64, double 0x3F837588055DC806, double 0x3F48ACB133884D94, double 0x3EFDA1C7BD225785, double 0x3E9C84440DFB409F, double 0x3E1F9A7DDD2BCDA1, double 0x3D716FE3E009670F]
@GaussLaguerreRule.x20 = internal constant [20 x double] [double 0x3FB20EE6F74A60C7, double 0x3FD7D0ED00520387, double 0x3FED54A3FD487771, double 0x3FFB5120A7303920, double 0x4005FE5C2DDDEEBA, double 0x401032197A3BBE90, double 0x401675F06D74AC70, double 0x401DD608ABDF3DDD, double 0x40233054431FA71E, double 0x402813DDED6C6D2E, double 0x402DA0EB11F2E47F, double 0x4031F2EAD11BF39D, double 0x40357A91DDB9BBC7, double 0x403973A2CB543FE6, double 0x403DEEBBE67CE330, double 0x404181B83693C080, double 0x40446AA19D172CF5, double 0x4047CF5BF70688B1, double 0x404BE7C827B7214F, double 0x4050A1900A54C01A]
@GaussLaguerreRule.w20 = internal constant [20 x double] [double 0x3FC5997EC5A0A7FB, double 0x3FD2A3E955E889C3, double 0x3FD1116296872233, double 0x3FC53F9181EC9519, double 0x3FB327CD0CA40E5F, double 0x3F999045AFA0D65E, double 0x3F7967D89077AA15, double 0x3F52C25200530A8D, double 0x3F2469D3A4BFC261, double 0x3EF0264AF50D987D, double 0x3EB23A6C64B64BD1, double 0x3E6C9DA992D7A69F, double 0x3E1E33AED8816084, double 0x3DC47B2DB2D35F63, double 0x3D60C635664C02D4, double 0x3CEE613FD36ADC87, double 0x3C6AA20052414DDA, double 0x3BD22CEB8FDEF44A, double 0x3B19904C92D33029, double 0x3A2A3F62E4A099FB]
@.str = [43 x i8] c"use 5, 10, 20 nodes for GaussLaguerreRule.\00"
define i32 @GaussLaguerreRule(double** nocapture writeonly %0, double** nocapture writeonly %1, i32 %2) {
switch i32 %2, label %7 [
i32 5, label %4
i32 10, label %5
i32 20, label %6
]
4: ; preds = %3
store double* getelementptr inbounds ([5 x double], [5 x double]* @GaussLaguerreRule.x5, i64 0, i64 0), double** %0
store double* getelementptr inbounds ([5 x double], [5 x double]* @GaussLaguerreRule.w5, i64 0, i64 0), double** %1
br label %9
5: ; preds = %3
store double* getelementptr inbounds ([10 x double], [10 x double]* @GaussLaguerreRule.x10, i64 0, i64 0), double** %0
store double* getelementptr inbounds ([10 x double], [10 x double]* @GaussLaguerreRule.w10, i64 0, i64 0), double** %1
br label %9
6: ; preds = %3
store double* getelementptr inbounds ([20 x double], [20 x double]* @GaussLaguerreRule.x20, i64 0, i64 0), double** %0
store double* getelementptr inbounds ([20 x double], [20 x double]* @GaussLaguerreRule.w20, i64 0, i64 0), double** %1
br label %9
7: ; preds = %3
%8 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([43 x i8], [43 x i8]* @.str, i64 0, i64 0))
br label %9
9: ; preds = %5, %7, %6, %4
%10 = phi i32 [ 0, %4 ], [ 0, %5 ], [ 0, %6 ], [ -1, %7 ]
ret i32 %10
}